# ────────────────────────────────────────────────────────────────────────── # freno-dev environment variables — example / template # ────────────────────────────────────────────────────────────────────────── # Copy this file to `.env` and fill in real values. # `.env` is gitignored and MUST NEVER be committed. Real secret values must # come from your local environment or your team's secret manager — never from # git history. See the root `AGENTS.md` "Secret Management & Rotation" section # and `docs/security/secret-rotation-runbook.md`. # # The schema in `src/env/server.ts` validates PRESENCE + min length for every # variable below. Do not leave production values blank. # ────────────────────────────────────────────────────────────────────────── # ── Frontend / public (safe to expose to the browser, VITE_* is shipped) ── VITE_DOMAIN="http://localhost:3000" VITE_AWS_BUCKET_STRING="https://example-bucket.s3.amazonaws.com/" VITE_DOWNLOAD_BUCKET_STRING="example-downloads-bucket" VITE_GOOGLE_CLIENT_ID=".apps.googleusercontent.com" VITE_GOOGLE_CLIENT_ID_DEV=".apps.googleusercontent.com" VITE_GOOGLE_CLIENT_ID_MAGIC_DELVE=".apps.googleusercontent.com" VITE_GITHUB_CLIENT_ID="" VITE_GITHUB_CLIENT_ID_DEV="" VITE_INFILL_ENDPOINT="https://infill.example.com/infill" VITE_WEBSOCKET="ws://localhost:3000" VITE_TURNSTILE_SITE_KEY="" # ── AWS (S3 uploads/downloads) — rotate via AWS IAM console ── AWS_REGION="us-east-1" AWS_S3_BUCKET_NAME="example-bucket" MY_AWS_ACCESS_KEY="" # AKIA... prefix; revoke old key after rotation MY_AWS_SECRET_KEY="" # ── Email (Sendinblue / Brevo SMTP) ── EMAIL_SERVER="smtp://user:password@smtp-relay.sendinblue.com:587" EMAIL_FROM="you@example.com" SENDINBLUE_KEY="" # ── Auth / signing secrets (generate with: openssl rand -base64 64) ── JWT_SECRET_KEY="" # web JWT (HS256) signing LINEAGE_JWT_SECRET="" # Lineage game JWT (HS256) signing — isolated from web (p8-005) LINEAGE_OFFLINE_SERIALIZATION_SECRET="" # offline lineage blob signing # ── OAuth client secrets — rotate in provider consoles ── GOOGLE_CLIENT_SECRET="" # GOCSPX-... GOOGLE_CLIENT_SECRET_DEV="" GITHUB_CLIENT_SECRET="" GITHUB_CLIENT_SECRET_DEV="" # ── Cloudflare Turnstile ── TURNSTILE_SECRET_KEY="" # 0x... # ── Turso / libSQL database tokens — rotate in Turso dashboard ── TURSO_DB_URL="libsql://.turso.io" TURSO_DB_TOKEN="" # eyJ... TURSO_DB_API_TOKEN="" # org-level API token TURSO_LINEAGE_URL="libsql://.turso.io" TURSO_LINEAGE_TOKEN="" NESSA_DB_URL="libsql://.turso.io" NESSA_DB_TOKEN="" # Clerk authentication — rotate via Clerk Dashboard or `clerk api .../rotate_secret_keys` NESSA_CLERK_SECRET="sk_test_" # secret key (sk_test_... for dev, sk_live_... for prod) NESSA_CLERK_JWT_ISSUER="https://.clerk.accounts.dev" # JWT issuer from Clerk Dashboard NESSA_CLERK_WEBHOOK_SECRET="whsec_" # Svix signing secret from Clerk Dashboard → Webhooks → Signing Secret APPLE_CLIENT_ID_LINEAGE=com... APPLE_CLIENT_ID_NESSA=com... # ── Infra / integration tokens ── INFILL_BEARER_TOKEN="" GITEA_URL="https://gitea.example.com" GITEA_TOKEN="" GITHUB_API_TOKEN="" # ghp_... / github_pat_... REDIS_URL="redis://localhost:6379"