HL7 Message Comparison
Find what changed between two messages. Compare their encoded fields and components, follow differences back to each message, and keep your input on your device.
One message per side · UTF-8 files · 1 MiB per message · Ctrl / ⌘ + Enter to compare
Processed locally in this tab. Files are read without being uploaded. Input is not saved by this site. Data handling
Reports contain encoded message values. Review them before sharing.
What changed?
Load the synthetic examples or add one message to each side.
Examples are synthetic. Clear both removes input and results from this page.
Workspace 0.4.0 · Free without an account
Understand the comparison
What does this tool compare?
Encoded segments, fields, repetitions, components, and subcomponents. Missing values, present empty values, and the explicit null token "" are distinct. The overview shows fields and segments; select every changed location for nested differences. Counts include changed parent values and their nested locations. Filters affect the on-screen list; exports always contain the complete difference report.
Each side uses its declared separators. Delimiter changes are called out explicitly. Escape sequences stay encoded; this tool does not decode escapes, determine clinical meaning, or validate conformance.
How are segments matched?
When ordered segment names match within a run, segments are paired by position and occurrence. This does not establish that two observations or order groups represent the same entity. When structure differs, names appearing exactly once in each complete message can serve as anchors only if their order is consistent. Runs between anchors are paired by position only if their ordered names and lengths agree.
Other nonempty mismatched runs remain unmatched with uncertain correspondence. They are not proven additions or removals. Empty opposite runs establish a left-only or right-only location under this alignment policy. No identifier or matching-value heuristic silently pairs repeated segments. All source segments remain represented.
Files, limits, and reports
Open or drop one UTF-8 message file per side. Invalid UTF-8 is rejected. CR, LF, CRLF, one MLLP frame, and a leading Unicode byte-order mark are supported by the parser. Normalized views remove framing and blank lines; field whitespace and encoded values remain intact. Each input is limited to 1 MiB, 2,000 segments, and 50,000 structural parts. Comparison also limits each segment to 1,024 fields and applies a combined field-lookup work budget before expanding values. It is bounded to 50,000 changed locations; the plain-text report is limited to 8 MiB. Exceeding a processing or report limit produces an explicit error rather than an incomplete result.
Large normalized messages use a labeled source excerpt that moves when you select a location. Very large selected values show their beginning and end with a preview-gap label. Original inputs retain complete messages; the report includes full encoded values for the most specific changed locations. These display limits keep the workspace responsive.
The local text report quotes encoded leaf values and lists nested changes beneath parent locations. It excludes source filenames. Reports can contain sensitive message values; save or share them deliberately. Opening a file does not store it on this site, and optional analytics excludes message contents, filenames, addresses, and filter text.
Can I compare a batch or ignore timestamps?
This release compares exactly one message on each side. Batches and multiple messages are rejected. Fields are not silently ignored. Reusable interface definitions, explicit exclusions, and batch regression workflows are future candidates.