Skip to content

Configuration

Overslash is configured exclusively through environment variables. Three are required to boot — DATABASE_URL, SECRETS_ENCRYPTION_KEY, and SIGNING_KEY; everything else (OAuth providers, billing, email, log level) is optional and degrades gracefully when omitted. The canonical list lives in .env.example in the source repo and in Reference → Configuration.

Configuration is read once at startup by Config::from_env(). Missing required variables — and missing dependencies of an enabled feature — cause the process to exit immediately with an error (validate_env), so a misconfigured deploy fails fast rather than booting half-broken.

Required variables

These three must be set or the server will not start.

VariableNotes
DATABASE_URLPostgreSQL connection string, e.g. postgres://user:pass@host:5432/overslash. See Database.
SECRETS_ENCRYPTION_KEY64-character hex (32 bytes). Master key that AES-256-GCM-encrypts every secret in the vault. Generate with openssl rand -hex 32. See Keys & Rotation.
SIGNING_KEY64-character hex (32 bytes). Signs OAuth and session tokens. Generate with openssl rand -hex 32.

Conditionally required

These become required only when you enable the feature they belong to. Enabling the feature without them trips validate_env and the server exits at startup.

VariableRequired whenNotes
STRIPE_SECRET_KEYCLOUD_BILLING=trueStripe API secret key.
STRIPE_WEBHOOK_SECRETCLOUD_BILLING=trueVerifies inbound Stripe webhooks.
EMAIL_API_KEYEMAIL_PROVIDER is setProvider API key (e.g. Resend).
EMAIL_FROMEMAIL_PROVIDER is setSender address.

Optional variables

All optional variables have safe defaults. They are grouped by concern below.

Networking & URLs

VariableDefaultNotes
HOST0.0.0.0Bind address.
PORT8080 (serve) / fallback for webListen port. overslash web resolves --portOVERSLASH_WEB_PORTPORT7171.
PUBLIC_URLderived from HOST/PORTExternal base URL; set this behind a proxy so OAuth redirects resolve.
DASHBOARD_ORIGIN*localhost*Allowed dashboard origin(s) for CORS. Set explicitly in production.
DASHBOARD_URL/Where the API redirects to reach the dashboard.
APP_HOST_SUFFIXApex for the dashboard subdomain, e.g. app.overslash.com.
API_HOST_SUFFIXApex for the programmatic surface, e.g. api.overslash.com.
SESSION_COOKIE_DOMAINe.g. .overslash.com to share sessions across subdomains.
MCP_EXTRA_ORIGINSComma-separated extra origins allowed on /mcp + OAuth endpoints.

Authentication & org control

VariableDefaultNotes
GOOGLE_AUTH_CLIENT_ID / GOOGLE_AUTH_CLIENT_SECRETShared Google OAuth app for Overslash-managed sign-in. Leave unset to require each org to register its own.
GITHUB_AUTH_CLIENT_ID / GITHUB_AUTH_CLIENT_SECRETSame, for GitHub.
DEV_AUTHunsetWhen set, enables /auth/dev/token (a dev login). Leave unset in production.
ALLOW_ORG_CREATIONtrueSet false to lock down org creation after initial setup.
SINGLE_ORG_MODEWhen set to an org slug, scopes all requests to that org.

Limits & timeouts

VariableDefaultNotes
APPROVAL_EXPIRY_SECS1800How long a pending approval stays open.
EXECUTION_PENDING_TTL_SECS900TTL for a pending execution awaiting approval.
EXECUTION_REPLAY_TIMEOUT_SECS30Replay window for a resumed execution.
DEFAULT_RATE_LIMIT1000Requests per window (default scope).
DEFAULT_RATE_WINDOW_SECS60Rate-limit window length.
MAX_RESPONSE_BODY_BYTES5242880Max upstream response body (5 MB).
FILTER_TIMEOUT_MS2000Response-filter evaluation timeout.

Billing (Stripe)

VariableDefaultNotes
CLOUD_BILLINGfalseSet true to enable Stripe billing (then the Stripe secrets above are required).
STRIPE_EUR_LOOKUP_KEYoverslash_seat_eurStripe Price lookup key (EUR).
STRIPE_USD_LOOKUP_KEYoverslash_seat_usdStripe Price lookup key (USD).

Transactional email

VariableDefaultNotes
EMAIL_PROVIDERCurrently resend. Unset = no-op mailer (boots cleanly).
EMAIL_FROMSender address (required when EMAIL_PROVIDER set).
EMAIL_REPLY_TOReply-to; falls back to the provider default.

Infrastructure & keys

VariableDefaultNotes
REDIS_URLValkey/Redis for caching and pub-sub. Recommended with multiple replicas.
SECRETS_ENCRYPTION_KEY_PREVIOUSPrevious master key, decrypt-only, set during a key rotation. See Keys & Rotation.
SECRETS_ENCRYPTION_KEY_ACTIVE_ID1Version byte stamped on new ciphertext. Bump on every rotation.
SECRETS_ENCRYPTION_KEY_PREVIOUS_IDactive_id − 1Version byte of the previous key.
OVERSLA_SH_BASE_URL / OVERSLA_SH_API_KEYBase URL and key for the short-link service.

Logging

VariableDefaultNotes
RUST_LOGinfoLog level / filter, e.g. info or info,overslash_metrics=debug. See Monitoring.
OVERSLASH_ENVDeployment marker (e.g. dev, prod) surfaced in logs/tooling.

Deprecated & internal-only

There are no formally deprecated variables today.

A handful of variables exist only for testing or as escape hatches and must not be set in production: OVERSLASH_DANGER_READ_AUTH_SECRET_FROM_ENVVARS, OVERSLASH_SSRF_ALLOW_PRIVATE, OVERSLASH_SERVICE_BASE_OVERRIDES, and PREVIEW_ORIGIN_ALLOWLIST. They relax safety checks (SSRF protection, OAuth origin allowlisting) and are intended for local development and CI only.

Profiles for multiple environments

Overslash reads .env automatically if present, so the simplest pattern is one .env file per environment, built from the template:

bash
cp .env.example .env
# edit DATABASE_URL, SECRETS_ENCRYPTION_KEY, SIGNING_KEY, …

For deployed environments, inject variables through your platform's secret store (Secret Manager, Kubernetes Secret, Compose .env) rather than committing them. Set OVERSLASH_ENV (e.g. dev, prod) to mark the deployment in logs and tooling.

Pre-release software — subject to change without notice.