Environment Variables
The full list — every variable, what it does, where to get it.
All env vars live in .env.local for local dev and in Vercel → Settings → Environment Variables for production. The file .env.example in the repo is kept up to date — copy it with cp .env.example .env.local.
Variables starting with NEXT_PUBLIC_ are exposed to the browser. Everything else stays server-only. Never prefix a secret key with NEXT_PUBLIC_.
App
| Variable | Required? | Value |
|---|---|---|
NEXT_PUBLIC_APP_URL | required | Your production URL. Local: http://localhost:3000. Used for SEO, OG tags, email links. |
NEXT_PUBLIC_URL | optional | Fallback URL for payment redirects. Defaults to request host. |
Supabase
| Variable | Required? | Value |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | required | Supabase → Settings → API → Project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | required | Supabase → Settings → API → anon key |
SUPABASE_SERVICE_ROLE_KEY | required | Supabase → Settings → API → service_role key. Server-only! |
SUPABASE_PROJECT_ID | optional | For pnpm supabase:types. Your project ref. |
Supabase storage (S3)
| Variable | Required? | Value |
|---|---|---|
SUPABASE_S3_ENDPOINT | required for uploads | https://xxx.supabase.co/storage/v1/s3 |
SUPABASE_S3_REGION | required for uploads | us-east-1 (or your region) |
SUPABASE_S3_ACCESS_KEY_ID | required for uploads | From Supabase → Storage → S3 connection |
SUPABASE_S3_SECRET_ACCESS_KEY | required for uploads | From Supabase → Storage → S3 connection |
SUPABASE_S3_BUCKET | required for uploads | Bucket name (default: storage) |

Stripe (payments)
| Variable | Required? | Value |
|---|---|---|
STRIPE_SECRET_KEY | required for payments | Stripe → Developers → API keys → Secret key |
STRIPE_WEBHOOK_SECRET | required for payments | Stripe → Webhooks → endpoint → Signing secret |
STRIPE_PRICE_ID_PREMIUM | required for Premium plan | Price ID from Stripe → Products → Premium |
STRIPE_PRICE_ID_PARTNER_SUBSCRIPTION | optional | Recurring price for sponsors |
STRIPE_PRICE_ID_PROMO_BANNER | optional | Monthly price for banner ad |
STRIPE_PRICE_ID_PROMO_CATALOG | optional | Monthly price for catalog card |
STRIPE_PRICE_ID_PROMO_DETAIL | optional | Monthly price for detail-page card |
STRIPE_COUPON_ID_PROMO_ALL_THREE | optional | Coupon ID for "buy all three placements" discount |
See Payments for the full Stripe setup.
Email (Resend)
| Variable | Required? | Value |
|---|---|---|
RESEND_API_KEY | required for email | Resend → API Keys |
RESEND_PRODUCTION_FROM | optional | Override "From" in production (hello@yourdomain.com) |
RESEND_DEV_FROM | optional | Override "From" in dev (default: onboarding@resend.dev) |
RESEND_FROM_EMAIL | optional | Master override for "From" — takes priority over the other two |
RESEND_DEV_REDIRECT | optional | true (default) redirects all dev emails to RESEND_DEV_REDIRECT_TO |
RESEND_DEV_REDIRECT_TO | optional | Email address for dev redirects — point to your own inbox |
See Email Config.
Cron jobs
| Variable | Required? | Value |
|---|---|---|
CRON_SECRET | required | Any long random string. Example: openssl rand -hex 32. Protects /api/cron/* endpoints. |
See Cron Jobs.
AI features (optional)
Only needed if ai: true in features.config.ts.
| Variable | Value |
|---|---|
AI_PROVIDER | openai or anthropic |
AI_MODEL | Model ID: gpt-4o-mini, claude-haiku-4-5, etc. |
AI_API_KEY | Provider API key |
See AI Config.
Analytics (optional)
| Variable | Value |
|---|---|
NEXT_PUBLIC_GA_MEASUREMENT_ID | GA4 Measurement ID: G-XXXXXXXXXX |
NEXT_PUBLIC_POSTHOG_KEY | PostHog project API key (phc_...) |
NEXT_PUBLIC_POSTHOG_HOST | https://app.posthog.com or https://eu.posthog.com |
NEXT_PUBLIC_GOOGLE_VERIFICATION | Google Search Console verification token |
See Analytics Config.
Content & integrations (optional)
| Variable | Purpose |
|---|---|
SEOBOT_API_KEY | AI-written blog posts via SEObot |
NEXT_PUBLIC_LOGO_DEV_TOKEN | Auto-fetch logos by domain with Logo.dev |
NEXT_PUBLIC_LISTINGBOTT_URL | External link on /pricing for ListingBott |
Build & dev
| Variable | Value |
|---|---|
ANALYZE | true to enable webpack bundle analyzer (ANALYZE=true pnpm build) |
Quick-copy starter
For local dev, minimum to run with auth + DB:
NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
CRON_SECRET=any-long-random-stringAdd Stripe + Resend when you're ready to test payments + emails.
Adding env vars on Vercel

Paste them one by one, or drag-drop the .env.local file (Vercel parses it).
After changing env vars, trigger a redeploy — Vercel doesn't pick them up on existing builds.
I'm about to deploy to Vercel. Read my local .env.local file and:
- List every env var I have set locally.
- For each one, tell me:
- Whether it's needed in production (or local-dev only)
- Whether its value should be the SAME as local (copy as-is) or DIFFERENT (e.g. localhost URLs, test vs live Stripe keys)
- Flag any MISSING required vars based on .env.example that I should add before deploying.
- Flag any SECRETS that I should NOT paste in Vercel's shared environment (if any).
- Output the final block I should paste into Vercel Settings → Environment Variables, with production-appropriate placeholders for values I need to swap.
Don't modify .env.local.