# ============================================================ # Copy this file to `.env` and fill in your own values. # NEVER commit a real `.env` — it is gitignored on purpose. # ============================================================ # ------------------------------------------------------------ # Frontend (Vite) — exposed to the browser, must be prefixed VITE_ # ------------------------------------------------------------ VITE_FIREBASE_API_KEY= VITE_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com VITE_FIREBASE_PROJECT_ID=your_project_id VITE_FIREBASE_STORAGE_BUCKET=your_project.appspot.com VITE_FIREBASE_MESSAGING_SENDER_ID= VITE_FIREBASE_APP_ID= VITE_FIREBASE_MEASUREMENT_ID= # Stripe publishable (client-side) key. Leave empty to disable billing UI. VITE_STRIPE_PUBLISHABLE_KEY= # Leave EMPTY in production so the SPA calls the same-origin /api functions. # For local dev against the Vercel/dev server you can also leave it empty. VITE_API_URL= # ------------------------------------------------------------ # Backend (serverless functions / dev API) — server-only secrets # ------------------------------------------------------------ # Postgres connection string. For Supabase use the transaction pooler (port 6543). DATABASE_URL= # Random string used to hash visitor identifiers for anonymized analytics. ANALYTICS_SALT= # Firebase Admin service account JSON, base64-encoded. # Generate with: base64 -i service-account.json | tr -d '\n' # IMPORTANT: must be the SAME Firebase project as the VITE_FIREBASE_* config. # Also used for audio transcription via Google Cloud Speech-to-Text — enable the # "Cloud Speech-to-Text API" (+ billing) in that same Google Cloud project. FIREBASE_SERVICE_ACCOUNT_B64= # Google AI / Gemini (challenge feedback) # Get a key at https://aistudio.google.com/apikey GEMINI_API_KEY= GEMINI_MODEL=gemini-2.5-flash # Set to "true" to return canned feedback without calling Google AI (useful locally). USE_MOCK_FEEDBACK=false # Stripe (server-side). Leave empty to disable billing. STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= STRIPE_PRICE_MONTHLY= STRIPE_PRICE_YEARLY= STRIPE_PRICE_ONETIME= # Resend (transactional email) RESEND_API_KEY= RESEND_FROM_EMAIL=noreply@example.com # ------------------------------------------------------------ # General # ------------------------------------------------------------ YOUR_DOMAIN=http://localhost:5173 FRONTEND_URL=http://localhost:5173 # When "true", all content is accessible without an active subscription. FREE_ACCESS_DEFAULT=true