The three-repo system
SiteCrate is three repositories around one shared Supabase project. Each repo owns a distinct surface; they communicate through the database and one shared email function — never by importing each other’s code.
The repos
Section titled “The repos”| Repo | Live URL | Purpose |
|---|---|---|
| studio-website | sitecrate.ca | Agency marketing site + client intake + client status tracking |
| sitecrate-admin | admin.sitecrate.ca | Internal dashboard — projects, pipeline, revenue, analytics, Build Brief |
| sitecrate-presence | private repo | Tier 1 client template — cloned per client, never deployed from the repo itself |
How they connect
Section titled “How they connect” ┌──────────────────────────┐ Prospect ─────▶ │ sitecrate.ca (intake) │ │ studio-website │ └───────────┬──────────────┘ │ create_intake RPC ▼ ┌──────────────────────────┐ │ Supabase projects │ ◀── direct table access │ (public / staging) │ (authenticated admin) └───────────┬──────────────┘ │ reads / writes ▼ ┌──────────────────────────┐ Ahmed ────────▶ │ admin.sitecrate.ca │ │ sitecrate-admin │ │ ⚡ Build brief ─────────┼──┐ └──────────────────────────┘ │ clone + Claude Code prompt ▼ ┌──────────────────────────┐ │ sitecrate-presence │ │ cloned → {slug}.sitecrate│ └──────────────────────────┘
Client ──▶ sitecrate.ca/#status/{token} ──▶ get_project_status RPC- A prospect fills out the intake form on studio-website → a row is written
to the Supabase
projectstable via thecreate_intakeRPC → Ahmed sees it in sitecrate-admin. - Ahmed uses the admin’s Build Brief to generate the Claude Code prompt, then clones sitecrate-presence to build the client site.
- Clients track progress at
sitecrate.ca/#status/{token}— the status page reads the same Supabaseprojectsrow through theget_project_statusRPC.
Shared infrastructure, not shared code
Section titled “Shared infrastructure, not shared code”The two SiteCrate-owned apps deliberately do not share a codebase. What they share is the data layer and one function:
- One Supabase project (
projectstable) — studio-website writes intake rows through RPCs; the admin reads and writes the same rows directly as an authenticated user. - One email function — the
send-emailNetlify function lives in studio-website. The admin does not have its own email function; it calls studio-website’ssend-emailendpoint for every email it needs to send.
Tech baseline
Section titled “Tech baseline”All three apps share the same stack and conventions:
- Vite + React 18 SPA, hash-based routing (no React Router).
- Plain CSS with custom properties — no Tailwind, no CSS modules, no
component library. The accent colour uses
oklch(). - ESLint 10 flat config with
eslint-plugin-react-hooks;npm run lintmust pass clean (zero errors) before any merge. - Netlify hosting; GitHub Actions CI/CD on the two SiteCrate-owned repos (client repos deploy via the Netlify CLI instead).
Read each repo in detail: studio-website · sitecrate-admin · sitecrate-presence.