Three Roles, One Live Feed
Three roles run against one shared world: the customer who orders, the shop that accepts and dispatches, and the driver who collects and delivers. When the shop taps Accept, the customer’s screen changes in the same second, with no refresh and no polling.


Business Rules That Are Real
The platform enforces the rules a delivery operation depends on. Stock is reserved when the shop accepts, all or nothing, and a short line is reported by name. The shop decides who drives, and drivers cannot grab jobs themselves. Auto-assign ranks idle drivers by travel time to the shop, and a delivery cannot close without a recipient’s name.
- Eight order statuses, one direction of travel
- Cancellation only while an order is Placed or Accepted
- Each role sees only its own orders, enforced on the server for every event
A Small, Tested Core
Every state change goes through four steps: who is asking, are they allowed, is it valid now, and tell every screen. That logic lives in a small plain-TypeScript core with unit tests and no framework attached. Writes accept an idempotency key and an expected version, so a double tap replays the first answer and a stale screen gets a conflict instead of overwriting newer work.

Resilient Live Updates
All screens read one event stream. If the connection drops, the stream resumes from the last event the browser saw. After a long gap, the screen fetches a fresh snapshot rather than guessing. When the connection returns, the screen reports that nothing was lost.
Built to Extend
The core is the state machine, permission checks, stock rules and dispatch ranking. Storage, positioning and payments sit at the edges, so they can change without touching the core.

