
A home medical equipment provider planned every delivery day by hand. One dispatcher, a messy export of the day's tickets, six vans, and a yard full of drivers waiting to leave.
A dispatch app that runs the whole morning in four steps: read the sheet, fix what it flags, solve the routes, print the cut sheets. Google OR-Tools solves for the shortest total drive time, inside the delivery windows, per-driver caps, town bans and vehicle eligibility the dispatcher used to carry in their head. 1,278 Python tests and 399 web tests cover those rules. It has run on Fly.io since August 2026.
Outcome
Planning the day used to take one person about five hours. It now takes about five minutes, by the client's own count. Every ticket on the sheet ends the morning in one of two places: on a driver's route, or on a short list of rows a human has to look at, each with the reason it was held. The app calls that delivery accounting, and the two counts have to add back up to the sheet, so a ticket cannot go missing between the export and the vans. The client is not named here, and the screenshots below run on synthetic data.
Reading the sheet
The day arrives as a spreadsheet export: ticket number, patient, items, address, and a free-text priority cell. A recognised export is read by fixed rules and never reaches a language model, so nothing in that path can invent an address. Rows pasted straight out of the spreadsheet take the same path, and that route has no model behind it at all.
What the parser cannot read with confidence, it refuses. An item code that is not equipment holds its row out of the solve and names itself on the review screen. An address that will not resolve to a building becomes a flagged task rather than an approximate pin, because a wrong pin sends a van to the wrong house and nothing later in the morning can catch it. The items cell is kept exactly as it was typed, so a log that said 3 ROLLATOR never prints as ROLLATOR.

The rules are configuration
Item codes, drivers, vans, served towns, per-driver delivery caps, banned driver-and-address pairs, which driver may carry a hospital bed and which van may not: all of it is data. It lives in a config version that is published with a diff and can be rolled back. Nothing published is edited in place, and no driver name or item code is written into the code.
The dispatcher feels that twice. An item code nobody has seen before is learned on sight and routes the same day, then waits on the config screen to be named properly. And who is driving today, which van they take, and a heavier cap for this one morning are choices on the run itself, so a one-off never needs a new published version.

What goes out with the vans
The app prints a cut sheet, one page per driver, built for a clipboard and a pen: stop order, ETA, the delivery window where there is one, the items, and a box at every stop for the driver to write in the time they actually delivered. A same-day discharge prints with its deadline on the row, because that delivery is the one the rest of the morning is planned around.


Four sheets of Excel for the office, a CSV delivery log, and a per-driver summary of stops, driving time and the hour each van gets back.
Project details
- Tests1,278 Python · 399 web
- DeploymentFly.io — one machine, SQLite on a mounted volume
- Year2026
- PlatformWeb app
In the client's words
“NeuraGul Labs built us a custom program that plans out our daily delivery routes, and it's been a big improvement over how we were handling it before. Our routing has a lot of moving parts from different vehicle sizes, time windows, priority orders, and rules that vary from driver to driver. He took the time to understand all of it up front instead of handing us something generic.”
Ahad Mumtaz, Google review, August 2026
Still planning the day by hand?