MedTechClinicSync Bridge 6 weeks

Offline-First LIS Middleware for a State Public Health Network: 900,000+ Patient Records Synced Across 30 Rural Clinics

About This Project

A public-health technology partner operating an EHR/PHR platform across primary health centres in two Indian states, already managing more than 900,000 patient records. Their lab workflow still depended on standalone biochemistry analyzers with no link to the central record system, forcing field staff to hand-copy every result — a process that broke down further wherever connectivity was unreliable.

<HeroImage> <svg viewBox="0 0 1200 630" xmlns="http://www.w3.org/2000/svg"> <defs> <pattern id="dots" width="32" height="32" patternUnits="userSpaceOnUse"> <circle cx="2" cy="2" r="1.4" fill="#1e293b"/> </pattern> </defs> <rect width="1200" height="630" fill="#0f172a"/> <rect width="1200" height="630" fill="url(#dots)"/> <circle cx="220" cy="180" r="34" fill="none" stroke="#7DF9FF" stroke-width="2.5"/> <circle cx="220" cy="180" r="10" fill="#7DF9FF"/> <circle cx="180" cy="430" r="34" fill="none" stroke="#00C2A8" stroke-width="2.5"/> <circle cx="180" cy="430" r="10" fill="#00C2A8"/> <circle cx="350" cy="510" r="26" fill="none" stroke="#7DF9FF" stroke-width="2.5"/> <circle cx="350" cy="510" r="8" fill="#7DF9FF"/> <rect x="430" y="290" width="130" height="80" rx="14" fill="none" stroke="#ffffff" stroke-width="2.5"/> <text x="495" y="338" text-anchor="middle" fill="#ffffff" font-family="monospace" font-size="14">SQL DB</text> <path d="M250,195 C 340,230 380,280 432,322" fill="none" stroke="#7DF9FF" stroke-width="2" stroke-dasharray="6 6"/> <path d="M210,410 C 300,370 380,345 430,332" fill="none" stroke="#00C2A8" stroke-width="2" stroke-dasharray="6 6"/> <path d="M372,498 C 405,445 418,395 432,358" fill="none" stroke="#7DF9FF" stroke-width="2" stroke-dasharray="6 6"/>

<text x="620" y="270" fill="#ffffff" font-family="Arial, sans-serif" font-size="50" font-weight="700">ClinicSync Bridge</text> <text x="620" y="312" fill="#94a3b8" font-family="Arial, sans-serif" font-size="20">Offline-first LIS middleware for rural health networks</text>

<rect x="620" y="345" width="118" height="34" rx="17" fill="none" stroke="#7DF9FF" stroke-width="1.5"/> <text x="679" y="367" text-anchor="middle" fill="#7DF9FF" font-family="monospace" font-size="13">BLE Sync</text> <rect x="750" y="345" width="158" height="34" rx="17" fill="none" stroke="#00C2A8" stroke-width="1.5"/> <text x="829" y="367" text-anchor="middle" fill="#00C2A8" font-family="monospace" font-size="13">900K+ Records</text> <rect x="920" y="345" width="120" height="34" rx="17" fill="none" stroke="#ffffff" stroke-width="1.5"/> <text x="980" y="367" text-anchor="middle" fill="#ffffff" font-family="monospace" font-size="13">30 Clinics</text> </svg> </HeroImage>

The Problem

Across rural Karnataka and Rajasthan, primary health centres have spent the last decade trying to digitise patient care while running on infrastructure built for paper. A field health worker draws a blood sample, runs it on a standalone biochemistry analyzer, and then — because the analyzer has no way to talk to the state's electronic health record system — copies the result by hand into a register, and later, connectivity permitting, retypes it into the central portal.

This isn't a fringe problem. Independent reviews of India's digital health rollout note that many facilities in smaller towns and rural areas still rely on manual record-keeping, which makes it difficult to track patient histories or share clinical data in real time. Across a network of 30 PHCs spanning two state governments, that gap meant thousands of lab results sitting in paper trails — each one a chance for a transcription error or a delayed diagnosis.

The client, a public-health technology partner already running an EHR/PHR platform with more than 900,000 patient records, had evaluated off-the-shelf LIS connectors before. Nearly all of them assumed an always-on broadband link between the lab device and the cloud — an assumption that doesn't hold at PHC level, where connectivity comes and goes throughout the working day.


Our Approach

We started by reframing the constraint: PHC connectivity isn't absent, it's intermittent — and that distinction changes the whole architecture decision. Instead of a cloud-relay that fails exactly when it's needed most, during an outage, we proposed an offline-first design where the device, not the network, is the source of truth at the moment a result is captured.

We also chose to extend the client's existing Laravel-based platform rather than stand up a parallel system. Field staff already carried Android tablets, so the capture layer would live there; the sync bridge would be written in Node.js and Laravel to match the stack the client's own team already maintained. We rejected a generic third-party LIS gateway outright — it couldn't speak the proprietary BLE protocols of the Cellenium Junior and Labmate analyzers already deployed in the field, and replacing those instruments wasn't an option the client could afford.


