Repository navigation
Releases: Pappet/harux
Release list
v0.5.0 — UI Redesign
v0.5.0 — UI Redesign
Visual + IA refactor of the entire frontend (CLAUDE_CODE_HANDOFF.md, items 1–14, plus the chrome-cleanup follow-up). Six numbered phases shipped between #87 and #103 plus a chrome-cleanup pass in #105. Two perf wins (#102 parser allocations, #100 frontend search filter) round out the release. No protocol, API, or storage changes.
Highlights
UI Redesign (Phases 1–6)
- Phase 1 — Typography + colors (#87) — Inter (sans) and JetBrains Mono (mono) via Google Fonts; refreshed dark palette with deeper backgrounds and a cooler accent.
- Phase 2 — Top-bar health pills (#93) — replaced the dot-and-counter
.stats-barwithlistening :PORT,conns N/MAX,rate N/min+ 60-second sparkline,last Ns ago,errors N. - Phase 3 — Two-line message rows + time grouping + ACK chips (#95) — dropped the dense 9-column grid; rows now scan as
[type] [patient] [validation] [tags] [ACK]over[facility · source · N segs · time]. Sticky time buckets (Live,Last few minutes,Earlier today,Yesterday,MMM D). Colored ACK chips (AAgreen,AEred,ARamber,nonemuted). 1-second tick refreshes relative time labels in place. - Phase 4 — Source rail + throughput band (#97) — always-visible source chip rail with per-source counts; 60-bar histogram band with
total / per min / warnings / errorscounters. (The throughput band is removed in #105 — see below — its sparkline lives inside theratehealth pill instead.) - Phase 5 — Detail panel restructure (#99) — type chip + human title; description + monospace metadata row; type+icon Bookmark / Pin diff actions; larger tabs with segment count badge + right-aligned
Diff vs pinned; typical-segments checklist with✓ ⚠ ✕symbols; collapsible validation summary banner; field rows with inline description +tr.warnrows tinted amber withrequiredchip. - Phase 6 — Empty state + polish pass (#103) —
.empty-cardwith listening port + copy-able CLI snippet;Cmd/Ctrl+Kfocuses the filter; tag chips become pills; emoji glyphs replaced with lucide-style outline SVGs.
Chrome cleanup (#105)
- List-scoped controls (
Pause,Auto,Bookmarks, validation filter) move into a new.inbox-controlsrow beneath the search bar. - Topbar gains
total,validation,parse errorspills (the previouserrorspill is renamedparse errorsto disambiguate from validation errors). - The standalone throughput band is removed — the sparkline lives in the
ratehealth pill.
Accessibility
- Row keyboard navigation with
Tab/Enter/Space(#88). - ARIA labels + native
<button>for bookmark/pin (#91). - Global
:focus-visibleoutline. Cmd/Ctrl+Kshortcut for the filter input.
Performance
- HL7 parser (#102) — eliminated multiple redundant
Vecallocations inparse_messageandparse_segment. - Frontend search filter (#100/#104) — memoized parsed query (
getParsedQuery) with bounded cache; per-message field checks short-circuit and skip lowercasing on empty fields.
Upgrade notes
- Drop-in replacement for v0.4.0. Same MLLP protocol, same HTTP API, same WebSocket events, same on-disk format (none).
- Session keys (
harux_session,_state) are preserved with the same semantics. - The frontend is still vanilla JS — no build step, no npm.
Binaries
The Build & Release workflow will attach Windows harux.exe, macOS Apple Silicon harux-macos-apple-silicon, and Linux harux-linux binaries to this release once it builds on each runner.
Full diff: v0.4.0...v0.5.0
v0.4.0 – Message Analysis
v0.4.0 – Message Analysis
Completes Milestone 3. HL7 Forge now understands the content of your messages — not just the structure.
🔍 What's New
HL7 Field Dictionary
Hover over any field in the detail view to see its official HL7 v2.5.1 name and description (e.g. "PID-5: Patient Name"). The full dictionary is compiled into the binary — zero external dependencies, zero latency. (#48)
Message Type Detection & Typical Segments
The detail header now shows a human-readable type description (e.g. "Admit / Visit Notification") and a colour-coded Typical Segments bar showing at a glance which expected segments are present, absent, or missing. (#45, #50)
Validation Engine
A rule-based validator checks required MSH fields and message-type-specific segments for ADT, ORU, ORM, OML, SIU, and MDM messages.
Violations are surfaced as severity-coded badges:
- 🟡 Amber — required field missing
- 🔴 Red — required segment missing
- 🔵 Blue — invalid data type (NM/DT/TS/SI)
A header button cycles the message list through All → Warnings Only → Errors Only, and the search bar accepts has:warnings / has:errors prefixes. (#46, #51, #60, #62)
Segment Diff
Pin any message as a reference with the ◎ button, then open the Diff tab on another message for a field-level side-by-side comparison with red/green highlighting. A toggle hides dynamic fields (MSH-7, MSH-10) to focus on meaningful differences. (#47, #52, #61)
Quick Copy to Clipboard
Three copy targets, no extra clicks:
- Hover a segment header → 📋 icon copies the raw segment line
- Click any field value cell → copies value with a green flash
- Raw tab → 📋 Copy All button copies the full message text
(#63)
🐛 Bug Fixes
- Consistent
YYYY-MM-DD HH:mm:ssdate display in message list (#55) - No layout shift when selecting a message row (#56)
- Removed duplicate
.theme-toggleCSS block (#57) - Added missing
.msg-ackstyling (#58) - Pin button now highlights in blue, not yellow (#59)
- Diff table columns no longer stretch unevenly (#67)
INVALID_DATATYPEwarnings no longer incorrectly turn segment badges amber
Full Changelog: v0.3.0...v0.4.0
v0.3.0 – Multi-User Experience
What's New
This release completes Milestone 1 (Team-Ready Server) and Milestone 2 (Multi-User Experience) — HL7 Forge is now fully multi-user capable and production-configurable.
Milestone 1 — Team-Ready Server
Configuration file (hl7-forge.toml) — configure ports, memory limits, MLLP timeouts, log level, and max message size without recompilation. Load order: config file → environment variables → built-in defaults. (#13)
Rotating file logging — persistent log files with automatic rotation for operational monitoring and audit. (#15)
Graceful shutdown — active MLLP connections are cleanly drained on Ctrl+C or service stop before the process exits. (#7)
Connection limits — configurable max_connections (default 100) via TOML; rejected connections are counted and exposed at /api/stats. (#6)
Milestone 2 — Multi-User Experience
Session-based views — each developer maintains their own filter configuration, active tab, and scroll position, independent of all other users, via sessionStorage. (#24)
Color-coded source markers — each sender IP gets a distinct color dot in the message list. Toggle between "Color by IP" and "Color by Port" modes. A source legend appears alongside the list. (#25)
Custom text tags — manually tag messages (e.g., Bug #1234, Test scenario A) for attribution during shared use. Tags are filterable via search and synchronized across all connected clients in real time. (#26)
Bookmark / pin messages — star any message to pin it. Bookmarked messages are eviction-protected — they will not be removed when the store reaches its memory limit. Bookmark state syncs across browser tabs via WebSocket. (#27)
Resizable panel splitter — drag the border between the message list and detail panel to any width. Double-click to reset to default. Width persists across sessions via localStorage. (#4)
WebSocket exponential backoff — on disconnect, the client retries with exponential backoff (1 s → 2 s → 4 s → … → 60 s cap) and ±25% jitter to prevent thundering herd reconnections. The status bar shows a live countdown. (#12)
ACK viewer — sent ACK/NACK messages (AA, AE, AR) are stored and viewable in a dedicated "ACK" tab on message detail. (#19)
Bug Fixes
Stored XSS fix — segment data in the parsed view is now HTML-escaped and inline onclick handlers have been removed. (#20)
Testing
MSH field indexing regression tests — regression test suite for the MSH +1 offset quirk, preventing silent corruption of all MSH field extractions. (#11)
Upgrading from v0.2.0
No breaking changes. Drop the new binary in place of the old one.
Optionally add an hl7-forge.toml next to the binary to configure ports, memory limits, and log level — see the example file included in the source.
Downloads
Pre-built binaries for Windows, macOS (Apple Silicon), and Linux are attached below.
Full Changelog: v0.2.0...v0.3.0
v0.2.0 – Stabilization & Robustness
What's new
Fixes & Stabilization
- ACK storm prevention — Incoming ACK messages are stored but never ACK'd back. Prevents infinite ping-pong loops with Orchestra.
- Size-based store eviction — New primary limit: 512 MB (
MAX_STORE_BYTES). Secondary limit: 10,000 messages. Both triggers are independent and evict the oldest 10% each. Protects against OOM with MDM messages containing Base64 attachments. - Search debounce (300 ms) — Search input is debounced to prevent future lock contention on
/api/search.
Features
- Failed messages are stored — Parse errors no longer discard the message; it appears in the UI with a
⚠ PARSE ERRORmarker. - UI batching (250 ms) — DOM updates are batched to prevent freezing at high message rates.
- ⏸ Pause / ▶ Live — New button buffers incoming messages without displaying them.
- Static assets split —
index.html,style.css,app.jsare now separate embedded files.
Documentation
CLAUDE.mdandAGENTS.mdextended with architecture details, deployment context, and mandatory changelog workflowROADMAP.md,MILESTONES.md,CHANGELOG.md, and all test scripts fully translated to English
Binaries are attached automatically by CI.
v0.1.0 – Initial Release
HL7 Forge v0.1.0
First stable release of HL7 Forge — a high-performance HL7 v2.x MLLP server with a real-time browser-based UI, built in Rust.
Features
- MLLP Server — Receives HL7 v2.x messages with correct MLLP framing (VT/FS/CR), responds with ACK/NACK
- Real-time Web UI — Browser-based SPA with WebSocket push updates, no installation required
- Message Views — Parsed segments, raw text, and JSON per message
- Search & Filter — By message type, patient name/ID, facility, control ID
- JSON Export — Export individual messages as JSON
- Single Binary — No runtime dependencies, frontend embedded via rust-embed
Stability & Security
- Message store uses
VecDequefor O(1) eviction instead of O(N)Vec::drain - MLLP connection buffer hard-limited to 10 MB to prevent OOM from malformed clients
- Read/write timeouts (60 s / 30 s) on all MLLP socket operations
- MSH field indices aligned with HL7 standard 1-based numbering
- Graceful shutdown on Ctrl+C — MLLP and web server drain cleanly before exit
Downloads
| Platform | File |
|---|---|
| Windows | hl7-forge.exe |
| macOS Apple Silicon (M1/M2/M3) | hl7-forge-macos-apple-silicon |
| Linux (x86_64) | hl7-forge-linux |
macOS: After download run
chmod +x hl7-forge-macos-apple-silicon && xattr -d com.apple.quarantine ./hl7-forge-macos-apple-siliconbefore starting.
See the README for quick start, Windows service setup, and API reference.