Tidewell
Offline-first inspections for water utilities
Field crews inspect hydrants, valves and pump stations in basements and rural sites with no signal. I led the rebuild of their paper-and-spreadsheet process into an app that works fully offline and syncs without losing a single edit.
Route 14
Today’s assets
- Done
Valve V-0874
Checked 8:12, 3 photos
- Done
Hydrant H-2231
Checked 8:40, flow OK
- Next
Pump station PS-3
Underground, 0.4 km
- Later
Hydrant H-2240
Last serviced March
- 11,400
- inspections filed per month
- 0
- lost edits since launch
- 38%
- less time per inspection
The problem
Inspectors filled in paper forms, photographed them, and an office team re-typed everything into a spreadsheet. Records arrived days late, and roughly one in twelve had a transcription error that sent a crew back to the same asset.
An earlier attempt at an app had failed because it needed a connection to load each form. Half the assets are underground.
Constraints
- Must work for a full 10-hour shift with no connectivity, including maps and photo capture.
- Two inspectors can edit the same asset on the same day.
- Crews use a mix of five-year-old Android phones and new iPads.
How it fits together
On the device
- Inspection screens
- WatermelonDB on SQLite
- Sync engine with change log
- Photo upload queue
In the cloud
- Sync API in Node.js
- PostgreSQL with PostGIS
- Nightly map tile builder
- Object storage for photos
Key decisions
Local database is the source of truth
Every screen reads from SQLite through WatermelonDB, never from the network. Sync runs in the background as a pull-then-push against a change log, so the UI never waits on a request.
Field-level merges instead of last-write-wins
Each record stores per-field timestamps. When two crews touch the same valve, the server merges field by field and only asks a supervisor to resolve a true conflict. That happened 14 times in the first year.
Pre-cut map tiles per route
The backend builds a vector tile pack for each crew’s route overnight, around 40 MB, so maps and asset pins load instantly underground.
Photos upload on their own queue
Images compress to WebP on device and upload separately with resumable chunks, so a 200 MB day of photos never blocks the text data a supervisor is waiting for.
Outcome
Rolled out to 140 inspectors across three utilities in four months. Records now reach the office within minutes of reconnecting, and the transcription team moved to data quality work.
Median inspection time dropped from 21 to 13 minutes, mostly from pre-filled asset history and not re-typing serial numbers.
What I’d change
I would introduce the per-field sync model from day one. We started with record-level timestamps and migrating 60,000 records mid-pilot cost us three weeks.
Stack
- React Native
- TypeScript
- SQLite
- WatermelonDB
- Node.js
- PostgreSQL
- PostGIS