Skip to content

Environment variables

Every variable each service actually reads, from os.Getenv (ingestion) and process.env (worker). The drift check fails the repository test gate (pnpm test, which CI runs) if code and this page disagree.

VariableRequiredPurpose
DATABASE_URLyesPostgres connection string
PORTno (8080)HTTP listen port
JWT_SECRETyesSigns session tokens (≥32 bytes)
DASHBOARD_DIRnoDirectory of built dashboard SPA to serve (set in the Docker image)
DASHBOARD_ORIGINnoAllowed dashboard origin for CORS and the OAuth redirect target. For the bundled Compose setup, set http://localhost:8082.
GITHUB_APP_IDfor GitHub AppApp ID
GITHUB_APP_CLIENT_IDfor OAuth sign-inOAuth client ID
GITHUB_APP_CLIENT_SECRETfor OAuth sign-inOAuth client secret
GITHUB_APP_PRIVATE_KEYfor GitHub AppApp private key (PEM)
GITHUB_APP_SLUGnoApp slug used in install URLs
GITHUB_WEBHOOK_SECRETfor webhooksHMAC secret for webhook verification
REPLAY_STORE_ENDPOINT / REPLAY_STORE_PUBLIC_ENDPOINTfor replaysS3-compatible endpoint (internal / browser-visible)
REPLAY_STORE_ACCESS_KEY / REPLAY_STORE_SECRET_KEYfor replaysStorage credentials
REPLAY_STORE_BUCKET / REPLAY_STORE_REGIONfor replaysBucket and region
INTERNAL_READ_TOKENfor worker replay evidenceShared secret guarding worker-to-ingestion chunk reads. Unset disables the internal endpoint.
SESSION_IDLE_CLOSE_MINUTESno (30)Idle minutes before a recording session closes and its session_analysis job is enqueued (friction detection producer)
RETENTION_SWEEP_INTERVAL_SECONDSno (3600)How often the retention sweeper runs (session close + expiry pass)
ADMIN_EMAILSnoComma-separated operator email allowlist for the cross-tenant admin dashboard. Empty disables the admin API. Docker Compose maps it from the host-side OPSLANE_ADMIN_EMAILS.
VERSIONnoReported by /health

Ingestion reads only the REPLAY_STORE_* names; MINIO_* names appear in its test code, not runtime configuration.

VariableRequiredPurpose
DATABASE_URLyes (hard exit without it)Postgres connection string
INGESTION_BASE_URLfor session replay evidenceBase URL used to fetch decoded, re-redacted session chunks from ingestion
INTERNAL_READ_TOKENfor session replay evidenceShared secret sent to ingestion as X-Internal-Token
ANTHROPIC_API_KEYfor investigationClaude API access; missing → missing_llm_key outcomes
E2B_API_KEYfor verificationSandbox where fixes are tested
GITHUB_TOKENone of the two GitHub modesPAT for clone + PR
GITHUB_APP_ID / GITHUB_APP_PRIVATE_KEYthe other modeGitHub App installation tokens
DASHBOARD_URL / DASHBOARD_ORIGINnoLinks in PR bodies and notifications
WORKER_IDno (generated)Stable worker identity for lease ownership
POLL_INTERVAL_MS / LEASE_DURATION_MS / REAPER_INTERVAL_MS / SILENCE_CHECK_INTERVAL_MSnoQueue tuning
RESOLVE_AGE_DAYSno (14)Days without a new occurrence before needs_human and investigated issues are auto-resolved
INACTIVITY_CHECK_INTERVAL_MSno (900000)How often the worker sweeps for inactive issues (15 minutes by default)
SESSION_ANALYSIS_MAX_CONCURRENTno (2)Fleet-wide cap on concurrently claimed session_analysis jobs; 0 disables analysis claiming entirely
HEALTH_PORTno (8081)Health endpoint port
REPLAY_STORE_ENDPOINT / REPLAY_STORE_ACCESS_KEY / REPLAY_STORE_SECRET_KEY / REPLAY_STORE_BUCKETfor replay analysisReading stored replays
MINIO_ENDPOINT / MINIO_ACCESS_KEY / MINIO_SECRET_KEY / MINIO_BUCKETlegacy aliasesWorker-side fallback names for the same settings
LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY / LANGFUSE_BASE_URL / LANGFUSE_PROJECT_IDnoOptional LLM tracing
ANTHROPIC_BASE_URLno (Anthropic default)Alternate Claude API endpoint; used by the hermetic test harness’s fake model server
OPSLANE_SANDBOX_BACKENDno (e2b)Fix-verification sandbox backend; local is only for trusted reliability fixtures and also requires OPSLANE_RELIABILITY_HARNESS=1
OPSLANE_RELIABILITY_HARNESSnoExplicit guard required before the non-isolating local sandbox test transport can run
OPSLANE_GITHUB_URLno (https://github.com)Alternate git host for clones; used by tests and self-hosted git
OPSLANE_GITHUB_API_URLno (GitHub default)Alternate GitHub REST API base URL for PR creation

The worker starts with only DATABASE_URL and logs a warning for missing ANTHROPIC_API_KEY, E2B_API_KEY, and GITHUB_TOKEN — jobs then end in explicit needs_human states rather than crashing.

Set in Compose but consumed by no code (known dead config)

Section titled “Set in Compose but consumed by no code (known dead config)”
VariableStatus
ALLOW_REGISTRATIONRead by nothing; there is no self-serve registration path (sign-in is GitHub OAuth).
OPSLANE_ADMIN_EMAILSHost-side name that docker-compose.yml maps into the ingestion service’s ADMIN_EMAILS; consumed by Compose interpolation, not read by code directly.
ENCRYPTION_KEYRead by nothing except a sandbox scrub list; at-rest token encryption is not implemented (see trust).