# Flask FLASK_ENV=development API_SECRET_KEY= # PocketBase POCKETBASE_URL=http://pocketbase:8090 POCKETBASE_ADMIN_EMAIL= POCKETBASE_ADMIN_PASSWORD= # Redis / RQ — shared with Firecrawl REDIS_URL=redis://bettersight-redis:6379 # OpenRouter OPENROUTER_API_KEY= # MVP launch default: paid-first, no free-tier rotation (see core/extractor.py's # USE_FREE_MODELS_FIRST comment). Set to "true" to re-enable free-tier # cycling through FREE_MODELS before falling back to the paid model — # FREE_MODELS is left populated below so that's a one-line switch. OPENROUTER_USE_FREE_MODELS_FIRST=false OPENROUTER_FREE_MODELS=openai/gpt-oss-120b:free,nvidia/nemotron-3-super-120b-a12b:free,meta-llama/llama-3.3-70b-instruct:free OPENROUTER_FALLBACK_MODEL=deepseek/deepseek-v4-flash # Firecrawl (self-hosted) FIRECRAWL_URL=http://firecrawl:3002 # Proxy — Primary (Webshare) WEBSHARE_USER= WEBSHARE_PASS= # Dashboard API token (Authorization: Token ) — a DIFFERENT credential # from WEBSHARE_USER/WEBSHARE_PASS above (those are proxy-gateway auth; this # is for Webshare's account-management REST API, used to list the account's # own dedicated IPs for candidate rotation). Generate from the Webshare # dashboard's API/account section, not the proxy connection settings page. WEBSHARE_API_KEY= # Proxy — Fallback (Bright Data — pay-as-you-go, auto-escalated per domain) BRIGHTDATA_USER= BRIGHTDATA_PASS= # Proxy settings PROXY_ESCALATION_THRESHOLD=2 # Stripe STRIPE_SECRET_KEY= STRIPE_WEBHOOK_SECRET= STRIPE_PRICE_ANALYSE= STRIPE_PRICE_DISCOVER= STRIPE_PRICE_INTELLIGENCE= # Transactional email RESEND_API_KEY= # Error tracking SENTRY_DSN= # Hetzner Object Storage (backups) HETZNER_S3_ACCESS_KEY= HETZNER_S3_SECRET_KEY= HETZNER_S3_ENDPOINT=https://fsn1.your-objectstorage.com HETZNER_S3_BUCKET=bettersight-backups # Gotify (owner monitoring — never client-facing) GOTIFY_URL= GOTIFY_APP_TOKEN= # Google Sheets (existing from app.py — moved here in Phase 2) GOOGLE_SERVICE_ACCOUNT_JSON= SHEET_ID= STANDARD_TAB= NGS_TAB= # Bettersight template Sheet — hosted share URL, served via GET # /account/template (CLAUDE.md §15 Template Import) TEMPLATE_SHEET_URL= # Frontend (Vite) VITE_SENTRY_DSN= VITE_ENV=development