Girraj Sharma

Architecture

Building a React Native app that works without signal

SnapHatch is used near rivers and lakes, often without signal. On that app, I implemented the local SQLite database and server synchronisation, and loading startup data locally produced a measured 20% faster startup. This article outlines the approach.

The hard part isn’t saving JSON to the device. The app needs a clear source of truth, predictable sync states, safe retries, and UI that tells people whether what they’re looking at is current, waiting to sync, or unavailable.

Start with the journeys that must work offline

Store what the important offline screens and actions need, instead of copying every server response. SQLite and focused queries can keep saved items, field records, map details or recent activity available when the network isn’t.

Separate “usable” from “fresh”

Let the screen render from local data while a refresh runs on its own. People reach useful content sooner, and a small sync state can tell them when newer data is still downloading.

Queue and retry carefully

Pending actions need IDs, a status, retry rules and protection against duplicates. When the network comes back, resume work on purpose rather than replaying requests without context.

Plan for conflicts and partial failure

A sync can succeed for some records and fail for others. Keep what worked, show the failures someone can act on, and decide per product what happens when the local and server versions disagree.

Make background work visible

Logs and visible sync states make stuck uploads and downloads much easier to debug. The UI should be able to tell offline, syncing, up to date and failed apart, without blocking unrelated actions.

Summary

  1. List the journeys that must keep working without a network.
  2. Decide which records live locally, who owns them, and how fresh they need to be.
  3. Read locally first and refresh in the background.
  4. Add queued writes, retries, reconciliation and failure states.
  5. Test cold starts, interrupted requests, reconnection, duplicate taps and partial syncs.

Offline-first is more than caching. It needs a clear data lifecycle, honest sync states and a safe way to carry on when the connection comes back, so people don’t have to wonder whether the app lost their work.

For questions about this topic, email me.

More articles