example handover / DECISIONS.md
DECISIONS — Job Board, Granite State Mechanical
This is an example from the demonstration project on this site. One page, plain English, written so the owner can follow the reasoning and the next developer can inherit it without archaeology.
Why it's built the way it is
Why not just fix the spreadsheet? We tried that math first. The workbook's problems weren't typos — they were structural: merged headers that break sorting, totals typed by hand, a hidden tab holding six live jobs, and a weekly copy-the-tab ritual that manufactures new errors on schedule. Fixing cells doesn't fix the ritual. A small app removes the ritual.
Why "boring" technology? Plain TypeScript, a static site, files served from a commodity host. Chosen precisely because it's unremarkable: any developer can read it, the tools will still exist in ten years, and there's no license fee and no server bill that grows teeth later. The exotic option was considered and rejected on maintenance grounds — exciting tech is a cost you pay every year after I leave.
Why no database server? At this shop's size (~30 active jobs), a database server is plumbing without payoff: one more thing to patch, back up, and pay for. Job data lives in simple files with automatic backup through the host. DECISIONS like this one get revisited when the facts change — see "What I'd revisit" below.
Why does it look plain? Because the dispatcher uses it with gloves on, on a tablet, in a hurry. Big touch targets, high contrast, no animations. Pretty was available; legible won.
Why is the old workbook still around? Read-only, archived next to the app. It's the shop's history, and the rebuild imported from it — keeping it auditable is how you check my work, not a vote of no confidence in the app.
What I'd revisit, and when
- Past ~3× the job volume (or a second location): move from files to a small hosted database. The data shapes were designed so that migration is an afternoon, not a rewrite.
- If office and field stop sharing one network: add logins. The seam for that exists; it's documented in the app README.
- If you ever want quoting in here too: that's a new scope, not a tweak — worth its own written quote, the same way this one got one.