Quickstart

From zero to a running SaaS in about five minutes. Requires Node 20+, pnpm, and a PostgreSQL database (Supabase free tier works).

1. Clone & install

Clone your copy of the repo and install dependencies with pnpm (npm/yarn also work).

git clone <your-repo-url> my-saas
cd my-saas
pnpm install

2. Set environment variables

Copy the example file and fill in your keys. Only DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL, and NEXT_PUBLIC_APP_URL are required to boot — everything else is optional and gated gracefully.

cp .env.example .env.local
# Edit .env.local with your Supabase URL + a 32-char auth secret

3. Push the database schema

ShipBetter uses Drizzle ORM. Push the schema to your Postgres (Supabase) database.

pnpm drizzle-kit push

4. Start the dev server

Run the app locally. Open http://localhost:3000 — you'll have a working landing page, auth, and dashboard.

pnpm dev

5. Wire optional integrations

Add keys as you need them — each is independent and the app runs without them: Stripe (payments), Google/GitHub (OAuth login), OpenAI (AI chat), AISend or Resend (email), Upstash (rate limiting), Bugsly (error tracking).

# .env.local — leave any block empty to disable that feature
GOOGLE_CLIENT_ID=...
STRIPE_SECRET_KEY=sk_test_...
OPENAI_API_KEY=sk-...
AISEND_API_KEY=as_...

6. Make it yours

Branding lives in src/config/site.ts, demo-app pricing in src/config/plans.ts, and landing sections in src/components/landing/. Add blog posts as MDX in content/posts/.

src/config/site.ts      # name, links, keywords
src/config/plans.ts     # subscription tiers
src/components/landing  # hero, features, pricing, FAQ

Deploy

Push to GitHub, import in Vercel, paste your env vars, and deploy. A Dockerfile-friendly standalone build is also supported via pnpm build + pnpm start.

Verify everything works

Run the test suite to confirm your environment is healthy.

pnpm test
pnpm test:e2e