Work / Logistics, PWA

Delivery system

The day's orders go in as a spreadsheet. Out come routes per zone, a phone app for drivers that works without signal, and a settlement per zone at the end of the day.

My part
Design, build and hosting
When
April 2026 to now
Status
In production, now a module of NEXO

The problem

The day's deliveries came out of the ERP as a spreadsheet, and that was where the system stopped. Who drove which zone, what was delivered, what came back and how it was paid had to be pieced together afterwards.

What I built

The dispatcher uploads the export in the morning. The system splits it into zones and the dispatcher assigns drivers. A driver opens the app on a phone and sees the stops.

At each stop the driver marks delivered, partly delivered or refused, and how it was paid: cash or one of the two local payment apps, with the QR code on screen. The phone stores it and sends it when there is signal again. Lima has streets where there is none.

At the end of the day the office gets a settlement per zone: goods out, goods back, money in. It exports to PDF and then locks.

How it fits together

  1. PeopleDispatcher in the admin app, Drivers on the PWA
  2. On the phoneservice worker, local database, outbox that syncs later
  3. Applicationtwo Next.js apps, one monorepo
  4. DataPostgres, self-hosted Supabase, roles in the sign-in token

What came out

Measured means counted in the code or the system. Estimated means my own estimate, with the assumption next to it.
In production sinceApril 2026measured
Commits707measured, Nov 2026
Customers on a delivery day90 to 130measured, Sept to early Oct 2026
Zones on a delivery day5 to 9measured, Sept to early Oct 2026
Dispatch and settlement work saved a weekabout 5 to 9 hoursestimated, 5 to 9 zones a day, about 10 minutes less per zone, 6 working days

Built with

  • Next.js
  • React 19
  • TypeScript
  • Postgres
  • Supabase (self-hosted)
  • Dexie
  • Service worker
  • Leaflet
  • SheetJS
  • pnpm and Turborepo

Tell me what goes wrong on a normal Tuesday.

Book a 30-minute call

Thirty minutes, video or phone. You describe one process that costs you time. I ask questions and tell you honestly whether I would automate it, fix it first, or leave it alone. No slides.

Lima time, UTC-5. I reply within one working day, in English, Dutch or Spanish.

Open to remote roles and to projects.