Skip to content

Releases: Pappet/harux

v0.5.0 — UI Redesign

Choose a tag to compare

@Pappet Pappet released this 08 May 20:37
8124bd1

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-bar with listening :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 (AA green, AE red, AR amber, none muted). 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 / errors counters. (The throughput band is removed in #105 — see below — its sparkline lives inside the rate health 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.warn rows tinted amber with required chip.
  • Phase 6 — Empty state + polish pass (#103) — .empty-card with listening port + copy-able CLI snippet; Cmd/Ctrl+K focuses 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-controls row beneath the search bar.
  • Topbar gains total, validation, parse errors pills (the previous errors pill is renamed parse errors to disambiguate from validation errors).
  • The standalone throughput band is removed — the sparkline lives in the rate health pill.

Accessibility

  • Row keyboard navigation with Tab / Enter / Space (#88).
  • ARIA labels + native <button> for bookmark/pin (#91).
  • Global :focus-visible outline.
  • Cmd/Ctrl+K shortcut for the filter input.

Performance

  • HL7 parser (#102) — eliminated multiple redundant Vec allocations in parse_message and parse_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

Choose a tag to compare

@github-actions github-actions released this 08 Mar 21:17

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:ss date display in message list (#55)
  • No layout shift when selecting a message row (#56)
  • Removed duplicate .theme-toggle CSS block (#57)
  • Added missing .msg-ack styling (#58)
  • Pin button now highlights in blue, not yellow (#59)
  • Diff table columns no longer stretch unevenly (#67)
  • INVALID_DATATYPE warnings no longer incorrectly turn segment badges amber

Full Changelog: v0.3.0...v0.4.0

v0.3.0 – Multi-User Experience

Choose a tag to compare

@github-actions github-actions released this 07 Mar 21:21
74ece14

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

Choose a tag to compare

@Pappet Pappet released this 21 Feb 01:24

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 ERROR marker.
  • 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.js are now separate embedded files.

Documentation

  • CLAUDE.md and AGENTS.md extended with architecture details, deployment context, and mandatory changelog workflow
  • ROADMAP.md, MILESTONES.md, CHANGELOG.md, and all test scripts fully translated to English

Binaries are attached automatically by CI.

v0.1.0 – Initial Release

Pre-release

Choose a tag to compare

@Pappet Pappet released this 20 Feb 19:51

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 VecDeque for 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-silicon before starting.

See the README for quick start, Windows service setup, and API reference.