All Case Studies
Multi-Tenant SaaS Platform

Compliance Hub

Statutory compliance operating system for UK facilities management

Most "compliance" tools are rebranded to-do lists. This one is built around the actual obligations a UK facilities manager has under HSWA 1974 and its descendants — RAG as first-class data, delegation as a workflow, audit as automatic.

11Compliance regimes
19Tables
0Security advisor lints
14Doc kinds
Next 15 + SupabaseStack
Compliance Hub

The Problem

UK facilities managers carry a stack of statutory obligations — LOLER, PUWER, RIDDOR, RAMS, Fire Safety, Legionella L8, CDM 2015, EICR, Gas Safety, H&S, Asbestos — and most of them get tracked in a spreadsheet that's missing the actor, the timestamp, the before/after, and the evidence chain. When the HSE walks in and asks "show me that the LOLER thorough examination was scheduled, completed by a competent person, defects were closed, and the equipment wasn't operated in the meantime" — a spreadsheet is a guess. The brief was to replace the spreadsheet with a defensible system of record.

The Architecture — RLS-First, Workflow-Native

Next.js 15 App Router with React 19 Server Components, all mutations through Zod-validated Server Actions. Supabase Postgres 17 with row-level security on every exposed table. Six architectural principles drive the codebase: 1. RLS is non-negotiable. Default-deny everywhere. Every policy is org+site scoped. Contractors are explicitly walled off to records assigned to them. 2. RAG is first-class data, not a UI badge. Every operational row stores rag_status, rag_auto_status (BEFORE-trigger computed), rag_override_status, rag_override_reason — with a DB CHECK that makes a manual override illegal without a reason. 3. Delegation is a workflow, not a field. Owner, assignee, delegated-by, delegated-to, escalation-user, acceptance, accepted-at, declined-at, decline-reason, escalation-due-at, escalated-at, completed-at, closed-by — real columns, real workflows on both actions and inspections. 4. Audit is automatic. A SECURITY DEFINER trigger writes every insert/update/delete on every operational table into activity_log, stamped with auth.uid() and both previous and new values. 5. Storage is private-first. Three private buckets with path-scoped RLS. Documents accessed via signed URLs only. 6. One time-tracking primitive. A single time_logs table covers clock-on/off against actions and inspections via XOR check constraint.

The Data Model

19 tables across five domains: Identity & structure — organizations · profiles · sites · site_memberships · dutyholder_assignments Operational — assets · compliance_registers · inspections · inspection_findings · actions · incidents · contractors · contractor_site_links · contractor_documents · documents (polymorphic) Time tracking — time_logs with XOR check (action_id XOR inspection_id) + active_time_logs view Collaboration & audit — comments (threaded, with mentions uuid[]) · notifications (per-user inbox) · activity_log (every operational write with previous_values + new_values JSONB) Every operational table carries: organization_id, site_id, title, status, rag_status, rag_auto_status, rag_override_status, rag_override_reason, due_date, owner_user_id, assigned_to_user_id, created_by, created_at, updated_at, archived_at.

The Outcome

Live at compliance-hub.co.uk on a GCP VM (PM2 + nginx + Let's Encrypt). 11 statutory compliance regimes covered. 19 tables. 14 document kinds. Photo evidence on incidents and comments. @mentions with notifications. Calendar with cadence projections forecasting up to 24 occurrences forward. Mobile-first responsive design with off-canvas drawer, native camera input for photo capture, swipe-scrollable tables. PDF export of inspection records for handing to HSE. PWA install. Dark mode. Now productised as a SaaS: £99/mo Starter, £299/mo Pro, £999/mo + £1,500 setup white-label.

Ready to build something real?

Not a chatbot. Not a proof-of-concept. Production AI infrastructure that runs inside your business and does the work.