Zunkiree Labs
Offline-First Mobile App Architecture: Sync, Conflicts and Low Connectivity

Offline-First Mobile App Architecture: Sync, Conflicts and Low Connectivity

9 min read

How to design an offline-first mobile app: local storage, sync queues, conflict resolution and testing on poor networks, for field teams and patchy connectivity.

Zunkiree Labs Team

Zunkiree Labs Team

· Updated

In short: An offline-first app treats the phone's local database as the primary place the app reads from and writes to, and synchronises with the server whenever a connection is available. Users can keep working with no signal. The engineering challenge is not storing data locally; it is syncing safely: queuing changes, retrying, and resolving conflicts when two people change the same record while apart.

Key Takeaways

  • Local first. The user interface reads from local storage, so screens load instantly and work without a network.
  • Write to a queue. Changes are saved locally and added to an outbox that syncs in the background.
  • Sync must be idempotent. Retrying a request must not create duplicates.
  • Decide your conflict rules per data type, and tell users when something needed their attention.
  • Show sync state honestly: pending, synced, failed.
  • Test with bad networks, not just offline: slow, flaky and switching connections.
  • Offline-first is worth the extra effort when users work in places with poor or intermittent coverage.

When Offline-First Is Worth It

  • Field work: site inspections, deliveries, surveys, utilities, construction.
  • Markets and locations with patchy connectivity, including parts of Nepal, travel and basements.
  • Critical flows that must not fail at a bad moment, such as taking an order or recording a visit.
  • Heavy usage where waiting on the network makes the app feel slow.

For a simple content app that is only useful online, caching may be enough.

The Core Pieces

Piece Role Notes
Local database Source for the UI A mobile database such as SQLite-based storage
Outbox / operation queue Holds pending changes Persist it, so it survives app restarts
Sync engine Pushes changes, pulls updates Runs on a schedule, on reconnect and on demand
Server API Accepts batches, returns changes Designed for incremental sync
Conflict policy Decides what wins Per entity or field
Sync status UI Shows the user what is happening Avoids silent failures

Designing the Sync

  1. Give records stable IDs generated on the device (such as UUIDs) so new records can be created offline and referenced before the server sees them.
  2. Track versions or timestamps per record, preferably server-assigned versions, since device clocks are unreliable.
  3. Pull incrementally. Ask the server "what changed since this cursor" instead of re-downloading everything.
  4. Push as operations, such as "set status to done", not whole-record overwrites where possible. Operations merge more gracefully.
  5. Make requests idempotent with a client-generated operation ID the server remembers.
  6. Batch and retry with backoff, and keep order where order matters.
  7. Handle deletes with tombstones, so a deleted item does not reappear from another device.

Conflict Resolution

A conflict arises when two parties edit the same thing while disconnected. Options:

  • Last write wins: simple, but silently loses data. Acceptable for low-stakes fields.
  • Field-level merge: if one person changed the phone number and another the address, keep both.
  • Server rules: for example, a status can only move forward.
  • Operation-based merge: apply both operations in a defined order, as with counters or lists.
  • Ask the user: for important data, show both versions and let a person choose.
  • Specialised structures such as CRDTs, when real-time collaborative editing is required.

Pick per data type. Inventory counts, notes and statuses need different rules. Write them down and test them.

The User Experience of Offline

  • Show a clear offline indicator and per-item sync status.
  • Never block the user on a spinner waiting for the network for actions that can be queued.
  • Explain failures in plain language and offer a retry.
  • Be careful with actions that must be online, such as payments or anything needing server validation, and say so before the user starts.
  • Manage storage: cap cached media, clean up old data and warn before heavy downloads.
  • Handle authentication expiry while offline without losing queued work.

Security

Encrypt sensitive local data and use the platform's secure storage for credentials. Plan for a lost or stolen device with remote sign-out and, where needed, local data wipe. Be selective about what you store offline.

Testing

  • Airplane mode while performing full workflows.
  • Network throttling: slow, high latency, packet loss, and flapping connections.
  • Kill the app mid-sync and relaunch.
  • Two devices editing the same record offline, then syncing in different orders.
  • Large backlogs, such as a week of offline work.
  • Clock changes and timezone differences.
  • Upgrade paths: local schema migrations across app versions.

How We Approach It

We build iOS and Android apps, using cross-platform frameworks where they make sense and native code where they do not, with offline-first design when the use case needs it. Our mobile stack includes React Native, Expo, Swift, Kotlin and Firebase. See mobile app development. For field operations in practice, see the Khushbu Nirman Sewa case study, which describes mobile data capture across construction sites; the figures there are as reported by the client.

The Short Version

Offline-first means local data, a durable queue, idempotent sync and a deliberate conflict policy per data type. Show users what is happening, test on bad networks and plan for security. It costs more than an online-only app, and it pays off where connectivity cannot be trusted.

Frequently asked questions

What is an offline-first mobile app?

An offline-first app reads from and writes to a local database on the device and syncs with the server in the background when a connection is available, so it works without a network.

How do offline apps handle sync conflicts?

They apply a defined policy per data type: last write wins for low-stakes fields, field-level merge, server rules, operation-based merging, or asking the user to choose for important data.

Is offline-first worth it for every app?

No. It adds complexity, so it is best for field work, patchy connectivity and critical flows. A content app that is only useful online may need only caching.

Which framework is best for an offline-first app?

React Native with a local database is a common choice for cross-platform work, and native Swift or Kotlin suits cases needing deeper platform features. The architecture matters more than the framework.

How do you prevent duplicate records when syncing?

Generate record IDs on the device and send each change with a client-generated operation ID that the server remembers, so retries are idempotent.

How long does App Store approval take?

It varies. Apple review often takes a few days and Google Play is often faster, but plan buffer time and check the current guidance from each store.

Related Insights

Sources