LuxorItPro

Sheet 03/16Business operationsIn progress

Internal business application

A React and Supabase application replacing spreadsheet-based operational records.

Fig. 01 How a record is read and changed
How a record is read and changed How a record is read and changed. React interface (Built around daily tasks). Then Supabase API (Auth plus queries). Then PostgreSQL policies (Roles in row-level security). Then Record with history (Who changed what, and when). Arrows show the write path between components; a dashed arrow marks data derived from another component. React interface BUILT AROUND DAILY TASKS Supabase API AUTH PLUS QUERIES PostgreSQL policies ROLES IN ROW-LEVEL SECURITY Record with history WHO CHANGED WHAT, AND WHEN

Drawn from the Approach section of this write-up. No client names, no live data.

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.

All case studies Start a project