Healthcare · Two MVP releases

A hospital field app that works without signal

Multi-tenant iOS app for clinical staff, built offline-first because the corridors it runs in have no reliable connectivity.

Two MVP releases delivered
0.5 → 1.0Two MVP releases delivered
Local writes, flush on reconnect
Offline-firstLocal writes, flush on reconnect
Hospital scope enforced in the token
Multi-tenantHospital scope enforced in the token

The problem

Clinical staff needed a mobile tool that stayed usable in parts of a hospital where connectivity drops without warning, across multiple hospitals that must never see each other’s data. An on-device computer-vision component sat on the critical path but depended on a third-party SDK outside our control — the kind of dependency that quietly eats a delivery date.

What I did

I scoped the app around an offline-first architecture rather than treating connectivity as an edge case: a local write store with flush-on-reconnect, a cached catalogue, and an explicit online/offline state machine instead of scattered network checks. Tenant isolation was pushed into the auth layer so hospital scope is carried by the token rather than enforced per screen. The CV work was isolated behind a gate with a documented fallback, and I held a reserve buffer with no committed scope so an SDK slip could absorb into the plan instead of moving the release.

How it ran

  1. 01

    Architecture and auth

    Multi-tenant authentication with email one-time codes and PIN re-entry, token refresh edge cases mapped before UI work began.

  2. 02

    Offline layer

    Reachability and state machine, offline catalogue cache with a visible banner, local write store, and flush-on-reconnect.

  3. 03

    Content and catalogue

    Server-authoritative reads with caching, backed by a headless CMS so clinical content changes without an app release.

  4. 04

    Gated CV integration

    On-device computer vision integrated behind an explicit gate, with results review, user override, and a fallback path if the SDK slipped.

  5. 05

    Hardening and release

    Error contracts split into recoverable and blocking, cold-start and inference performance work, full regression, and a crash-free watch before release candidate.

Something similar on your plate?

Thirty minutes, no deck. I will tell you whether it is worth doing at all.