Skip to content
Emon.
All work

Case study 03

Desktop apps at the edge: router, viewer and lab bridge

Three Tauri 2 apps with Rust cores and React UIs that run on the PC beside the equipment: a DICOM router, a native image viewer, and a lab-instrument bridge with WASM plug-ins.

releases across three apps
105
releases across three apps
lab results captured since Jun 2026
25,000+
lab results captured since Jun 2026
labs live in the last 30 days
8
labs live in the last 30 days

Problem

Imaging and lab equipment sits next to whatever PC the site owns. Studies have to reach the cloud over shaky links, radiologists wanted a fast native viewer instead of an old Java one, and labs were re-typing results from analyzers that each speak their own ASTM or HL7 dialect.

Constraints

  • Runs on Windows and Linux, on hardware nobody chose for it.
  • Updates arrive silently and never interrupt work.
  • Adding a device must not need a new release of the whole app.
  • Nothing is dropped when the link goes down, and results are never silently mangled.

What I built and led

  • A lab-instrument bridge (Tauri 2, 59 releases): serial and TCP links, device parsers compiled to WebAssembly and loaded as plug-ins, 17 bidirectional order modules, QC, licensing, data retention and result charts.
  • A DICOM router (Rust core + React UI, 35 releases): DIMSE SCP/SCU, rule-based routing, a persistent store-and-forward queue, 5 image codecs including JPEG-XL, HTTP forwarding and study previews in Cornerstone3D.
  • A native DICOM viewer (Tauri 2, 11 releases since Sep 2026) on Cornerstone3D, with deep links and global shortcuts, replacing a Java/OSGi workstation.
  • Shared desktop plumbing: Tauri updater, autostart, store and deep-link plugins; React UIs on TanStack Router, Query and Table with Radix.

Architecture

Each app keeps the hard part in Rust: protocol framing, queuing and, in the lab bridge, a WASM parser per device family. A React UI on Tauri 2 shows status and lets staff act. Results and studies go upstream; lab orders come back down. A new device is a new plug-in, not a new app release.

Impact

  • Lab bridge live at 8 labs and clinics in the last 30 days (28 accounts installed)
  • 25,000+ analyzer results captured without manual entry since June 2026 (a lower bound)
  • 12 analyzer models from 9 brands connected in the field; ~23 analyzer families supported through plug-ins
  • 105 releases across the three apps, all delivered by auto-update
  • 633 of my commits across the three repos (326 + 228 + 79)

Production figures and GitHub counts, October 2026.

Transfers to: Edge and on-prem desktop software: device and protocol integration, industrial and IoT data capture, point-of-sale, anything that must keep working offline.

Stack

  • Tauri 2
  • Rust
  • React
  • TypeScript
  • TanStack Router + Query + Table
  • Radix
  • WebAssembly
  • Cornerstone3D
  • ASTM
  • HL7
  • DICOM
  • Serial / TCP