Chapter 01
The challenge
Technicians filled in paper job sheets that were re-typed into a spreadsheet two days later, so dispatch never knew what had actually been completed.
Getting from there to a working product was not only a matter of writing code. A few things made this project harder than it first looked:
- Most job sites had no mobile coverage, so anything that needed a connection would not be used
- Two technicians could edit the same job before either synced
- Crews were used to paper and had little patience for a slower replacement
- Dispatch needed the data in the spreadsheet format the rest of the business already relied on
Chapter 02
What we did
A React Native app with a local database and conflict-aware sync, plus a lightweight dispatch dashboard on the web.
1.Local-first data
The full day's jobs, checklists and customer details are stored on the device. The app behaves identically with or without signal.
2.Conflict-aware sync
Changes are queued and merged field by field in the background, with the rare genuine conflict flagged to dispatch instead of silently overwritten.
3.Faster than paper
Large targets, sensible defaults and photo capture in place of written descriptions, tested with technicians on site before build.
4.Dispatch dashboard
A web console showing live job status, with exports matching the existing reporting format so nothing downstream had to change.
Chapter 03
The outcome
Headline result
Job data available same-day instead of after 48h
- Paper job sheets removed entirely
- Shipped to both stores in 9 weeks
Chapter 04
Built with
The tools chosen for this project, each for a reason specific to the problem rather than out of habit.
- React Native
- Expo
- SQLite
- Node.js
- PostgreSQL
- Next.js




