Offline first
A field app built for the basement
A sitter with no bars must still be able to start a visit, take photos, write notes and check out. Everything syncs when signal returns, and the record stays auditable.

- Complete an entire visit in airplane mode
- Photos compressed on the device before queueing
- Cached client names, addresses and phone numbers
- One-tap navigation and one-tap call
- 48px touch targets, readable in direct sun
- Queue survives reboot; replays are idempotent
The network is optional, not assumed
Every field action writes to an IndexedDB queue on the device before anything touches the network. Check in, the checklist, photos, video, notes, the client message, the access-instruction reveal, all of it lands locally first and replays in order when connectivity returns.
A visible sync indicator shows how many items are pending, and the queue survives a force-quit, a battery death and a phone reboot. Nothing about a sitter’s day depends on a bar of signal.
Replays are safe
Each queued item carries a client-generated id, and the server treats that id as the idempotency key. A flaky sync that sends the same batch twice produces one check-in, not two, and one photo, not a duplicate.
Where two devices genuinely disagree, scalar fields on a report card take the newest device timestamp and the discarded version is written to the audit log. Media and visit events are append-only, because losing a photo is not recoverable.
Two clocks, both recorded
Every event stores when it happened on the device and when it arrived at the server. A visit completed at 7:02am in a dead zone and synced at 4pm reads correctly on the report card and is still defensible six months later.
Location you can defend
GPS is captured at check in, at check out, and optionally as a breadcrumb during the visit, along with the accuracy radius. When accuracy is poor the report card shows a location-confidence badge instead of a precise pin.
Accusing a sitter of skipping a visit because of an urban GPS bounce is worse than showing less, so we show less.