Skip to main content

Dashboard template

templates/dashboard — a multi-tenant SaaS dashboard / control-plane starter, genericized from a real shipped product.

Stack

A pnpm + Turbo monorepo:

  • apps/{web,admin,api,e2e} + 16 shared packages
  • Supabase SSR auth with jose JWKS, org-scoped RBAC + impersonation
  • Drizzle + Postgres with a transactional outbox
  • Hono API
  • shadcn dashboard kit — sidebar, data-table, command palette, empty-state, status-badge

The entire product domain is reduced to a single example Item resource (one table, one CRUD route, one dashboard page, one admin view) that demonstrates the org/RBAC pattern end to end — add your own resources from there.

Tokens

9 tokens, all prompted unconditionally on every scaffold — the CLI doesn't gate token prompts by which modules you enable:

TokenPromptDefault
__APP_NAME__Application nameAcme Dashboard
__PKG_SCOPE__Workspace package scope@app
__COLOR_PRIMARY__Primary brand coloroklch(0.62 0.13 250)
__DOMAIN__Primary auth/email domainexample.com
__SITE_URL__Production URL of the web app (post-deploy availability checks)https://app.example.com
__COGS_BRAND__Brand slug for @cogs transactional emailacme
__CF_ZONE_ID__Cloudflare DNS Zone IDREPLACE-WITH-CLOUDFLARE-ZONE-ID
__CF_ACCOUNT_ID__Cloudflare Account IDREPLACE-WITH-CLOUDFLARE-ACCOUNT-ID
__SES_REGION__AWS SES regionus-east-2

__DOMAIN__, __COGS_BRAND__, __CF_ZONE_ID__, __CF_ACCOUNT_ID__, and __SES_REGION__ matter mainly when the auth module is enabled — they configure the auth-email infrastructure — but the CLI still prompts for (or defaults) all 9 regardless of which modules you --enable.

Modules

ModuleDescriptionDefault
billingStripe billingoff
emailTransactional email (Resend)off
adminAdmin appon
authOpen-signup auth (Supabase SSR flow + Turnstile captcha + @cogs new-device email + SES/Cloudflare/Turnstile Terraform infra)off
mcpAdminMCP service-token admin panel — create/revoke scoped service-account tokens from apps/admin (see the mcp-tool-server skill)off

Scaffold

node bin/create-client.mjs acme-ops \
--template dashboard \
--out ../acme/02-repos/acme-ops \
--enable billing

See CLI Reference for the full flag list.