The problem
A taxi fleet loses money to damage it cannot account for. A car comes back with a scraped bumper and nobody can say when it happened or who was driving. The repair gets paid for out of the operator's pocket, and the same thing happens again next month.
The fleet I built this for was tracking it the way most do — a shared spreadsheet, updated when someone remembered, with photographs scattered across a WhatsApp group. It was not that they did not care. It was that reporting damage properly took longer than ignoring it, so it got ignored.
The design problem was therefore not the dashboard. It was making the report take ten seconds, from a phone, in a car park, in the rain.
What I built
Every vehicle carries a QR sticker. A driver scans it, photographs the damage and submits — no login flow, no forms to hunt through, no app to install.
From there it becomes a piece of work rather than a note:
- A four-tier role model — owner, admin, mechanic, driver — so a mechanic sees a queue and an owner sees a business
- Assignment and a status lifecycle, so a report moves from raised to in progress to done and somebody owns it at each step
- Per-car repair history, so a vehicle's condition is a record rather than a memory
- Realtime dashboard updates and web push notifications
- CSV import and export at every boundary, because fleets already have their data somewhere and will want it back
- A stats view for the question owners actually ask, which is which vehicles are costing them money
It is multi-tenant from the first commit — every table carries an organisation, every query is scoped to one — because building that in later is one of the more expensive mistakes available.
Next is a custody model: drivers check a vehicle in and out at handover, so damage can be attributed to the shift it appeared in, mechanics are told the moment a car is back on site and free to work on, and a vehicle that is not roadworthy can be blocked from going out at all.
Where it is now
235 commits between May and August 2026. Built on Next.js 16 with PostgreSQL and Drizzle, MinIO for photograph storage, deployed with Docker behind Caddy. The interface is in Dutch, structured so further languages are a transcription rather than a rebuild.
A pilot fleet in the Netherlands goes live in September 2026. Unlike the client work elsewhere in this index, Curbed is mine — built, owned and run by BSquared.