VitalRecorder is a real-time vital signs recording application for Windows, Raspberry Pi, and Ubuntu. It captures data from over 80 medical devices and stores them in the .vital file format.
Download and install from the Microsoft Store:
Or download the MSI installer or MSIX package from the release page.
Download the AppImage (VitalRecorder-*-x86_64.AppImage) from the release page, mark it executable, and run it:
chmod +x VitalRecorder-*-x86_64.AppImage
./VitalRecorder-*-x86_64.AppImage
Tested on Ubuntu 22.04 and later. Works on most modern Linux distributions (Fedora, Debian 12+) without additional setup — Qt6 is bundled inside the AppImage.
For serial / USB device access (/dev/ttyUSB*, /dev/ttyACM*), add your user to the dialout group once:
sudo usermod -aG dialout $USER
Log out and back in for the group change to take effect.
For unattended server-style recording without a GUI, download the platform-specific console binary (pivr64 for Raspberry Pi ARM64 or ubuntu64 for Ubuntu x64) from the release page and run it directly.
Medtronic : BIS, Philips : Intellivue).VitalRecorder uses a tab-based interface. Each tab represents a "room" or "bed" and can have multiple devices attached.
Each tab can have a bed name assigned. This is used for:
Go to Add Device and select from the device groups:
| Group | Examples |
|---|---|
| VitalDB devices | SNUADC, SNUADCM, BUTTON, VitalBOLUS |
| Analog to digital converter | DataQ DI-149, DI-155, DI-245, DI-1100, DI-1120 |
| Patient monitor | Philips Intellivue, GE Solar/Dash/Bx50, Nihon Kohden, Mindray HL7, MEKICS |
| Multifunction monitor | Masimo Radical-7/Root, Sentec SDM |
| Anesthesia machine | Draeger Primus/Zeus/Fabius, GE Datex-Ohmeda Aisys/Avance |
| Mechanical ventilator | Maquet SERVO-i/s/U, Hamilton MR1/C2/C6/T1 |
| Drug infusor | Fresenius Agilia/Primea/PCBM, BBraun SpaceCom/HL7, Daiwha, Pion |
| Brain monitor | Medtronic BIS/VISTA/INVOS, Fresenius Conox, OBELAB NirsitON |
| Neuromuscular monitor | TwitchView, TOFScan, TOFcuff |
| Fluid infusor | Belmont FMS 2000 |
| Cardiac monitor | Edwards Hemosphere/Vigilance/EV1000/Vigileo, Getinge PulsioFlex |
| Fetal monitor | GE Corometrics 250cx |
Most devices use RS-232 serial communication via a physical COM port or USB-to-Serial adapter.
COM3).For network-connected devices. VitalRecorder can act as either a TCP client or server.
IP:PORT (e.g., 192.168.1.100:9001).2575). VitalRecorder listens and waits for the device to connect.HL7 devices (Mindray HL7, Nihon Kohden HL7GW, BBraun HL7) typically use server mode with MLLP framing.
Some devices broadcast data via UDP.
For wireless sensors such as Movesense.
When connecting TCP/UDP devices, you can append filters to the port string to selectively accept connections or messages.
PORT#KEYWORD@IP_ADDRESS
All parts except PORT are optional.
#)Filters incoming messages by searching for a keyword string within the message content. Messages that do not contain the keyword are silently discarded.
2575#BED-001
This listens on port 2575 and only processes messages containing BED-001. This is useful when a single HL7 gateway (e.g., DoseLink, Mindray Gateway) sends data for multiple beds over one connection.
@)Filters incoming TCP connections by source IP address. Connections from other IP addresses are rejected at the TCP accept stage.
[email protected]
This listens on port 2575 and only accepts connections from 192.168.100.22.
2575#[email protected]
This listens on port 2575, only accepts connections from 192.168.100.22, and only processes messages containing BED-001.
# to filter by pump serial or bed identifier.@ to distinguish which DoseLink server should connect to which VitalRecorder tab.When a single HL7 gateway (Mindray eGateway, BBraun DoseLink, Nihon Kohden HL7GW) delivers data for several beds over one TCP connection, VitalRecorder routes each frame to the correct tab automatically:
SO_REUSEADDR race that previously required a manual "Add device" click on every restart.PV1-3 bed ID (e.g. SU-1, BED-001)deviceId JSON field or the 12-byte MFER prefix~-separated MDC_ATTR_LOCATION OBX (e.g. Forskning, Bord4, Anilab, Operasjon) If multiple tabs could match the same frame (e.g. both Forskning and Bord4 tabs exist and the frame's LOCATION is Forskning~Operasjon~Bord4~Anilab~~~~~Bord4), the more specific token wins. Tokens are tried in reverse order, so Bord4 (last ~-repetition, conventionally the display short-name) beats Forskning (first repetition, a broader department label). Only one tab receives any given frame.
port#keyword syntax described above. Applied only if bed-name routing finds no match.For BBraun DoseLink specifically, one HL7 frame represents one rack (one bed); multiple pumps in the rack are carried as VMD blocks within that frame and are recorded on separate tracks (PUMP1 … PUMP16) inside the same tab.
Monitor View shows up to 8 pumps simultaneously (previously 4). Each pump slot displays the drug name and one large value:
CE + drug name (unchanged behavior).RATE (mL/h) + drug name, and the cumulative infused volume (VOL, mL) is rendered as a small grey annotation in the top-right corner of the slot.All other pump fields (pressure, concentration, dose rate, syringe volume, bolus, delivery time, patient weight, drug library, care area, etc.) are still recorded to the .vital file and visible in the default track view — only the Monitor View curates to keep the display uncluttered during running experiments.
Supported devices: BBraun SpaceCom/HL7, Fresenius Agilia/Primea/PCBM, Daiwha, Pion. No configuration required — this is the default layout.
The
minimal=1vr.conf option introduced in 1.18.29 is removed in 1.18.30: it was skipping the extra fields from the.vitalfile entirely (unrecoverable). 1.18.30's Monitor View redesign preserves all recorded data.
1.18.23 notes for non-English Windows — earlier versions were affected by a Windows C-runtime issue where infusion rates below 1.0 mL/h were recorded as 0 on locales that use
,as the decimal separator (Norwegian, German, French, etc.). VitalRecorder 1.18.23 forces numeric parsing to always accept.as the decimal separator, regardless of Windows regional settings. BBraun pump limit was also raised from 8 to 16 pumps per device.
By default, VitalRecorder starts recording automatically when it launches (RECORD_WHEN_START setting).
Recordings are saved as .vital files, a compressed binary format with track-based organization.
Configure the save directory in Settings. The default is the user's Documents folder.
The filename is generated from a template. Default: %r_%y%m%d_%h%i%s
| Code | Meaning |
|---|---|
%r | Room/bed name |
%y | Year (4 digits) |
%m | Month (2 digits) |
%d | Day (2 digits) |
%h | Hour (2 digits) |
%i | Minute (2 digits) |
%s | Second (2 digits) |
VitalRecorder can upload data in real-time to a VitalServer instance via WebSocket.
| Setting | Description |
|---|---|
SERVER_IP | VitalServer IP address or hostname |
SEND_WEB | Enable/disable server upload (1 or 0) |
CLOUD_UPLOAD | Enable/disable cloud upload (1 or 0) |
VRCODE | Unique identifier for this VitalRecorder instance |
Data is compressed with zlib before upload.
When the HL7 setting is enabled, VitalRecorder sends room data in HL7 format instead of JSON.
VitalRecorder stores all settings in a single configuration file called vr.conf. This file uses an INI-like format and can be edited manually for headless deployments or batch provisioning.
| Platform | Path |
|---|---|
| Windows | %APPDATA%\VitalRecorder\vr.conf |
| Linux | ./vr.conf > ~/vr.conf > /boot/vr.conf (searched in order) |
--conf <path> to specify an alternate configuration file.# Global settings (before any section)
KEY=VALUE
# Bed (tab) definition
[BED/bedname]
# Device under this bed
[DEV/devicename]
type=DeviceType
port=PortSpec
# Filter under this bed
[FILT/filter_module_name]
Rules:
KEY=VALUE pair per line.[.[DEV/...] and [FILT/...] sections belong to the preceding [BED/...].[BED/...] can contain multiple devices and filters.| Key | Default | Description |
|---|---|---|
SAVEDIR | (system default) | Recording file save directory |
VRCODE | (auto-generated) | Unique VitalRecorder identification code |
DEBUG | 0 | Debug mode (0: off, 1: on) |
FILENAME_TEMPLATE | %r_%y%m%d_%h%i%s | Recording filename template |
| Key | Default | Description |
|---|---|---|
RECORD_WHEN_START | 1 | Auto-record on launch (0: off, 1: on) |
CUT_FILE | 1 | Split file at patient boundaries (0: off, 1: on) |
CUT_HOURLY | 0 | Split file every hour (0: off, 1: on) |
CUT_BY | (none) | Signal for file split trigger (e.g., spo2, hr, any) |
PT_WAITING_TIME | 5 | Patient waiting time in minutes |
| Key | Default | Description |
|---|---|---|
SERVER_IP | (none) | VitalDB server address (IP:port) |
UPLOAD_SERVER_IP | (none) | File upload server address |
MONITOR_SERVER_IP | (none) | Web monitoring server address |
SEND_WEB | 1 | Send data to web server (0: off, 1: on) |
CLOUD_UPLOAD | 0 | Enable cloud upload (0: off, 1: on) |
| Key | Default | Description |
|---|---|---|
START_MAXIMIZED | 1 | Start maximized |
START_MINIMIZED | 0 | Start minimized |
OPTION_MIN_TO_TRAY | 0 | Minimize to system tray |
OPTION_ALWAYS_ON_TOP | 0 | Always on top |
PLAY_SOUND | 1 | Play alarm sounds |
Up to 30 event preset labels can be defined with EVT_TEXT_0 through EVT_TEXT_29.
EVT_TEXT_0=Induction
EVT_TEXT_1=Intubation
EVT_TEXT_2=Incision
Defines a bed (tab). Multiple beds can be defined in a single configuration file.
[BED/OR1]
BED/ (e.g., OR1, ICU_BED3).Devices are added under a [BED/...] section.
[DEV/devicename]
type=DeviceType
port=PortSpec
| Key | Required | Description |
|---|---|---|
type | Yes | Device type (e.g., BIS, Intellivue, Solar8000) |
port | Yes | Connection port (see Port Formats below) |
company | No | Manufacturer (e.g., Nihon Kohden) |
readonly | No | Read-only mode (0: off, 1: on) |
| Format | Example | Description |
|---|---|---|
| COM port | COM1, COM3 | Windows serial port |
| TCP/IP | 192.168.1.100:4343 | Network device (IP:port) |
| Port number | 4343 | TCP server mode on localhost |
| RPi serial | F1-F4 | Raspberry Pi AMA ports |
| RPi USB | LU, LU1-LU4 | USB Left Upper |
| RPi USB | RU, RU1-RU4 | USB Right Upper |
The port value supports keyword and IP filters (same syntax as described in Port Filtering):
port=PORT#keyword1 keyword2#keyword3@IP_SUFFIX
For ADC (Analog-to-Digital Converter) devices, additional per-channel settings are available:
| Key | Description |
|---|---|
srate | Sampling rate in Hz |
parname1, parname2, ... | Parameter name for each channel |
gain1, gain2, ... | Voltage-to-physical-unit conversion gain for each channel |
[DEV/SNUADC]
type=SNUADC
port=COM3
srate=500
parname1=ECG
gain1=1.0
parname2=ART
gain2=100.0
Devices that use the Datex DRI protocol (S5, Solar8000, Bx50, B1x5M, Canvas) support per-device options to choose which waveforms are requested from the monitor.
| Key | Description |
|---|---|
wavs | Comma-separated list of waveforms to request (up to 8) |
waveonly | 1 = waveforms only, no numeric values; 0 = both (default) |
Available waveform names: ECG1, ECG2, PLETH (alias PPG), CO2, O2, N2O, AWP, IABP1–IABP8, EEG1, EEG2, EEGBIS, EEGENT, EEGENT400.
Invasive arterial pressure (ART) waveform: Use
IABP1—ARTandINVP1are not recognized. The first invasive pressure channel (commonly labeled ART on the monitor screen) is mapped toIABP1.
Default waveforms when wavs is not set:
| Device | Default waveforms |
|---|---|
B1x5M (B105M / B115M / B125M) | ECG1, PLETH only — the B1x5M family cannot keep up with the full S5 stream, so the default is intentionally reduced |
| All other S5 / Solar8000 / Bx50 / Canvas | ECG1, PLETH, IABP1, CO2, AWP |
If you need additional waveforms on a B1x5M (e.g., invasive arterial pressure), list them explicitly:
[DEV/B1x5M]
type=B1x5M
port=LU
wavs=ECG1,PLETH,IABP1,CO2,AWP
Adds a real-time signal processing filter. Filter definitions are loaded from the filter server.
[FILT/filter_module_name]
modname of a filter registered on the server.Adding filters via the GUI — Open a bed's Filters menu and choose Add. The dialog lists all filters available on the local Python filter server. From 1.18.37 onward this is a slim Python 3.11 runtime (~27 MB) that VitalRecorder downloads automatically on first use, replacing the older pyvital-based 121 MB bundle. Basic ECG / PPG / EEG filters (HRV, MTWA, QRS detection, FFT, etc.) are pre-installed and work immediately. Filters that require deep-learning runtimes (HPI, beat noise detector, rhythm classifier, dlapco SV) are gated behind an Install ML filters button — clicking it silently runs pip install openvital[all] (no command-prompt window appears) and pulls PyTorch / TensorFlow only when needed. Restart VitalRecorder after the install completes for the new filters to appear.
SAVEDIR=D:\VitalData
[BED/OR1]
[DEV/Solar8000]
type=Solar8000
port=COM1
SAVEDIR=D:\VitalData
VRCODE=OR1_PC
[BED/OR1]
[DEV/Intellivue]
type=Intellivue
port=192.168.1.100:4343
[DEV/BIS]
type=BIS
port=COM3
[DEV/Primus]
type=Primus
port=COM4
SAVEDIR=D:\VitalData
[BED/OR1]
[DEV/Solar8000]
type=Solar8000
port=COM1
[BED/OR2]
[DEV/Philips]
type=Intellivue
port=192.168.1.101:4343
SAVEDIR=C:\Users\lucid\Desktop
DEBUG=1
[BED/test]
[DEV/NK EGA]
type=EGA
company=Nihon Kohden
port=9001
[BED/OR1]
[DEV/Solar8000]
type=Solar8000
port=COM1
[FILT/pleth_spi]
vital.exe [options] [filename]
| Option | Description |
|---|---|
--version, -v | Show version number |
--devtypes, -d | List all supported device types |
--console, -c | Run in console mode (no GUI) |
--demo | Run in console mode with a demo device |
--upgrade, -u | Upgrade to the latest version |
-u1.18.0 | Upgrade to a specific version |
--help, -h | Show help |
filename.vital | Open a .vital file for playback |
Console mode (--console or -c) runs VitalRecorder without the GUI. This is useful for headless deployments on Raspberry Pi or Ubuntu servers. Devices are loaded from the saved configuration.
Enable the DEBUG setting to log raw protocol data to the .vital file. This is useful for troubleshooting device communication issues.
For the complete list of supported devices with connection details and parameters, see Supported Devices.
| Device | Connection | Port Setting |
|---|---|---|
| Philips Intellivue | RS-232 | COM port, 115200 baud |
| GE Solar 8000 | RS-232 | COM port, 9600 baud |
| Nihon Kohden (Serial) | RS-232 | COM port, 9600 baud |
| Nihon Kohden (HL7GW) | TCP Server | Port 9001 |
| Nihon Kohden (EGA) | UDP | Port number |
| Mindray (HL7) | TCP Server | Port 10000 |
| Draeger (Medibus) | RS-232 | COM port, 9600 baud (8N2) |
| GE Datex-Ohmeda | RS-232 | COM port, 19200 baud (7E1) |
| Medtronic BIS | RS-232 | COM port, 57600 baud |
| BBraun SpaceCom | RS-232 | COM port, 9600 baud |
| BBraun HL7 (DoseLink) | TCP Server | Port 2575 |
| Masimo Radical-7 | RS-232 | COM port, 9600 baud |
| Edwards Hemosphere | RS-232 | COM port, 9600 baud |
| Hamilton ventilator | RS-232 | COM port, 38400 baud |
ping test).DEBUG mode and check the raw data log to verify communication.For HL7 devices sharing a single gateway port, use the Port Filtering feature with # keyword to separate beds.
BBraun DoseLink sends data for multiple pumps over a single TCP connection. VitalRecorder automatically identifies each pump using the serial number in OBX-18 (Equipment Instance Identifier) and maps them to PUMP1 through PUMP8.
If pumps are not being separated correctly:
DEBUG mode and capture a .vital file.# keyword filter if needed.SERVER_IP is set correctly.SEND_WEB is set to 1.