Building internal tools (a CRM, an admin UI, the Monday dashboard) so the team can read and act on the data without escalating to engineers. Synthetic data so you can see it full before the real data arrives.
A team can have the cleanest workflows, the best agents, and a working database, and still grind to a halt if the only way to see the data is through the Supabase dashboard. Admin interfaces are how non-engineers on your team read, write, and act on the data your product collects.
This is also the protocol that retires the last surviving piece of the old CMS instinct. The admin UI is the new editor. You built it. You own it. It looks like your site and works like your team.
A team can have the cleanest workflows, the best agents, and a working database, and still grind to a halt if the only way to see the data is the Supabase dashboard. Admin interfaces are how non-engineers read, write, and act on the data your product collects.
At minimum, an admin UI has four parts. Get these four and you have a real product, not a database with a paint job.
Most admin UIs look nothing like the customer-facing site. Default Bootstrap. Default Material UI. A different brand entirely.
When admin looks like a different product, your team mentally separates the brand from the data. That separation costs you taste. The team starts treating the customer-facing site as marketing and the admin as work, and the work that touches customers gets less care over time.
Rule: same design system. Same fonts, same colors, same component library. Admin is a different surface of the same product.
Boring fonts. Boring layout. Tons of whitespace. Information dense but not cluttered. The data is the point.
Resist the urge to design it. The team is here to do work, not to admire your gradients.
An empty system looks like nothing, and you cannot design a dashboard against three test rows. Before you build the Monday view, fill the database with realistic synthetic data shaped by your own interview answers: your inquiry types, your stages, your products.
This is why you seeded data: now you can build the page you will open every Monday. Six numbers a founder actually acts on, read straight from the database, in your design system, with no new charting library. Volume, pipeline, conversion, revenue, mix, list size.
Every number clicks through to the filtered list it came from. When the real data comes in, the page does not change, only the numbers do. Sit with it for five minutes and note which number you would act on. That is the one to make bigger.
You need the lead capture from Protocol 07 (with the contacts table). You will add a protected /admin route, a leads view, and one inline action.
In Claude Code: "Add Supabase Auth with email + password. Create a /login page and a sign-up flow. Restrict /admin to logged-in users only." Sign up as yourself.
Tell Claude: "At /admin, fetch all rows from contacts using the Supabase server client. Render them in a table: name, email, created_at, status. Use the existing design tokens."
Tell Claude: "Add a search field that filters by name or email. Add column sorting on created_at and status."
Tell Claude: "Add a status column with values New, Working, Closed. Make it editable inline with a dropdown. Save the change to Supabase on change. Show a toast on success."
Submit a fake lead from your homepage. Log in to /admin. See the lead. Change status from New to Working. Reload. Status persisted.
Tell Claude: "Add is_synthetic to contacts, write scripts/seed-synthetic.ts for 80 believable contacts over 90 days, run it, then add /admin/dashboard with one panel: new contacts per week for 12 weeks, as bars, each bar clicking through to the filtered list."
A real /admin route on your live site with auth, a filterable leads view, one working inline action, ninety days of flagged synthetic data, and the first panel of your Monday view. Your team can now read and act on the data without you. The product has a back office.
You build a working CRM page in 40 minutes that lists, filters, and updates the leads from your contact form. Then you secure it with login so the data is actually private.