All work

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.

Role
Lead mobile engineer
When
2022 – 2023
Team
3 mobile, 2 backend, 1 designer
Platforms
iOS, Android, tablets
9:41

Route 14

Today’s assets

Offline, 12 queuedAll synced
  • Done

    Valve V-0874

    Checked 8:12, 3 photos

  • Done

    Hydrant H-2231

    Checked 8:40, flow OK

  • Later

    Hydrant H-2240

    Last serviced March

Start inspection
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
Pull, then push, over HTTPS

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