Installation
Prerequisites
- Node 26 and pnpm 11 (a
mise.tomlpins both) - Docker — the Supabase CLI runs Postgres and Auth locally
- The Supabase CLI is a project dependency, so use
pnpm supabase <cmd>; there is nothing to install globally.
npm install or yarn will produce a lockfile the CI
doesn't expect.Get the code
GStack is a GitHub template repository, so the cleanest route is to make your own repo from it rather than forking. Pick whichever fits:
# Creates your own repo from the template and clones it.
gh repo create my-app --template TerrorSquad/gstack --private --clone
cd my-app
# No GitHub account needed. Downloads the files with no git history,
# so your first commit is your own.
pnpm dlx degit TerrorSquad/gstack my-app
cd my-app
git init && git add -A && git commit -m "chore: initial commit from GStack"
git clone --depth 1 https://github.com/TerrorSquad/gstack.git my-app
cd my-app
rm -rf .git # drop GStack's history
git init && git add -A && git commit -m "chore: initial commit from GStack"
Setup
pnpm install
cp .env.example .env
pnpm setup # pick which integrations to enable; writes .env
pnpm supabase start # local Postgres + Auth
pnpm db:reset # apply migrations + seed a demo tenant
pnpm db:types # regenerate typed client from the live schema
pnpm dev # http://localhost:3000
pnpm setup reads a single subsystem manifest and flips the flag for each
integration you pick, stubbing any missing keys. Unpicked subsystems are set to
false, never deleted, and existing values are never overwritten.
Run pnpm doctor afterwards to verify — it reads the same manifest, so adding a
subsystem wires up both scripts at once.
Demo logins
After pnpm db:reset:
| Account | Password | |
|---|---|---|
| Admin | admin@example.com | Demo123!Demo123 |
| Member | member@example.com | Demo123!Demo123 |
Seeding is idempotent — it wipes the @example.com domain first, so re-running is
safe. SEED_FAST=1 pnpm seed builds the minimal set.
Make it yours
Do this early, so the placeholder name never reaches your own first commit:
node scripts/rename.mjs "My App" --package my-app --site https://myapp.com
That replaces the GStack display name across the app, the email templates and
the Supabase config, and sets the package name. Left for you by hand:
- brand palette —
layers/ui/app/assets/css/main.css(--color-brand-*) - favicon —
public/favicon.svg LICENSEcopyright holderREADME.mdproduct description