Ship in 5 Minutes
Ship in 5 Minutes
Get a working landing page, auth, and billing live in under 5 minutes.
Step 1: Configure your app
Open config.ts at the root and update the basics:
export const config = {
appName: 'MyApp',
appDescription: 'Your SaaS description here.',
domainName: 'myapp.com',
resend: {
fromEmail: 'noreply@myapp.com',
fromName: 'MyApp',
},
stripe: {
plans: [
{
id: 'pro',
name: 'Pro',
popular: true,
description: 'Everything you need to run your SaaS.',
features: ['Unlimited items', 'Priority support', 'API access'],
recurring: {
priceId: import.meta.env.VITE_STRIPE_PRO_PRICE_ID ?? '',
price: 9,
yearlyPriceId: import.meta.env.VITE_STRIPE_PRO_YEARLY_PRICE_ID ?? '',
yearlyPrice: 90,
},
},
],
},
}
Step 2: Bootstrap (first time only)
If you haven't run make init yet:
make init
This copies .env.example, generates BETTER_AUTH_SECRET, installs deps, and runs migrations.
Step 3: Set environment variables
Fill in .env with your real keys:
BETTER_AUTH_URL=https://myapp.com
# Email (Resend)
RESEND_API_KEY=re_...
# Stripe
STRIPE_SECRET_KEY=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...
VITE_STRIPE_PRO_PRICE_ID=price_...
VITE_STRIPE_PRO_YEARLY_PRICE_ID=price_...
# Admin panel
ADMIN_EMAILS=you@myapp.com
(BETTER_AUTH_SECRET was generated by make init.)
Step 4: Customize the landing page
The landing page lives at src/routes/_landing.index.tsx and renders <LandingPage /> from src/components/landing/landing-page.tsx. Edit that file to change the hero copy, features list, FAQ, and testimonials.
Step 5: Verify
make dev
- Visit
/: landing page - Visit
/login: passwordless auth - Visit
/dashboard: authenticated area - Visit
/dev/emails: email template preview (dev only)
Step 6: Deploy
See Deployment.