The problem
Small trades businesses — HVAC, plumbing, electrical — run dispatch on whiteboards, phone calls, and dispatch software designed twenty years ago. Assigning the wrong technician to a job costs a truck roll; double-booking costs a customer. The owner is the scheduling algorithm, and the algorithm doesn't scale.
What we built
- AI-assisted assignment, informed by track record: a server-side ranking engine scores every technician for every job by skill match, area, availability, and performance history — a tech with a strong rating and no no-shows gets ranked above one who's merely available. Every score comes with a plain-English reason.
- A real calendar, not a demo grid: the schedule is keyed to actual calendar dates with week-by-week navigation, not an abstract "Monday" that resets when you refresh.
- Technician scorecards: completed-job count, average customer rating, on-time rate, and no-show count — computed from job history and visible on every technician, not just claimed in a sales deck.
- A full job lifecycle: assign → complete (capturing on-time + a rating) or no-show → reschedule. Completions can be undone; no-shows rebook as a fresh job while the original stays on the technician's record — the accountability trail doesn't get erased by a fix.
- Conflict detection: double-bookings are caught server-side before they happen, including self-conflict edge cases on reschedules.
- Full schedule control: assign, unassign, cancel, and reschedule jobs; add, edit, and remove jobs and technicians — complete CRUD, not a read-only dashboard.
- Real persistence and auth: session-based login gate and a PostgreSQL backend. Data survives restarts because it's a real application, not a demo shell.
How it was shipped
Scoped as a one-page spec, prototyped in the browser first, then deliberately upgraded to a full MVP with a production backend. The persistence layer was architected to be host-independent — switching cloud providers is an environment-variable change, not a rewrite. The ranking engine was rebuilt to run a fixed 3 database queries regardless of technician headcount (down from one query per technician), so scoring stays fast as a team grows. Every route was verified end-to-end before deploy — auth gating, ranking, assignment, conflict rules, the full completion/no-show/reschedule lifecycle, and a dedicated test simulating the upgrade of an already-live database with real data in it, to prove the migration doesn't lose anything.
Try it
Open the live demo — no login required. Add jobs, assign technicians, mark one complete with a rating, trigger a conflict; the demo data resets itself automatically, so break whatever you like.