Re-architected a heavy, self-hosted reporting system into a fast, modern client portal with database-level separation between clients.

Brief

An earlier version of a client-reporting system had been built on a fully self-hosted stack. It worked, but it was slow and costly to set up and maintain, and it wasn’t designed to serve multiple clients cleanly. The goal was something quick to deploy, easy to maintain, and able to keep each client’s data properly isolated from day one.

Approach

I helped re-architect the system onto a modern, hosted stack and led the design side: the user roles, the approval flows, and the interface itself. I prototyped the full platform as a set of screens — dashboard, pipeline board, approvals, publishing — before any live data was connected, using a “mock-mode” pattern so the product could be designed, reviewed, and demoed early. Client separation was handled at the database level rather than bolted on, so isolation is enforced by design. A shared design system (consistent tokens, dark-first with a light option) kept the whole thing coherent.

Outcome

Deployment dropped from weeks of setup to roughly an hour and a half. Each client’s data is isolated at the database layer, and the interface was demoable before any integration existed — which de-risks the whole build and makes it easy to show clients progress early.

My role: UX and information architecture — user roles, approval flows, ~20 prototyped screens, and the design system.

Stack: Next.js · Supabase (with row-level security for client isolation) · Vercel · component-based UI with tokenised theming.