Architecture & Technical Solution

<ArchitectureDiagram> <svg viewBox="0 0 900 500" xmlns="http://www.w3.org/2000/svg"> <defs> <marker id="arrow2" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto" markerUnits="strokeWidth"> <path d="M0,0 L0,6 L9,3 z" fill="#94a3b8"/> </marker> </defs> <rect width="900" height="500" fill="#0f172a"/> <rect x="60" y="30" width="330" height="62" rx="10" fill="none" stroke="#7DF9FF" stroke-width="2"/> <text x="80" y="56" fill="#7DF9FF" font-family="monospace" font-size="13">Cellenium Junior Analyzer</text> <text x="80" y="76" fill="#7DF9FF" font-family="monospace" font-size="13">Labmate Biochemistry Analyzer (BLE)</text> <rect x="60" y="132" width="330" height="56" rx="10" fill="none" stroke="#00C2A8" stroke-width="2"/> <text x="80" y="155" fill="#00C2A8" font-family="monospace" font-size="13">Android BLE Listener</text> <text x="80" y="174" fill="#00C2A8" font-family="monospace" font-size="13">Local queue · offline capture</text> <rect x="500" y="30" width="340" height="62" rx="10" fill="none" stroke="#c4b5fd" stroke-width="2"/> <text x="520" y="56" fill="#c4b5fd" font-family="monospace" font-size="13">Doctor Console · Web Portal</text> <text x="520" y="76" fill="#c4b5fd" font-family="monospace" font-size="13">Web-initiated test orders</text> <rect x="260" y="252" width="380" height="60" rx="10" fill="none" stroke="#fbbf6a" stroke-width="2"/> <text x="280" y="277" fill="#fbbf6a" font-family="monospace" font-size="13">Node.js + Laravel Sync Bridge</text> <text x="280" y="297" fill="#fbbf6a" font-family="monospace" font-size="13">Queue reconciliation · auto-sync on reconnect</text> <rect x="320" y="402" width="260" height="60" rx="10" fill="none" stroke="#ffffff" stroke-width="2"/> <text x="340" y="427" fill="#ffffff" font-family="monospace" font-size="13">SQL Server — Central Records</text> <text x="340" y="447" fill="#ffffff" font-family="monospace" font-size="13">900,000+ patient records</text> <path d="M225,92 L225,130" stroke="#94a3b8" stroke-width="2" marker-end="url(#arrow2)" fill="none"/> <path d="M225,188 C 225,232 350,247 380,250" stroke="#94a3b8" stroke-width="2" marker-end="url(#arrow2)" fill="none"/> <path d="M650,92 C 650,162 560,222 520,250" stroke="#94a3b8" stroke-width="2" marker-end="url(#arrow2)" fill="none"/> <path d="M450,312 L450,400" stroke="#94a3b8" stroke-width="2" marker-end="url(#arrow2)" fill="none"/>

<text x="60" y="488" fill="#64748b" font-family="monospace" font-size="12">Legend:</text> <rect x="125" y="479" width="14" height="14" fill="none" stroke="#7DF9FF" stroke-width="2"/> <text x="145" y="490" fill="#94a3b8" font-family="monospace" font-size="11">Device</text> <rect x="205" y="479" width="14" height="14" fill="none" stroke="#00C2A8" stroke-width="2"/> <text x="225" y="490" fill="#94a3b8" font-family="monospace" font-size="11">Edge Capture</text> <rect x="330" y="479" width="14" height="14" fill="none" stroke="#c4b5fd" stroke-width="2"/> <text x="350" y="490" fill="#94a3b8" font-family="monospace" font-size="11">Application</text> <rect x="450" y="479" width="14" height="14" fill="none" stroke="#fbbf6a" stroke-width="2"/> <text x="470" y="490" fill="#94a3b8" font-family="monospace" font-size="11">Sync / API</text> <rect x="560" y="479" width="14" height="14" fill="none" stroke="#ffffff" stroke-width="2"/> <text x="580" y="490" fill="#94a3b8" font-family="monospace" font-size="11">Data Layer</text> </svg> </ArchitectureDiagram>

The middleware we built — internally code-named ClinicSync Bridge — sits between two analyzer types and the central SQL Server database that anchors the EHR/PHR platform. At the device layer, an Android app listens for BLE broadcasts from the Cellenium Junior and Labmate Biochemistry Analyzer, parsing each result the moment it's produced and writing it to a local queue — no network required.

That queue is bidirectional. When a doctor initiates a test order from the web console, the request flows down through the sync bridge to the device's local queue, ready to fire the moment the analyzer is in range. When a result comes back, it flows the other way — captured locally, then pushed to the central SQL Server automatically the instant the device reconnects.

