This page is for self-hosters and operators . On the managed cloud
these are already set for you; you only need them if you’re running the
backend yourself.
The backend reads configuration from environment variables (or a .env
file) via backend/app/config/settings.py — the source of truth. Each
variable below is the uppercased form of a settings field.
Production must override the defaults
JWT_SECRET_KEY and SESSION_SECRET_KEY ship with insecure
development defaults and the backend refuses to boot in production
until you change them. Generate one with
python -c "import secrets; print(secrets.token_urlsafe(32))".
Variable Purpose Default ENVIRONMENTdevelopment or production. Production enables strict checks.developmentDEBUGVerbose error output. Turn off in production. trueRATE_LIMIT_ENABLEDPer-IP rate limits on auth endpoints. Set true in production. falseTRIAL_DAYSReverse trial: new workspaces start on Pro for this many days, then drop to Free. 0 disables trials. 14EXECUTION_MODEplaywright (real) or simulate (fake, for dev).playwrightMAX_RUN_SECONDSWall-clock ceiling per run; kills runaway runs. 0 = off. 1800MAX_CONCURRENT_BROWSERSMax live browsers per worker process; excess runs wait for a permit instead of risking out-of-memory. Size to instance RAM. 8FRONTEND_URLBase URL of the web app; used in email links and OAuth redirects. http://localhost:5173CORS_ORIGINSComma-separated allowed origins. Never * in production. localhost dev origins
Variable Purpose Default STORAGE_MODEmemory (ephemeral dev) or database (Postgres). Production uses database.memoryDATABASE_URLAsync Postgres URL (postgresql+asyncpg://…). local Postgres DATABASE_URL_SYNCSync Postgres URL (postgresql://…) for the scheduler jobstore. local Postgres DATABASE_POOL_SIZESQLAlchemy pool size. 5DATABASE_MAX_OVERFLOWExtra connections beyond the pool. 10DATABASE_ECHOLog every SQL statement. false
Variable Purpose Default REDIS_URLEnables shared state, cross-worker WebSocket broadcast, and the run watchdog. Empty = single-worker mode. — WEB_CONCURRENCYNumber of web-server worker processes. server default
Multiple workers need Redis
Running more than one worker without REDIS_URL set breaks
cross-worker coordination (the scheduler can double-fire, WebSocket
events don’t fan out). For more than one worker, set REDIS_URL.
Each AI task picks a provider + model independently. Set the key for any
provider you use.
Variable Purpose Default OPENAI_API_KEYOpenAI key (platform default for visual comparison). — ANTHROPIC_API_KEYAnthropic key. — GROQ_API_KEYGroq key. — GEMINI_API_KEYGoogle Gemini key (platform default for parsing + translation). — OLLAMA_BASE_URLOllama server URL (local models). http://ollama:11434OLLAMA_MODELDefault Ollama model. qwen3:8bPARSING_PROVIDER / PARSING_MODELProvider + model for English → steps. gemini / gemini-3.1-flash-liteTRANSLATION_PROVIDER / TRANSLATION_MODELProvider + model for non-English → English. gemini / gemini-3.1-flash-liteVISUAL_COMPARISON_PROVIDER / VISUAL_COMPARISON_MODELProvider + model for visual diffs. openai / gpt-4o-miniOPENAI_MODELDefault OpenAI model. gpt-4o-miniVISUAL_PIXEL_THRESHOLDPixel-diff fraction below which a visual step passes without a vision call. 0.005BYOK_ENCRYPTION_KEYFernet key that enables per-user BYOK . Empty = BYOK disabled (routes return 503). —
See BYOK for what BYOK_ENCRYPTION_KEY unlocks.
Variable Purpose Default JWT_SECRET_KEYSigns access tokens. Must change in production. dev default (rejected in prod) SESSION_SECRET_KEYSigns sessions. Must change in production. dev default (rejected in prod) JWT_ALGORITHMJWT signing algorithm. HS256JWT_ACCESS_TOKEN_EXPIRE_MINUTESAccess-token lifetime. 30JWT_REFRESH_TOKEN_EXPIRE_DAYSRefresh-token lifetime. 7AUTH_PROVIDERAuth backend. localEMAIL_VERIFICATION_EXPIRE_MINUTESVerification-link lifetime. 15PASSWORD_RESET_EXPIRE_MINUTESPassword-reset-link lifetime. 30
Variable Purpose GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETGoogle sign-in. Both required to enable it. GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRETGitHub sign-in. Both required to enable it.
Configure either SMTP or Resend. Email powers verification, invites, and
run-report notifications.
Variable Purpose Default RESEND_API_KEYUse Resend’s HTTP API for sending. — SMTP_HOST / SMTP_PORTSMTP server. localhost / 1025SMTP_USERNAME / SMTP_PASSWORDSMTP auth. — SMTP_TLS / SMTP_SSLSMTP transport security. false / falseEMAIL_FROM_ADDRESS / EMAIL_FROM_NAMESender identity. noreply@marriska.dev / Marriska
Variable Purpose Default PAYMENT_PROVIDERdev (self-confirm bypass, rejected in production), stripe, or paddle.devSTRIPE_SECRET_KEY / STRIPE_WEBHOOK_SECRETStripe credentials (both needed for Stripe). — PADDLE_API_KEY / PADDLE_WEBHOOK_SECRETPaddle credentials. — PADDLE_ENVIRONMENTsandbox or production.sandboxPADDLE_PRICE_<TIER>_<CYCLE>Paddle price IDs, e.g. PADDLE_PRICE_PRO_MONTHLY. —
Variable Purpose SENTRY_DSNEnables Sentry error reporting (production).
The marriska-runner and marriska-agent CLIs read their own variables
— MARRISKA_API_KEY, MARRISKA_API_URL, MARRISKA_WS_URL. They’re
documented in the CLI reference .