Problem
Operational records lived in spreadsheets with no shared source of truth, no role separation, and no reliable history of who changed what. Two people editing the same file could produce two versions of the same record, and nothing in the file said which one was current.
Our role
Design, build and deployment. The application is used in day-to-day operations; what is still being written is the record of it, not the software.
Approach
The front end is a Vite and React application in TypeScript, talking to a typed Supabase data layer. Roles are enforced with row-level security in PostgreSQL rather than in the interface, so a hidden button is not the only thing standing between a user and a record they should not see.
Records that used to live in a spreadsheet are modelled as tables with their own history, and the interface is built around the few tasks that happen daily instead of around the shape of the old file. Deployment is a static build on Cloudflare Pages, with the database and its policies versioned alongside the code.
Outcome
Built and running. The application is in use, but the written record of the outcome is still being finished, so this entry stays open until the outcome can be stated plainly rather than estimated.
Notes
This write-up will be updated with the version the people using it have actually confirmed — not with figures taken from a spreadsheet of assumptions.