Live demo of the Whirlwind template, as shippedStripe test mode: card 4242 4242 4242 4242, any future date, any CVCGet Whirlwind →

Deploy to Vercel

npm run deploy preflight, then the production switches to flip by hand.

Preflight first

npm run deploy does not push anything. It runs the audit, the e2e tests and doctor --deep, checks that production keys are live-mode and the app URL is real, then prints the switches you still have to make by hand: host environment variables, the Supabase redirect URL, the production Stripe webhook.
npm run deploy            # preflight + checklist
npm run deploy -- --json  # machine-readable

Deploy

1. Push the repository to GitHub 2. Import it at vercel.com 3. Add every key from .env.local to the project's environment variables, live-mode values for production 4. Deploy

After the first deploy

- Supabase → Authentication → URL Configuration: add the production URL - Stripe → Webhooks: add https://yourapp.com/api/webhook/stripe with its own signing secret - Set UPSTASH_REDIS_REST_URL and token so rate limits hold across instances - Supabase → Authentication → Rate Limits: keep sign-in emails per hour low, and turn on CAPTCHA (Cloudflare Turnstile) under Attack Protection if fake signups appear. Sign-in is requested from Supabase directly, so these are the limits that apply - Add your domain under Vercel → Domains; the certificate is automatic