# Periscope Backend — Environment Variables # Copy to backend/.env and fill in values. Only DEEPSEEK_API_KEY is required. # -- AI (DeepSeek, default) -------------------------------------------------- # Key from https://platform.deepseek.com/ DEEPSEEK_API_KEY=sk-... DEEPSEEK_BASE_URL=https://api.deepseek.com DEEPSEEK_MODEL=deepseek-flash DEEPSEEK_VISION_MODEL=deepseek-flash # enabled (default) | disabled — thinking mode on DeepSeek V4 DEEPSEEK_THINKING=enabled # Official values: low | high | max DEEPSEEK_REASONING_EFFORT=high # PDF ingest (DeepSeek cannot take native PDFs) # DEEPSEEK_PDF_MAX_CHARS=500000 # DEEPSEEK_PDF_IMAGE_PAGES=32 # Per-stage DeepSeek model overrides (leave empty to use the defaults below) # V4.1 Flash is natively multimodal — extraction and review share deepseek-flash. # MODEL_PINTABLE_DEEPSEEK=deepseek-flash # MODEL_PATTERN_DEEPSEEK=deepseek-flash # MODEL_SPECS_DEEPSEEK=deepseek-flash # MODEL_VALIDATION_DEEPSEEK=deepseek-flash # MODEL_AUTO_RESOLVE_DEEPSEEK=deepseek-flash # MODEL_NORMALIZE_DEEPSEEK=deepseek-flash # -- AI provider routing ----------------------------------------------------- # Default provider for every stage; per-stage env vars override. # Valid values: deepseek | gemini (anthropic is ignored and coerced to deepseek) PROVIDER_DEFAULT=deepseek # PROVIDER_VALIDATION=deepseek # PROVIDER_AUTO_RESOLVE=deepseek # Anthropic is not used. Do not set ANTHROPIC_API_KEY. # -- Gemini (optional) ------------------------------------------------------- # GEMINI_API_KEY= # GEMINI_MODEL=gemini-3-flash-preview # MODEL_VALIDATION_GEMINI= # -- Per-stage fallback ------------------------------------------------------ # If set, the stage retries once. Anthropic is ignored (DeepSeek only). # FALLBACK_PROVIDER_VALIDATION=deepseek # FALLBACK_MODEL_VALIDATION=deepseek-flash # -- Storage ----------------------------------------------------------------- # Set GCS_BUCKET to store projects/library in Google Cloud Storage. # Leave empty for local mode (uses the data/ directory). GCS_BUCKET= # -- CORS -------------------------------------------------------------------- # Frontend URL(s), JSON list CORS_ORIGINS=["http://localhost:3000","http://127.0.0.1:3000","http://localhost:18742","http://127.0.0.1:18742"] # -- Auth (self-host) -------------------------------------------------------- # Set AUTH_JWT_SECRET to enable Periscope email/password accounts and # multi-user project collaborators (invite by email). Clerk keys, if set, # take priority over local auth. # AUTH_JWT_SECRET=change-me-to-a-long-random-string # Comma-separated emails that are admin on register (first user is always admin) # AUTH_ADMIN_EMAILS=you@example.com # -- Clerk (optional cloud auth) --------------------------------------------- # CLERK_SECRET_KEY= # CLERK_PUBLISHABLE_KEY= # CLERK_JWKS_URL= # Optional catalog datasheet source and parameter-based passive auto-resolve. # Order: BOM URL → LCSC → manufacturer PDF URLs → Mouser → DigiKey. # DIGIKEY_CLIENT_ID= # DIGIKEY_CLIENT_SECRET= # DIGIKEY_ENVIRONMENT=production # DIGIKEY_LOCALE_SITE=US # DIGIKEY_LOCALE_LANGUAGE=en # DIGIKEY_LOCALE_CURRENCY=USD # -- Mouser (optional) ------------------------------------------------------- # Search API key from mouser.com/api-hub. Same family/packing match as DigiKey. # MOUSER_API_KEY= # -- Email notifications (optional) ------------------------------------------ # Gmail API via domain-wide delegation. Leave EMAIL_SENDER empty to disable. # Service account credentials come from GOOGLE_APPLICATION_CREDENTIALS. EMAIL_SENDER= EMAIL_FRONTEND_URL= # Fixed admin email for pipeline-started notifications (leave empty to disable) EMAIL_ADMIN_NOTIFY= # Recipient for /api/contact form submissions (leave empty to disable) CONTACT_RECIPIENT=