Works on the ferry, in the basement, and at the warehouse loading bay
Most applications treat losing connectivity as an error state. For field teams, drivers, inspectors and warehouse staff it is simply Tuesday — and an app that stops working is an app they stop using.
The naive version of this is a cache and a retry, and it holds until two people edit the same record on two devices while both are offline. Then you have a conflict, and how the software resolves it is the whole engineering problem.
What gets built: a local database on the device as the source of truth for the user, so the interface never waits on a network round trip and never blocks on a spinner. Every change is queued as an intent rather than a final state, which is what makes replay safe. Sync runs in the background when a connection appears, and — critically — it is idempotent, so a sync interrupted halfway through a tunnel does not duplicate records when it resumes.
Conflict resolution is decided with you, per data type, before anything is written. Last-write-wins is fine for a free-text note and catastrophic for a stock count. Some fields merge, some need a human to choose, and a few must never diverge in the first place — that conversation is design work, not a library setting.
The honest constraint: offline-first roughly doubles the state you have to reason about, so it is worth it when people genuinely lose connectivity and not worth it when they merely have slow Wi-Fi. If your users are always online, I will tell you to skip this and spend the budget elsewhere.
This is the same discipline as the external-writes rules published on the AI page: never let local state answer a question the authority can answer, and make every write safe to retry when you do not know whether it landed.
- →A local-first data layer — the interface never waits on the network
- →Idempotent background sync, safe to interrupt and resume
- →Conflict resolution agreed per data type before a line is written
Something holding you back?
New build, rebuild, or adding AI to what you already have — I'll take a look and give you an honest perspective.