HL7Forge logoHL7Forge / guide

The HL7Forge User Guide

Every feature in the app, demonstrated live. Each animation below is a faithful recreation of the real interface — what you see here is what you get.

01The layout

One window, five working areas. The side panels collapse with a click (and slide smoothly out of the way), and every divider drags to resize.

1 2 3 4 5
⚙ Settings⇄ Routing≋ Transforms 📂 Load💾 Save⚡ CSV Gen
Admit Patientlab_results.hl7
Connection
localhost
2575
Built-in Templates
ADT A01 Admit Patient
ORU R01 Lab Result
Activity Log
8:03:39→ OUTADT^A01
8:03:39← INACK AA
ADT^A01 readyRepeat: 1×Send Current
1Titlebar — settings, routing, transforms, file open/save, CSV generator
2Sidebar — connection, receiver, saved endpoints, templates
3Editor — message tabs on top, view tabs (Raw / Field / Parsed / Stats / Query / Compare) inside
4Activity log — every send, ACK, and event; click a row for full detail
5Send bar — repeat count, delay, load test, and the Send button

02Create a message

Never start from a blank page. Pick any of the built-in templates — ADT, ORU, ORM, SIU, MDM, MFN, DFT, VXU, RDE, OML, REF, ACK — and a realistic, valid message opens in a new tab, ready to edit or send.

Ready
Admit Patient
Built-in Templates
ADT A01 Admit Patient
ADT A03 Discharge Patient
ORU R01 Lab Result
SIU S12 Schedule Appointment
ORM O01 Order Message
ADT^A01 ready
Every template generates fresh identifiers each time — new control ID, new patient — so repeated test messages don't collide. Hit New ID in the toolbar to re-roll the control ID on any message.

03Endpoints & connection

Point HL7Forge at any listener: hostname or IP, port, and transport (MLLP or raw TCP). Test the connection, then save it as a named endpoint you can recall from the dropdown.

  1. Enter Host / IP and Port in the sidebar.
  2. Pick a transport — MLLP (standard HL7) or raw TCP.
  3. Click Test Connection — the titlebar LED turns green on success.
  4. Type a name and Save — the endpoint is now one click away, on every machine restart.
Not connected
Saved Endpoints
-- select --
Connection
 
 
MLLP (standard HL7)
Test Connection Save
Configure the connection on the left…
Idle
Receiver too. The sidebar's Receiver section starts an MLLP listener on any port — HL7Forge answers with configurable ACKs (AA, AE, AR…) so you can test the sending side of an interface as well.

04Send & receive

Send the current message with one click and watch the full round trip in the activity log — outbound message, returning ACK, and timing. Flip on the listener and inbound messages appear the same way.

Connected — 10.10.10.10:2575
Activity Log
ORU^R01 readyRepeat: 1×Send Current
Set Repeat to 5×/10×/50×/100× with a millisecond delay to fire the same message repeatedly — handy for queue-draining tests without a full load test.

05Working with files

Load whole HL7 files — thousands of messages stream in with progress, and files with embedded documents (base64 PDFs/RTFs, even tens of MB) open safely. Step through messages one at a time, or send the entire batch.

lab_results.hl7
Activity Log
‹ Prev Message 1 of 250 Next › Send All (250)
250 messages loaded
Huge messages are handled. Fields over 20,000 characters (embedded documents) display truncated with a marker — the full content is always kept intact for sending and saving. Messages carrying an embedded PDF/RTF get a banner with an Open / Download button to extract the document.

06The three editing views

Raw HL7 for speed, Field Editor for precision, Parsed View for reading. All three stay in sync — click a field in one and the others follow.

Raw HL7 — click to identify, hover to inspect

Click anywhere and the status bar names the exact field. Hovering shows a tooltip with the field ID, name, value, and — for coded fields — the plain-English meaning from the HL7 tables.

Raw HL7Field EditorParsed ViewStatisticsQueryCompare
PID.8 — Sex
= "F" → Female
Click anywhere in the message to identify the field

Field Editor — every field, labelled and editable

Raw HL7Field EditorParsed ViewQuery
PID — 8/30 fields populated
Fields with components (like PID.5 name) expand with ▶ into per-component rows — surname, given name, middle — each editable on its own. Length counters warn when a value exceeds the HL7 maximum for that field.

07Split screen

Split the editor horizontally and give each pane its own view tab — Raw HL7 on top, Field Editor below is the classic combo. Edits in either pane update the other instantly. Drag the divider to resize.

Admit Patient — split view
Raw HL7Field EditorParsed ViewQuery
Raw HL7Field EditorParsed ViewQuery
FieldNameValue
PID.5.1 — Family Name2 panes

08Find & replace

Find highlights every match as you type; Replace works on the current message, the whole loaded file, or — surgical option — only within one segment type across every message in the batch.

Find   Replace   Replace All
Ctrl+F opens Find

09Validate

One click checks required fields, coded values, timestamp formats, segment names, and cross-segment structure. Problems are listed and highlighted red, right where they live in the raw view. Add your own rules — mandatory fields, patterns, lengths — for vendor-specific profiles.

Admit PatientValidate ▾New IDAnonymizeExplainFind
Run Validate to check this message…
PID.7 Date of Birth 20390312 is in the future
PV1.2 value "Q" is not a valid HL7 code (valid: E,I,O,P,R,B,C,N,U)