The sync bridge, written in Node.js and Laravel, handles the part that makes offline-first systems hard in practice: deduplicating results queued more than once, reconciling partial syncs after a dropped connection, and reordering out-of-sequence updates so the central record always reflects the true clinical timeline.


Build & Deployment

The hardest part wasn't the parsing logic — it was BLE itself. Different Android OEMs implement Bluetooth Low Energy stacks inconsistently, and a pairing routine that worked flawlessly on one tablet would silently drop connections on another. We ended up writing our own retry-and-reconnect layer rather than trusting OS defaults, and used AI-assisted code review to move through two distinct analyzer protocols quickly without introducing regressions in the existing platform codebase.

Rollout went PHC by PHC rather than all at once. The Android capture app was distributed through an internal channel — government device-management policy ruled out the Play Store — and each site ran in parallel with the old paper process for a week before cutover. The sync bridge deploys alongside the existing Laravel API, syncing to the central SQL Server over a secured connection whenever a PHC comes back online.


Results & Impact

<MetricsDiagram> <svg viewBox="0 0 800 200" xmlns="http://www.w3.org/2000/svg"> <rect width="800" height="200" fill="#0f172a"/> <rect x="30" y="30" width="170" height="140" rx="12" fill="#16213a" stroke="#1e293b"/> <text x="115" y="100" text-anchor="middle" fill="#7DF9FF" font-family="Arial, sans-serif" font-size="32" font-weight="700">900K+</text> <text x="115" y="128" text-anchor="middle" fill="#94a3b8" font-family="Arial, sans-serif" font-size="12">Patient records under management</text> <rect x="220" y="30" width="170" height="140" rx="12" fill="#16213a" stroke="#1e293b"/> <text x="305" y="100" text-anchor="middle" fill="#7DF9FF" font-family="Arial, sans-serif" font-size="32" font-weight="700">30</text> <text x="305" y="128" text-anchor="middle" fill="#94a3b8" font-family="Arial, sans-serif" font-size="12">Primary health centres connected</text> <rect x="410" y="30" width="170" height="140" rx="12" fill="#16213a" stroke="#1e293b"/> <text x="495" y="100" text-anchor="middle" fill="#7DF9FF" font-family="Arial, sans-serif" font-size="32" font-weight="700">2</text> <text x="495" y="128" text-anchor="middle" fill="#94a3b8" font-family="Arial, sans-serif" font-size="12">State health systems integrated</text> <rect x="600" y="30" width="170" height="140" rx="12" fill="#16213a" stroke="#1e293b"/> <text x="685" y="100" text-anchor="middle" fill="#7DF9FF" font-family="Arial, sans-serif" font-size="22" font-weight="700">Offline-First</text> <text x="685" y="128" text-anchor="middle" fill="#94a3b8" font-family="Arial, sans-serif" font-size="12">BLE sync — works without live connectivity</text> </svg> </MetricsDiagram>

Before ClinicSync Bridge, a lab result could sit in a paper register for hours — sometimes days — before someone had time to re-key it into the portal, with every manual step a fresh chance for error. After rollout, a result captured on the analyzer reaches the central patient record automatically the moment the device has a connection, with no one retyping anything.

The bridge now keeps more than 900,000 patient records current across 30 primary health centres spanning two state government health systems — without requiring the always-on connectivity that off-the-shelf LIS connectors assumed PHCs would have.

"We used to lose sleep over results getting stranded when the network dropped. Now the system just catches up the second we're back online — nobody has to remember to re-enter anything." — Programme coordinator, state primary health network (anonymised)


Tech Stack

LayerTechnology
FrontendAndroid (Java), Web Doctor Console
BackendNode.js, Laravel, Python
DatabaseSQL Server
InfrastructureInternal APK distribution, secured VPN sync
IntegrationsCellenium Junior & Labmate Biochemistry Analyzer (BLE)
AI/MLAI-assisted code review for protocol parsing

Want a Solution Like This?

If your business runs on instruments, devices, or field locations that don't always have a reliable line back to head office — labs, clinics, warehouses, remote job sites — the same offline-first thinking applies. The cost of "wait for the network" is measured in lost data and slower decisions; the fix is rarely more bandwidth, it's better architecture.

Book a free 20-minute scoping call → We scope, prototype, and deliver — faster than you'd expect.


Built by Vertical Idea · June 2026 · MedTech · 6 weeks

Project Details

Sector
MedTech
Timeline
6 weeks
Engagement
ClinicSync Bridge

Tech Stack

Node.jsNode.jsLaravelLaravelPythonPythonSQL ServerSQL ServerAndroid (Java)Bluetooth Low Energy (BLE)

Want Results Like This?

Tell us what you're building. We'll scope it, price it, and ship it — faster than you expect.

We respond within 24 hours. No sales pitch — just a straight conversation about your project.