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 install2. 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 secret3. Push the database schema
ShipBetter uses Drizzle ORM. Push the schema to your Postgres (Supabase) database.
pnpm drizzle-kit push4. Start the dev server
Run the app locally. Open http://localhost:3000 — you'll have a working landing page, auth, and dashboard.
pnpm dev5. 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, FAQDeploy
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