Skip to content

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.

RepoLive URLPurpose
studio-websitesitecrate.caAgency marketing site + client intake + client status tracking
sitecrate-adminadmin.sitecrate.caInternal dashboard — projects, pipeline, revenue, analytics, Build Brief
sitecrate-presenceprivate repoTier 1 client template — cloned per client, never deployed from the repo itself
┌──────────────────────────┐
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 projects table via the create_intake RPC → 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 Supabase projects row through the get_project_status RPC.

The two SiteCrate-owned apps deliberately do not share a codebase. What they share is the data layer and one function:

  • One Supabase project (projects table) — 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-email Netlify function lives in studio-website. The admin does not have its own email function; it calls studio-website’s send-email endpoint for every email it needs to send.

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 lint must 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.