Offline-first isn't a feature you add at the end. It's a data model you choose at the start. Try to bolt it on, and you'll spend three sprints fighting your own ORM.
Our rule: pick a sync engine before you pick a UI framework. WatermelonDB, Replicache, or a hand-rolled CRDT layer — but pick something with explicit conflict resolution semantics.
On the Nimbus Health clinician app, every patient chart edit was queued locally first. The UI didn't wait for the network. The sync engine reconciled when the device returned. Clinicians stopped opening tickets within three weeks of rollout.
The hard part isn't the sync. It's the conflict semantics. Last-write-wins is a trap. Field-level merges with vector clocks are the floor for anything healthcare-adjacent.
Build your conflict UI before you build your sync — even a one-line 'updated by Dr. Webb 2m ago' indicator earns more trust than three layers of optimistic UI ever will.