When TST Terschelling approached us to replace their paper-based driver workflow, the brief was straightforward: make it faster, make it digital, make it reliable. What followed was one of the most technically demanding projects we have shipped.
The constraint that shaped everything
The Wadden Islands have patchy mobile coverage. Ferries cross twice a day. A driver loading goods at the dock at 6 AM does not have the luxury of waiting for a server round-trip every time they scan a barcode. The app had to work fully offline — not as a fallback, but as the primary operating mode.
That single constraint changed every architectural decision we made.
What Transporter does
Transporter is the operational spine of a driver's day. It handles:
- Driver login and route assignment
- Truck loading with barcode scanning and quantity validation
- Stop-by-stop delivery workflow with exception handling
- Digital proof of delivery including signature capture
- End-of-day route closure and sync back to the backend
Every action is local-first. The device stores state, queues events, and syncs opportunistically when connectivity is available. Nothing blocks on a network call in the critical path.
The technical stack
We built Transporter as a native C# application targeting Zebra Android devices. Zebra handhelds are the industry standard for warehouse and logistics scanning — they survive drops, dust, temperature swings, and shift after shift of continuous use. Their integrated barcode scanners are an order of magnitude faster than camera-based scanning on consumer phones.
The backend is a PHP REST API backed by MySQL. State reconciliation happens through an event-sourced sync model: the device accumulates a log of operations, the server applies them in order, and conflicts are resolved deterministically. The driver never sees a loading spinner at the critical moment.
What we learned
Offline-first sounds simple until you have to handle it properly. Every edge case that is trivial in an always-connected app becomes a design problem: what happens if a driver scans the same item twice on different devices? What if the route data has changed on the server since the app last synced? What if the device clock is wrong?
We spent considerable time on the sync protocol and on the UI feedback model — making sure the driver always knows the authoritative state of their route, even when that state was last updated three hours ago on a ferry crossing.
The result is an app that has been running daily routes since launch without a single data integrity issue.
The outcome
TST Terschelling replaced a clipboard-and-paper process that had been in place for years. Loading time per truck dropped significantly. Proof-of-delivery disputes disappeared because every delivery now has a timestamped, signed digital record. And the operations team can see live route progress from the office rather than waiting for drivers to call in.
It is the kind of project that reminds us why software exists: to remove friction from work that actually matters.