10Anonymize

Strip PHI before sharing a message with a vendor or colleague: names, MRNs, dates of birth, addresses, phone numbers, next-of-kin, attending doctors. Choose exactly which fields, supply fixed values or let HL7Forge randomize, and save the combination as a preset. Changed fields flash and fade so you can see precisely what was touched.

Admit Patient✓ PHI stripped — safe to shareValidate ▾New IDAnonymizeExplainFind
ADT^A01 — 5 segments
Tick Anonymize all messages in file to process an entire loaded batch at once, and open results in a new tab to keep the originals untouched.

11Explain

Hand any message to a non-HL7 person. Explain opens a plain-English window: what the message is, who sent it, the patient, the visit, and every result — with abnormal values flagged.

Lab ResultValidate ▾New IDAnonymizeExplainFind
Message Explanation
ORU^R01 — 6 segments

12Compare

Put two messages side by side and see exactly what differs, line by line. Send any message to slot A or B from its right-click menu, or paste directly — perfect for "why did this one fail when that one worked?".

Raw HL7Field EditorParsed ViewStatisticsQueryCompare
Message A — working
Message B — rejected
Comparing…

13Query

Search every loaded message by field value — equals, contains, comparisons, combined with AND. Matches land in a table you can open as a new batch or export to CSV.

QUERY
 
Run Export CSV
#MSH.9PID.5 — PatientOBX.3 — TestOBX.5OBX.8
Query runs across every loaded message

14Statistics & gap analysis

The Statistics tab profiles a whole batch: which fields are used, with what values, how often. The Gap Report goes further — it starts with a message-type breakdown, then walks the segments in message order showing every defined field's fill rate, including the ones that are never populated.

Field Gap Report — 250 messages
Message Types — MSH.9
ADT^A01
96
ORU^R01
87
ADT^A08
41
MSH — 250 occurrences · 0 gaps
MSH.7 Time
100%
PID — 250 occurrences · 2 gaps
PID.5 Name
100%
PID.11 Addr
74%
PID.13 Phone
41%
PID.19 SSN
0%
2 fields defined but never populatedGaps only⬇ CSVClose
Segments appear in message order — MSH first, then EVN, PID, PV1… exactly as they run in your real traffic. Fields at 0% are your gaps: defined by the standard, promised by the vendor, never actually sent.

15Routing rules

Turn HL7Forge into a mini interface engine. Inbound messages are evaluated against your rules top-to-bottom — first match wins — and forwarded to any MLLP endpoint, logged, or dropped.

Message Routing Rules
Evaluated top-to-bottom · first matching rule wins
#OnNameConditionActionDestination
+ Add RuleClose

16CSV generator

Need 500 test patients? Point the CSV generator at a spreadsheet — one row per message, columns mapped to HL7 fields — pick a base template, and generate the whole batch in seconds.

Generate Messages from CSV
CSV file
patients_q3.csv — 250 rows
Base template
ADT^A01 — Admit Patient
Mapping
first_name → PID.5.2 · surname → PID.5.1 · mrn → PID.3 · dob → PID.7
⚡ Generate
Ready

17Load testing

Rate-based load with live results: pick messages per second and duration, and watch throughput, ACK counts, and latency percentiles update as the run progresses.

Load Test — 10.10.10.10:2575
Progress
Sent
0
ACK AA
0
Errors
0
— msg/s
Latency percentiles
p50
p95
p99
Rate: 50 msg/s · Duration: 10 s▶ Run

18Transforms & auto-responder

Two quiet workhorses. Transforms rewrite fields on every outgoing message — swap the sending facility, stamp a test flag — without touching your saved files. The auto-responder answers inbound messages with rule-based ACKs (accept ADTs, reject ORMs, delay responses) to simulate the system on the other end.

Outgoing transformMSH.4 → "TESTFAC" · PID.19 → clear
Transforms apply on send — files on disk are never modified

19Activity log

Everything that happens lands here with a timestamp. Click any row for the full sent message and ACK; resend a past message with ↺; export the lot to a text file for a ticket or handover.

Activity LogExportClear
TimeDirMessageACK
Click a row for full message detail

20Themes & text size

Nine themes from deep dark to bright light, an intensity slider to push any theme brighter or more vivid, and three text sizes. Watch it live:

Dark Blue Dark Green Light Blue Slate
Theme previewTheme: Dark Blue
Settings → Appearance · themes apply instantly, no restart

21Shortcuts & tips

Ctrl+FFind (and replace) in the current message or batch
Ctrl+Z / Ctrl+YUndo / redo edits
Click in Raw viewIdentify the field under the cursor in the status bar — and highlight it in the other views
Hover in Raw viewTooltip with field name, value, and coded-value meaning
Right-click in Raw viewCopy field/segment, send to Compare A/B, filter Statistics by this value
Drag panel edgesResize sidebar, activity log, and split panes; ‹‹ / ›› buttons collapse them entirely
Offline machines? Enterprise licences support fully offline activation — the Licence screen shows a Computer ID you send to support, and the signed key that comes back activates without any network access.
Stuck? Email [email protected] — include the relevant Activity Log export and we can usually see exactly what happened.