Configuration is environment-only, validated strictly at boot: a missing required variable
fails fast with a clear message rather than starting a half-configured desk. Values live in
the deploy/.env file, which is git-ignored — never in the committed templates.
| Variable | Required | Meaning |
|---|
NODE_ENV | no | production on a server |
APP_NAME | no | The deployment’s display name (white-label) |
APP_URL | yes | Public URL of the desk — used in links and OAuth callbacks |
FRONTEND_URL | yes | Public URL of the frontend (usually the same) |
| Variable | Required | Meaning |
|---|
DATABASE_URL | yes | PostgreSQL connection string |
DIRECT_URL | no | Direct (non-pooled) URL, if DATABASE_URL goes through a pooler |
REDIS_HOST / REDIS_PORT | yes | Redis location |
REDIS_PASSWORD | no | If your Redis requires auth |
| Variable | Required | Meaning |
|---|
JWT_PRIVATE_KEY / JWT_PUBLIC_KEY | recommended | RSA pair signing sessions. Generated at first boot if absent — set your own for production |
COOKIE_SECRET | recommended | Cookie signing secret — same generation rule |
OAUTH_ENCRYPTION_KEY | yes with integrations | Encrypts stored OAuth/IMAP/AI credentials at rest |
The platform-level sender, used until organizations configure
their own sending — and always for password resets:
| Variable | Meaning |
|---|
SMTP_HOST / SMTP_PORT / SMTP_SECURE | Server and TLS mode |
SMTP_USERNAME / SMTP_PASSWORD | Credentials, if the server requires them |
SMTP_FROM | Default From address |
| Variable | Meaning |
|---|
CORS_ORIGINS | Extra allowed browser origins, comma-separated |
RATE_LIMIT_TTL / RATE_LIMIT_LIMIT | Request rate limiting window and budget |
LOG_LEVEL | info by default; debug enables per-call diagnostics |
OTEL_ENABLED / OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry export, if you run a collector |
SWAGGER_ENABLED | Serve the interactive API explorer |
Compose-level variables (POSTGRES_PASSWORD, exposure ports…) are documented inline in
deploy/docker-compose.yml.