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.
git clone <your-boilerplate-repo-url> my-saas
cd my-saas
npm install
2. Create a Supabase project
- Go to supabase.com/dashboard and click New Project.
- Pick a name, a strong database password, and the region closest to your users.
- Wait ~2 minutes for the project to spin up.
- Open Project Settings → Data API and copy: the Project URL, the publishable (anon) key, and the secret (service_role) key.
- Open Project Settings → Database → Connection string and copy the direct connection URI (NOT the pooled one — the wizard needs a direct Postgres connection).
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.
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.
npm run init
It walks you through 11 steps:
| Step | What it asks | Typical answer |
|---|---|---|
| 1 | Branding (app name, short name, description, URL) | Your real app name + URL |
| 2 | Business model (B2C or B2B) + onboarding toggle | B2C if unsure |
| 2b | Billing model + default currency | subscription / EUR |
| 2c | Features (newsletter, blog, changelog, prelaunch) | All on (you can disable later) |
| 3 | Admin email | Your own email — it gets is_admin=true automatically on first signup |
| 4 | Contact + support email | Same email is fine |
| 5 | Social links | Optional, skip with Enter |
| 6 | Legal info (company, address) | Placeholders ok for now — fix before launch |
| 7 | Email provider (Brevo / Mailjet / noop) | noop if you skip emails for now |
| 8 | Integrations (Crisp, GTM, Meta Pixel, Stripe mode) | Stripe = test; others optional |
| 9 | Supabase URL + keys + connection string | Paste the 4 values from step 2 |
| 10 | Database initialization | Press Enter — the wizard runs schema.sql, cms-schema.sql, enables pg_cron + pg_net, creates the storage bucket |
| 11 | File generation | Confirms .env.local + config/app.ts are written |
4. Start the dev server
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.
npm run initfinished without errors and printed "All done!"npm run devserves the landing page athttp://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/healthreturns{"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 EXTENSIONstatements 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=truefires on first signup; if you used a different email, set it manually inprofiles. - Port 3777 already in use — change the port in
package.json(devscript) or kill the process holding it. - Still stuck? Re-run
npm run init. It is idempotent — it will overwrite.env.localwith what you re-enter.
For a deeper dive into how the wizard works internally, see Automatic Setup.