Field teams work in basements, tunnels, remote valleys, and disaster zones where the cell tower is the thing that broke. Any geospatial tool intended for them has to work with no connection at all, for hours, and then reconcile cleanly when a connection returns.

This is routinely scoped as a feature - 'add offline support' - and it is not one. It is an architectural decision that touches your data model, your identifier strategy, your conflict semantics, and your interface. Retrofitting it into a system designed around a live server is close to a rewrite, so the decision has to be made before the first line of code.

The device is a replica, not a cache

The single most consequential decision is how you think about the device. A cache is a temporary copy of authoritative server state. A replica is a full participant that can originate authoritative changes on its own.

Field tools need replicas. An inspector who records forty observations across six hours without signal has created six hours of authoritative data. That is not a stale cache to be invalidated; it is the primary record, and the server has never seen it. Systems built on cache semantics tend to handle this by discarding local state on conflict, which in a field context means quietly losing a day of someone's work.

Identifiers have to be generated client-side

If the server assigns identifiers, the device cannot create a record without a connection. That single constraint makes genuine offline operation impossible, and it is astonishing how often it is discovered late.

Generate UUIDs on the device. This has a second benefit that matters more than it initially appears: it makes sync idempotent. If a device is unsure whether an upload succeeded - the connection dropped mid-request, which happens constantly - it can safely retry, because the identifier is already fixed and the server can recognise the duplicate.

Decide conflict semantics per field, not per record

Two inspectors edit the same asset while both offline. Both sync. What should happen?

'Last write wins' is the default and it is usually wrong, because it silently discards one person's work. But the right answer is not uniform across your data - it depends on what the field means.

  • Observations are append-only. Two inspectors recording separate observations is not a conflict at all; both are true. Model them as an event log rather than a mutable field and the conflict disappears entirely.
  • Status fields genuinely conflict. If one marks an asset 'repaired' and another marks it 'condemned', someone has to decide. Surface it to a human, with both values and both timestamps.
  • Geometry corrections usually resolve by recency plus accuracy metadata. A correction recorded with better GPS accuracy should generally win regardless of order.
  • Photos and attachments never conflict. Keep them all, attributed.

The goal is not to avoid conflicts. It is to make sure no conflict is resolved silently in a way that loses information.

Basemaps are the hard logistics problem

Vector and raster tiles for a large operating area are gigabytes. You cannot ask a field team to download that over a hotel connection the night before, and you cannot ship it with the app.

The workable approach is region-scoped pre-caching driven by the work itself: when a job is assigned to a device, the tiles for that job's area are queued for download while the device is still on a good connection. Vector tiles help substantially here, since they are far smaller than raster at equivalent detail and can be restyled on-device without re-downloading.

Show sync state honestly

The interface must always answer, without the user asking: what is on this device only, what has reached the server, and what failed. A single spinner does not communicate this.

Per-record state is worth the interface cost. A field worker deciding whether it is safe to hand the tablet back at end of shift needs to know whether their afternoon has been uploaded. Ambiguity here erodes trust in the tool faster than almost any other defect, and a field team that does not trust the tool goes back to paper.