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.