Checklist
Offline-first
A checklist for building software that still works when the network doesn’t.
Use this when
- Your users have intermittent connectivity (2G/3G, patchy Wi‑Fi, captive portals).
- Power cuts are normal and people lose sessions mid-task.
- You can’t assume “refresh fixes it”.
Checklist
Data model
- Decide what “offline” means for your product (read-only, capture-only, full CRUD).
- Define conflict strategy (last-write-wins, merge, manual resolution, append-only).
- Make IDs client-generated (UUID/ULID), not server-only.
Sync & reliability
- Treat sync as a queue, not a background mystery.
- Make sync idempotent, retries should be safe.
- Handle clock skew (don’t trust client timestamps for ordering).
- Show sync state in the UI (pending, synced, conflict).
UX under failure
- Never block a primary action on the network unless you absolutely must.
- Save locally first, sync second.
- Design for “resume later”: drafts, partial forms, and autosave.
- Make errors actionable: “Try again” is not actionable.
- Budget your JS and images, set targets and enforce them.
- Lazy load everything non-critical.
- Avoid third-party embeds in critical flows.
Ops & support
- Log failures locally and upload when online (with user consent).
- Add a “report a problem” flow that works offline (queue it).
- Document a manual fallback (paper flow, SMS, phone call). Real life needs it.
Definition of done
- A user can complete the core task with airplane mode on.
- The app recovers cleanly after power loss or app kill.
- You can explain exactly how conflicts are handled, in one paragraph.