1. Clone and install

Use the repository link from your purchase confirmation. The exact command depends on where the repo is hosted — replace the URL below.

bash
git clone <your-boilerplate-repo-url> my-saas
cd my-saas
npm install

2. Create a Supabase project

  1. Go to supabase.com/dashboard and click New Project.
  2. Pick a name, a strong database password, and the region closest to your users.
  3. Wait ~2 minutes for the project to spin up.
  4. Open Project Settings → Data API and copy: the Project URL, the publishable (anon) key, and the secret (service_role) key.
  5. Open Project Settings → Database → Connection string and copy the direct connection URI (NOT the pooled one — the wizard needs a direct Postgres connection).
Keep the secret key private

The Supabase service_role key bypasses RLS. It lives in .env.local (which is git-ignored) and never gets shipped to the browser. The wizard puts it in the right place — just do not paste it into client-side code.

Data API access comes from SQL

The schema includes explicit GRANT / REVOKE statements for Supabase Data API access. Leave the SQL grants in place when editing migrations: RLS controls row access, while grants decide whether anon, authenticated, or service_role can reach each public table, view, sequence, or RPC at all.

3. Run the init wizard

The wizard collects all your configuration in one place, creates .env.local and config/app.ts, runs the SQL schema, and sets up the cron jobs.

bash
npm run init

It walks you through 11 steps:

StepWhat it asksTypical answer
1Branding (app name, short name, description, URL)Your real app name + URL
2Business model (B2C or B2B) + onboarding toggleB2C if unsure
2bBilling model + default currencysubscription / EUR
2cFeatures (newsletter, blog, changelog, prelaunch)All on (you can disable later)
3Admin emailYour own email — it gets is_admin=true automatically on first signup
4Contact + support emailSame email is fine
5Social linksOptional, skip with Enter
6Legal info (company, address)Placeholders ok for now — fix before launch
7Email provider (Brevo / Mailjet / noop)noop if you skip emails for now
8Integrations (Crisp, GTM, Meta Pixel, Stripe mode)Stripe = test; others optional
9Supabase URL + keys + connection stringPaste the 4 values from step 2
10Database initializationPress Enter — the wizard runs schema.sql, cms-schema.sql, enables pg_cron + pg_net, creates the storage bucket
11File generationConfirms .env.local + config/app.ts are written

4. Start the dev server

bash
npm run dev

Open http://localhost:3777 in your browser. The landing page should render with your app name in the header, the marketing hero, and the pricing table at the bottom.

You can move on when…
  • npm run init finished without errors and printed "All done!"
  • npm run dev serves the landing page at http://localhost:3777
  • The browser console shows no red errors (a few warnings about missing keys are fine — you will fix them in Phase 2)
  • GET /api/health returns {"status":"ok"}

If something went wrong

  • Wizard says "cannot connect to Postgres" — the connection string is wrong. Make sure you copied the direct string, not the pooled one. Pooled strings (port 6543) won't accept the CREATE EXTENSION statements the wizard runs.
  • Schema runs but admin can't log in — sign in with the email you set as admin. The trigger that flips is_admin=true fires on first signup; if you used a different email, set it manually in profiles.
  • Port 3777 already in use — change the port in package.json (dev script) or kill the process holding it.
  • Still stuck? Re-run npm run init. It is idempotent — it will overwrite .env.local with what you re-enter.

For a deeper dive into how the wizard works internally, see Automatic Setup.