DATABASE_URL="postgresql://s2yt:s2yt@localhost:5433/s2yt"
REDIS_URL="redis://localhost:6380"
NEXTAUTH_URL="http://localhost:3000"
# Generate with: openssl rand -base64 32
NEXTAUTH_SECRET="replace-with-a-long-random-secret"
# Used to encrypt YouTube OAuth tokens at rest (falls back to NEXTAUTH_SECRET if unset)
# TOKEN_ENCRYPTION_KEY="replace-with-another-long-random-secret"
# Server-side Google OAuth 2.0 credentials from Google Cloud Console
GOOGLE_CLIENT_ID="your-google-client-id.apps.googleusercontent.com"
GOOGLE_CLIENT_SECRET="your-google-client-secret"
UPLOAD_DIR="./uploads"
# Open-source / self-hosted: unlimited video quota, API, and Pro features
# S2VID_EDITION="selfhosted"
# Admin API key for approving/rejecting quota extension requests (Bearer token)
# ADMIN_API_KEY="your-secret-admin-key"
# Admin UI: /admin (footer badges) — unlock with the same Bearer key
# Admin reset: POST /api/admin/reset-credits  Authorization: Bearer $ADMIN_API_KEY
# Admin badges: GET/POST /api/admin/badges, PATCH/DELETE /api/admin/badges/:id
# Public badges: GET /api/badges
# Pro users generate API keys in Dashboard → Settings (stored hashed; shown once)
# Optional: override bundled ffmpeg-static binary (leave unset to use npm package)
# FFMPEG_PATH="C:/path/to/ffmpeg.exe"
# Public Gitea issues URL for community support links
NEXT_PUBLIC_GITEA_ISSUES_URL="https://git.atakanozban.com/Songs2VID/songs2vid/issues"
NEXT_PUBLIC_GITEA_URL="https://git.atakanozban.com/Songs2VID"
NEXT_PUBLIC_DOCKER_HUB_URL="https://hub.docker.com/r/atakanozban/songs2vid"
# Docusaurus docs — local: npm run docs:dev → http://localhost:3001
# NEXT_PUBLIC_DOCS_URL="http://localhost:3001"
# Production: NEXT_PUBLIC_DOCS_URL="https://docs.songs2vid.com"
# Stripe billing (Pro €5/mo + Free 1–15 credit top-ups @ €0.25)
# STRIPE_SECRET_KEY="sk_test_..."
# Prefer a restricted key (rk_...) with Checkout + Customers + Billing Portal + Webhooks only
# STRIPE_WEBHOOK_SECRET="whsec_..."
# Optional Dashboard Price ID for Pro (otherwise inline price_data €5/mo is used)
# STRIPE_PRO_PRICE_ID="price_..."
# Collect VAT/GST via Stripe Tax AFTER adding Tax registrations in Dashboard:
# STRIPE_AUTOMATIC_TAX="true"
# Force local mock upgrades/grants without Stripe: BILLING_DEV_MOCK=true
# Disable auto-mock when Stripe key missing: BILLING_DEV_MOCK=false
# Point Stripe webhook to: POST /api/stripe/webhook
# Events (required):
#   checkout.session.completed
#   invoice.payment_succeeded
#   invoice.payment_failed
#   customer.subscription.updated
#   customer.subscription.deleted
# Dashboard: enable Customer portal (Settings → Billing → Customer portal)
# Optional: Managed Payments (MoR)  enable in Dashboard + set managed_payments on Checkout if you use it
# Dev helpers: POST /api/dev/grant-credits  { "action": "set-pro" | "free-top-up" | "grant-credits" }
# Admin reset: POST /api/admin/reset-credits  Authorization: Bearer $ADMIN_API_KEY
# See also /admin for footer badge management
