example/.env.example is the canonical, always-current documentation:
# Template for `example/.env` — the values docker-compose substitutes.# Copy to `.env` and adjust. For local dev the defaults below are fine.# PostgresPOSTGRES_USER=toolkitPOSTGRES_PASSWORD=toolkit_local_pwPOSTGRES_DB=toolkitPOSTGRES_PORT=5433# MinIO (S3-compatible object storage)MINIO_ROOT_USER=toolkitMINIO_ROOT_PASSWORD=toolkit_local_pwMINIO_API_PORT=9000MINIO_CONSOLE_PORT=9001MINIO_BUCKET=uploads# pgweb (offline DB-browser, opt-in): docker compose --profile tools up -d pgwebPGWEB_PORT=8081# Azure Blob (alternative storage driver). Locally MinIO above is used; the# Azure deploy sets these as app settings via Bicep (infra/main.bicep), which# switches @repo/storage to the Blob driver. Only fill them in# here to test that driver against a real storage account.AZURE_STORAGE_ACCOUNT=AZURE_STORAGE_KEY=AZURE_STORAGE_CONTAINER=uploads# Hatchet (background jobs). Optional — leave unset to boot without background# processing (uploads simply aren't enqueued). Bring up the engine with# `docker compose up -d`, then mint a token from the dashboard# (http://localhost:8080 → Settings → API Tokens) or the admin CLI (see# docker-compose.yml) and paste it into `.env.local`. The Hatchet engine and# dashboard run on their own Postgres (separate from the app DB above).HATCHET_CLIENT_TOKEN=# Local hatchet-lite speaks plaintext gRPC — without this the SDK tries TLS# and fails with "h2 is not supported".HATCHET_CLIENT_TLS_STRATEGY=noneHATCHET_CLIENT_HOST_PORT=localhost:7077HATCHET_DASHBOARD_PORT=8080HATCHET_POSTGRES_PORT=5435# AI provider (@repo/ai). Optional — with neither set, chat endpoints return a# clear error and briefing/document-analysis fall back to stubs. OLLAMA_BASE_URL# wins when both are set (explicit on-prem intent). AI_MODEL overrides the# per-provider default (OpenRouter: anthropic/claude-sonnet-4.5, Ollama: llama3.1).# Real values belong in `.env.local`.# Hosted: OPENROUTER_API_KEY=sk-or-...# On-prem/air-gapped: OLLAMA_BASE_URL=http://localhost:11434OLLAMA_BASE_URL=AI_MODEL=# Real email delivery (nodemailer). Optional — leave SMTP_HOST unset and every# mail is only recorded to the in-app outbox (mailbox table + console), which# is the dev default. Same graceful-degradation contract as Hatchet above.# Real values belong in `.env.local`, like other secrets.# Hosted (Mailgun): SMTP_HOST=smtp.mailgun.org SMTP_PORT=587# SMTP_USER=postmaster@<domain> SMTP_PASS=<smtp password># On-prem/air-gapped: SMTP_HOST=<internal relay> (often no SMTP_USER/PASS)SMTP_HOST=SMTP_PORT=587SMTP_SECURE=falseSMTP_USER=SMTP_PASS=MAIL_FROM="Toolkit <no-reply@example.com>"# ── Cache / rate-limit store (optional) ─────────────────────────────# Valkey from the compose default profile. Without it @repo/cache no-ops and# auth rate limits fall back to per-process memory.VALKEY_URL=redis://localhost:6380VALKEY_PORT=6380# ── Monitoring (optional) ───────────────────────────────────────────# Exposes Prometheus metrics at /api/metrics and turns on the HTTP# histogram middleware. Scraped by the compose monitoring profile:# docker compose --profile monitoring up -dMETRICS_ENABLED=true# Extra origins trusted by Better Auth when behind a proxy (comma-separated).TRUSTED_ORIGINS=GRAFANA_PORT=3001PROMETHEUS_PORT=9090# ── Enterprise sign-in (optional) ───────────────────────────────────# Local IdPs as code: docker compose --profile idp up -d# LDAP — directory sign-in (lldap locally, AD in production)LDAP_ENABLED=trueLDAP_URL=ldap://localhost:3890LDAP_BIND_DN=uid=admin,ou=people,dc=example,dc=comLDAP_BIND_PASSWORD=admin_lldap_pwLDAP_USER_SEARCH_BASE=ou=people,dc=example,dc=comLDAP_ATTR_USERNAME=uid# OIDC — SSO (Dex locally; Entra ID / ADFS / Keycloak in production)OIDC_DISCOVERY_URL=http://localhost:5556/dex/.well-known/openid-configurationOIDC_CLIENT_ID=toolkitOIDC_CLIENT_SECRET=toolkit-dev-secretLLDAP_LDAP_PORT=3890LLDAP_UI_PORT=17170DEX_PORT=5556# ── Realtime / server-push (optional) ───────────────────────────────# Centrifugo from the realtime profile: docker compose --profile realtime up -d# Secrets must match the engine's (see docker-compose.yml).CENTRIFUGO_TOKEN_HMAC_SECRET=local-dev-centrifugo-hmac-secretCENTRIFUGO_API_KEY=local-dev-centrifugo-api-keyCENTRIFUGO_API_URL=http://localhost:8000/apiCENTRIFUGO_WS_URL=ws://localhost:8000/connection/websocketCENTRIFUGO_PORT=8000# ── Collaborative editing (optional) ────────────────────────────────# Yjs websocket sync server: docker compose --profile collab up -d# Without it @repo/collab falls back to a local-only doc (no sync).COLLAB_WS_URL=ws://localhost:1234COLLAB_PORT=1234