Skip to content

Environment Variables

This document catalogues every environment variable consumed by the Orcheo project and the components that rely on them. Unless noted otherwise, backend services read configuration via Dynaconf with the ORCHEO_ prefix.

Core runtime configuration (backend)

Variable Default Valid values Purpose
ORCHEO_CHECKPOINT_BACKEND postgres postgres Selects the checkpoint persistence backend consumed by config/loader.py.
ORCHEO_GRAPH_STORE_BACKEND postgres postgres Selects the LangGraph store backend used for graph memory/state storage (config/loader.py, persistence.py).
ORCHEO_POSTGRES_DSN none PostgreSQL DSN (e.g. postgresql://user:pass@host:port/db) Connection string required when any backend is set to postgres (checkpoint, graph store, repository, workspace, auth service tokens, chatkit, or vault; see config/loader.py).
ORCHEO_POSTGRES_POOL_MIN_SIZE 1 Integer ≥ 1 Connections each pool keeps open. A process holds one shared pool for workflow, history, ChatKit, token, plugin, and Agentensor stores, one each for LangGraph checkpoints and the graph store, one for workspace and identity, and one for the vault.
ORCHEO_POSTGRES_POOL_MAX_SIZE 10 Integer ≥ 1 Upper bound for each of those pools. Keep the total across the backend and every worker process within a session-mode pooler's client limit.
ORCHEO_POSTGRES_POOL_TIMEOUT 5.0 Float > 0 Seconds to wait for a free pooled connection before failing.
ORCHEO_POSTGRES_POOL_MAX_IDLE 240.0 Float > 0 Seconds an idle connection above the minimum stays open.
ORCHEO_POSTGRES_CONNECT_TIMEOUT 10 Integer ≥ 2 Seconds allowed for each new PostgreSQL connection attempt; libpq interprets a 1-second timeout as 2 seconds.
ORCHEO_POSTGRES_KEEPALIVES_IDLE 30 Integer ≥ 1 Seconds of TCP inactivity before keepalive probes begin. TCP keepalives are enabled for all PostgreSQL pools.
ORCHEO_POSTGRES_KEEPALIVES_INTERVAL 10 Integer ≥ 1 Seconds between TCP keepalive probes.
ORCHEO_POSTGRES_KEEPALIVES_COUNT 3 Integer ≥ 1 Unanswered TCP keepalive probes before the connection is considered dead.
ORCHEO_POSTGRES_TCP_USER_TIMEOUT_MS 30000 Integer ≥ 1 Milliseconds transmitted TCP data may remain unacknowledged before closing the connection. Applies where the OS supports TCP_USER_TIMEOUT (including Linux); ignored on unsupported systems.
ORCHEO_IDENTITY_POSTGRES_STATEMENT_TIMEOUT_MS 10000 Integer ≥ 1 Per-statement identity query budget, in milliseconds. Applied transaction-locally; excludes schema initialization and other stores.
ORCHEO_IDENTITY_POSTGRES_LOCK_TIMEOUT_MS 3000 Integer ≥ 1 Identity lock acquisition budget, in milliseconds. Applied transaction-locally.
ORCHEO_REPOSITORY_BACKEND postgres postgres Chooses the workflow repository implementation (config/loader.py).
ORCHEO_WORKSPACE_BACKEND postgres postgres Chooses the workspace repository implementation used for workspaces and memberships (config/loader.py, app/workspace/dependencies.py).
ORCHEO_CHATKIT_BACKEND postgres postgres Selects the ChatKit persistence backend used by chatkit/server.py.
ORCHEO_CHATKIT_STORAGE_PATH ~/.orcheo/chatkit Directory path Filesystem root for ChatKit attachments (config/loader.py).
ORCHEO_CHATKIT_MAX_UPLOAD_SIZE_BYTES 5000000 Positive integer Maximum upload size (bytes) accepted by the ChatKit upload endpoint (routers/chatkit.py, config/loader.py).
ORCHEO_CHATKIT_CDN_BASE_URL https://cdn.platform.openai.com/ HTTP(S) URL Overrides the upstream CDN base used by the ChatKit asset proxy routes (chatkit_asset_proxy.py).
ORCHEO_CHATKIT_RETENTION_DAYS 30 Positive integer Retention window (in days) used by the ChatKit cleanup task (chatkit_runtime.py).
ORCHEO_CHATKIT_WIDGET_TYPES ["Card","ListView"] Comma/JSON list of widget root types Allow-list of widget roots the ChatKit server will hydrate into thread items (chatkit/server.py).
ORCHEO_CHATKIT_WIDGET_ACTION_TYPES ["submit"] Comma/JSON list of action types Widget action types the ChatKit server will dispatch back to workflows (chatkit/server.py).
ORCHEO_HOST 0.0.0.0 Hostname or IP string Network interface to bind the FastAPI app (config/loader.py).
ORCHEO_PORT 2025 Integer (1‑65535) TCP port exposed by the FastAPI service (config/loader.py).
ORCHEO_CORS_ALLOW_ORIGINS ["http://localhost:2026","http://127.0.0.1:2026"] JSON array or comma-separated list of origins CORS allow-list used when constructing the FastAPI middleware (factory.py). orcheo install --public-ingress sets this to the shared public HTTPS origin and keeps localhost origins when local access ports remain enabled. Tunnel or split-origin installs should set this to the public Studio/browser origin instead of the backend API origin.
ORCHEO_MCP_ENABLED true Boolean (1/0, true/false, yes/no, on/off) Serves the built-in MCP server at /api/mcp (Streamable HTTP, stateless) so MCP clients can remote-control workflows, runs, credentials and workspaces with the caller's own token (app/mcp_server/server.py). Clients sign in with OAuth through the Studio login, or send a service token. Set to false to return 404 on that path. See MCP Server.
ORCHEO_PUBLIC_URL none HTTP(S) origin Public origin where the backend's /api is reachable, used for the MCP server's OAuth issuer, resource and discovery URLs (app/oauth/urls.py). When unset, X-Forwarded-Proto/X-Forwarded-Host are used behind a trusted proxy (ORCHEO_TRUSTED_PROXY), otherwise the request origin. OAuth sign-in needs an HTTPS origin (plain HTTP only on localhost); otherwise MCP clients must use service tokens. orcheo install sets it for the bundled stack when public ingress is enabled; otherwise set it to the same value as ORCHEO_STUDIO_URL.
ORCHEO_UPDATE_CHECK_TIMEOUT_SECONDS 3.0 Float > 0 Timeout for backend package registry lookups used by /api/system/info (app/versioning.py).
ORCHEO_UPDATE_CHECK_RETRIES 1 Integer ≥ 0 Retry count for backend package registry lookups used by /api/system/info (app/versioning.py).
ORCHEO_STUDIO_VERSION none Version string (for example 0.8.1) Optional current Studio version reported by /api/system/info to compare with npm latest (app/versioning.py).
ORCHEO_TRACING_EXPORTER none none, console, or otlp Selects the tracing exporter configured by tracing/provider.py.
ORCHEO_TRACING_ENDPOINT none HTTP(S) URL Optional OTLP/HTTP collector endpoint (include /v1/traces) consumed by tracing/provider.py.
ORCHEO_TRACING_SERVICE_NAME orcheo-backend String Resource attribute attached to every span (config/defaults.py).
ORCHEO_TRACING_SAMPLE_RATIO 1.0 Float 0.0‑1.0 Probability used by the trace sampler (tracing/provider.py).
ORCHEO_TRACING_INSECURE false Boolean (1/0, true/false, etc.) Allows insecure OTLP connections when set to true (tracing/provider.py).
ORCHEO_TRACING_HIGH_TOKEN_THRESHOLD 1000 Positive integer Token usage threshold that emits token.chunk events (tracing/workflow.py).
ORCHEO_TRACING_PREVIEW_MAX_LENGTH 512 Positive integer ≥ 16 Maximum characters retained for prompt/response previews (tracing/workflow.py).
ORCHEO_TRACE_RETENTION_DAYS 7 Integer ≥ 0 Days to keep workflow traces. Traces are built from execution history, so a background task in the backend (history/retention.py) deletes finished execution histories — and their trace steps — whose completed_at is older than this window. The first sweep runs 5 minutes after startup, then every 6 hours. In-progress runs are never deleted. Set to 0 to keep traces forever.
ORCHEO_WORKFLOW_DEFINITION_MODE unrestricted restricted or unrestricted Selects how uploaded workflow.py files are ingested and executed. restricted compiles every upload to a frozen IR (no author code runs at ingestion) and runs CodeNode bodies in the MicroPython-WASM sandbox; unrestricted keeps today's in-process load_graph_from_script path and is not tenant-safe. In restricted mode built-in nodes that make outbound HTTP or SMTP requests additionally apply an SSRF egress guard: only targets whose host resolves to a public address are allowed, and requests to loopback/link-local/private/reserved/metadata addresses (including HTTP redirects) are rejected. restricted mode also rejects nodes whose registry metadata sets restricted=True; browser (Playwright), PostgresNode, and file-backed document/dataset loader nodes are currently marked restricted. MongoDB and guarded email/webhook nodes remain available. Curated first-party candidate onboarding is exempt from node rejection (it passes trusted_source=True). The runtime default is unrestricted; orcheo install writes restricted for a trusted HTTPS backend and unrestricted for local-hosting or untrusted-HTTP deployments. See Sandboxed Custom Workflows (config/loader.py, graph/ir/definition_mode.py, graph/ir/node_policy.py, security/ssrf.py, cli/setup.py).
ORCHEO_CHATKIT_PUBLIC_BASE_URL none HTTP(S) URL Optional frontend origin used when generating ChatKit share links in the backend API responses and the CLI/MCP; defaults to ORCHEO_API_URL with any /api suffix removed when unset in the CLI/MCP (publish.py). One-off overrides can be supplied via orcheo workflow publish --studio-url.
ORCHEO_CHATKIT_ATTACHMENT_BASE_URL http://localhost:2025 in compose stacks HTTP URL Base URL used by ChatKit attachment helpers to resolve bytes and upload content against the backend. Leave unset to fall back to ORCHEO_API_URL/ORCHEO_API_BASE_URL.
ORCHEO_CANDIDATES_REPO AI-Colleagues/colleague-candidates GitHub owner/repo Candidate colleague catalog fetched by /api/candidates (app/candidates_service.py).
ORCHEO_CANDIDATES_REPO_REF main Branch, tag, or commit ref Candidate catalog ref fetched by /api/candidates; set this to a staging branch such as test-updating to validate candidate metadata and update notes before merging (app/candidates_service.py).
ORCHEO_CANDIDATES_GITHUB_TOKEN none GitHub token Optional token used when fetching the candidate catalog tarball, useful for private repos or higher GitHub API limits (app/candidates_service.py).

Studio frontend configuration

Variable Default Valid values Purpose
VITE_ORCHEO_BACKEND_URL http://localhost:2025 HTTP(S) URL Base URL for the Orcheo backend API used by Studio. Public-ingress installs set this to the shared public origin (for example, https://orcheo.example.com).
VITE_ORCHEO_AUTH_DISABLED false Boolean (true/false) When true, the Studio login gate is bypassed entirely — for self-host/dev deployments running the backend with ORCHEO_AUTH_MODE=disabled. Leave unset/false in production so the first-party email login screen is required.
VITE_ORCHEO_APPS_BASE_DOMAIN beta.orcheo.cloud DNS hostname Base domain Studio uses to display hosted-app URLs. Stack deployments populate it from ORCHEO_APPS_BASE_DOMAIN; set that operator-facing variable for self-hosted domains.
VITE_ORCHEO_CHATKIT_DOMAIN_KEY none String ChatKit domain key used by Studio public chat surfaces. Setup prompts for this value; if left unset/placeholder, ChatKit UI features remain disabled until configured.
VITE_ORCHEO_CHATKIT_DEFAULT_DOMAIN_KEY domain_pk_localhost_dev String Dev-only fallback domain key used when neither VITE_ORCHEO_CHATKIT_DOMAIN_KEY nor runtime window.__ORCHEO_CONFIG__.chatkitDomainKey is provided (features/chatkit/lib/chatkit-client.ts).
VITE_ORCHEO_ALLOWED_HOSTS localhost,127.0.0.1 Comma-separated hostnames Hostnames the Studio server will accept requests for (maps to server.allowedHosts in vite.config.ts). Public-ingress installs append the configured public hostname. Tunnel or custom split-origin installs should include the public Studio hostname here.

Hosted Apps

Interactive orcheo install uses local defaults without additional Hosted Apps questions when the resolved backend URL is loopback (localhost, a *.localhost name, or a loopback IP address). When the resolved backend URL is non-local, the installer asks whether to enable Hosted Apps and, when enabled, prompts for the base domain and trusted proxy boundary. Hosted Apps defaults to enabled. Existing values are offered as defaults during upgrades. TLS paths are not prompted: CLI options or existing values win, followed by the fixed ~/.orcheo/tls/ defaults shown below.

Variable Default Valid values Purpose
ORCHEO_HOSTED_APPS_ENABLED false in the runtime; true for installed stacks Boolean Globally enables Hosted Apps. Interactive installs ask Enable Hosted Apps? with Yes as the default.
ORCHEO_APPS_BASE_DOMAIN apps.localhost locally; public/backend hostname for new non-local installs Bare DNS name such as example.com Base domain beneath which one-label app aliases are served. Do not include a scheme or *. prefix. Prefer the DNS zone apex (for example, orcheo.cloud) so aliases such as app-test-dashboard.orcheo.cloud remain first-level names covered by Cloudflare Universal SSL. Existing values are preserved during upgrades.
ORCHEO_HOSTED_APPS_WORKSPACE_ALLOWLIST Empty (all workspaces) Comma-separated workspace IDs Restricts Hosted Apps rollout to selected workspaces. It is preserved from an existing stack or set with --hosted-apps-workspace-allowlist; interactive setup does not prompt for it.
ORCHEO_APP_TRUSTED_PROXY_CIDRS Empty locally; 172.16.0.0/12 installer default for non-local backends Comma-separated IPv4/IPv6 CIDRs Proxies from which the app gateway accepts forwarded client-address information. Prompted for non-local backends and must be configured together with ORCHEO_APP_TRUSTED_PROXY_HOPS.
ORCHEO_APP_TRUSTED_PROXY_HOPS 0 locally; 1 installer default for non-local backends Integer ≥ 0 Fixed number of trusted forwarding hops before the app gateway. Prompted for non-local backends and must be greater than zero when trusted proxy CIDRs are set.
ORCHEO_APP_TLS_METHOD local local, provided, or dns-01 TLS provisioning mode for app hosts. The bundled installer selects local for loopback backends and provided for non-local backends; custom DNS-01 ingress is operator-managed.
ORCHEO_APP_TLS_CERT_FILE ~/.orcheo/tls/apps-origin.pem for new non-local installs Readable PEM file path Wildcard certificate for *.ORCHEO_APPS_BASE_DOMAIN. The installer does not prompt: --app-tls-cert-file, an existing value, or this default is validated and copied into the managed stack.
ORCHEO_APP_TLS_KEY_FILE ~/.orcheo/tls/apps-origin-key.pem for new non-local installs Readable PEM file path Matching private key. The installer does not prompt: --app-tls-key-file, an existing value, or this default is validated and copied with restricted permissions.
ORCHEO_APP_GATEWAY_SECRET Auto-generated by orcheo install Secret string of at least 32 characters Dedicated identity shared by the app gateway and backend internal routes. Prompted only when --manual-secrets is used.
ORCHEO_HOSTED_APPS_AUTO_ENABLE_RUNTIME true in bundled stacks Boolean Automatically enables the ephemeral Hosted Apps runtime for supported local or single-node deployments.
ORCHEO_APP_BUNDLE_BACKEND postgres in bundled stacks postgres, filesystem, or s3 Selects storage for staged archives and immutable deployment assets. Installed stacks persist package bytes in PostgreSQL so database backup/restore can move apps between machines. filesystem remains available for development and migration; S3 requires an external upload adapter.
ORCHEO_APP_BUNDLE_FILESYSTEM_ROOT /data/app-bundles in bundled stacks Directory path Private filesystem root used when ORCHEO_APP_BUNDLE_BACKEND=filesystem. When PostgreSQL storage is selected, installed stacks scan this legacy location and idempotently migrate existing bundle objects into the database.
ORCHEO_DEPLOYMENT_MODE single-node in bundled stacks local, single-node, or an operator-defined external mode Limits filesystem bundle storage to local and single-node deployments.
ORCHEO_HOSTED_APPS_VALIDATION_QUEUE hosted-app-validation Non-empty Celery queue name Dedicated queue consumed by the Hosted Apps validation worker. It must not share the normal workflow queue.

Vault configuration

Variable Default Valid values Purpose
ORCHEO_VAULT_BACKEND postgres postgres Chooses the credential vault backend (config/loader.py, config/vault_settings.py).
ORCHEO_VAULT_ENCRYPTION_KEY none String (ideally 128+ bits) Pre-shared key required when ORCHEO_VAULT_BACKEND=postgres.
ORCHEO_VAULT_TOKEN_TTL_SECONDS 3600 Positive integer Lifetime (seconds) for vault access tokens (config/loader.py).
ORCHEO_MULTI_WORKSPACE_WORKSPACE_HEADER X-Orcheo-Workspace HTTP header name Header that pins the active workspace for authenticated requests (config/loader.py).

ChatKit rate limits

Variable Default Valid values Purpose
ORCHEO_CHATKIT_RATE_LIMIT_IP_LIMIT 120 Integer ≥ 0 Per-IP ChatKit request limit (chatkit_rate_limit_settings.py).
ORCHEO_CHATKIT_RATE_LIMIT_IP_INTERVAL 60 Integer > 0 Window (seconds) used with the IP limit (chatkit_rate_limit_settings.py).
ORCHEO_CHATKIT_RATE_LIMIT_JWT_LIMIT 120 Integer ≥ 0 Rate limit for JWT-authenticated identities (chatkit_rate_limit_settings.py).
ORCHEO_CHATKIT_RATE_LIMIT_JWT_INTERVAL 60 Integer > 0 Window (seconds) used with the JWT identity limit (chatkit_rate_limit_settings.py).
ORCHEO_CHATKIT_RATE_LIMIT_PUBLISH_LIMIT 60 Integer ≥ 0 Rate limit for publishing workflows via ChatKit (chatkit_rate_limit_settings.py).
ORCHEO_CHATKIT_RATE_LIMIT_PUBLISH_INTERVAL 60 Integer > 0 Interval (seconds) for publish limits (chatkit_rate_limit_settings.py).
ORCHEO_CHATKIT_RATE_LIMIT_SESSION_LIMIT 60 Integer ≥ 0 Rate limit for managing ChatKit sessions (chatkit_rate_limit_settings.py).
ORCHEO_CHATKIT_RATE_LIMIT_SESSION_INTERVAL 60 Integer > 0 Interval (seconds) for session limits (chatkit_rate_limit_settings.py).

Authentication service

Variable Default Valid values Purpose
ORCHEO_AUTH_MODE optional disabled, optional, required Controls whether authentication is disabled, allowed, or enforced (authentication/settings.py).
ORCHEO_AUTH_JWT_SECRET none Arbitrary string First-party HS256 signing key for the passwordless email IdP — signs and verifies access tokens. Required when ORCHEO_AUTH_MODE=required. orcheo install auto-generates it for required-auth stacks; otherwise generate with e.g. openssl rand -hex 32 (authentication/settings.py).
ORCHEO_AUTH_ACCESS_TOKEN_TTL_SECONDS 900 Integer > 0 Lifetime of issued first-party access tokens (identity service).
ORCHEO_AUTH_CHALLENGE_TTL_MINUTES 15 Integer > 0 Lifetime of an emailed sign-in code (identity service).
ORCHEO_AUTH_SESSION_TTL_DAYS 30 Integer > 0 Lifetime of a refresh-token session (identity service).
ORCHEO_AUTH_OTP_DIGITS 6 Integer ≥ 4 Number of digits in the emailed OTP code (identity service).
ORCHEO_AUTH_ALLOWED_EMAIL_DOMAINS unset (any domain) Comma-separated domains (for example example.com,b.org) Email domains allowed to sign in through the first-party IdP. Matching is exact, so subdomains must be listed separately. Requests from other domains get HTTP 403 at /api/auth/email/start and /api/auth/email/verify, and existing sessions for them stop refreshing (identity service).
ORCHEO_AUTH_OTP_MAX_ATTEMPTS 5 Integer > 0 OTP attempts before a challenge is locked out (identity service).
ORCHEO_AUTH_WEBAUTHN_RP_ID Host of ORCHEO_STUDIO_URL Domain name (not an IP address) Passkey (WebAuthn) relying-party ID. Override only to share passkeys across subdomains of a parent domain. Every allowed origin must be this host or one of its subdomains, otherwise passkeys are turned off. Changing it later makes every registered passkey stop working (identity service).
ORCHEO_AUTH_WEBAUTHN_ORIGINS Origin of ORCHEO_STUDIO_URL Comma-separated https:// origins (http:// only for localhost) Exact browser origins allowed to sign in with or add passkeys: the origins Studio is served from, not the backend's. Plain-HTTP or IP-address origins turn passkeys off, and Studio falls back to emailed codes (identity service).
ORCHEO_AUTH_JWKS_URL none URL returning JWKS JSON Dormant. Generic external-issuer JWKS endpoint, retained for the future enterprise-SSO initiative; unset for first-party auth (authentication/settings.py).
ORCHEO_AUTH_JWKS / ORCHEO_AUTH_JWKS_STATIC none JSON text or mapping containing JWKS data Inline JWKS definitions as JSON/text for offline validation (authentication/settings.py).
ORCHEO_AUTH_JWKS_CACHE_TTL 300 Integer ≥ 0 Cache duration (seconds) for downloaded JWKS docs (authentication/settings.py).
ORCHEO_AUTH_JWKS_TIMEOUT 5.0 Float > 0 HTTP timeout (seconds) when fetching remote JWKS (authentication/settings.py).
ORCHEO_AUTH_ALLOWED_ALGORITHMS RS256, HS256 Comma/JSON list of JWT algorithm names Restricts acceptable signing algorithms (authentication/settings.py).
ORCHEO_AUTH_AUDIENCE none Comma/JSON list of strings Audience embedded in first-party tokens and validated by the backend (e.g. orcheo-api) (authentication/settings.py).
ORCHEO_AUTH_ISSUER none String First-party token issuer; the backend accepts only this issuer (e.g. https://auth.orcheo.cloud) (authentication/settings.py).
ORCHEO_AUTH_SERVICE_TOKEN_DB_PATH none Filesystem path Override the service token store path when needed (authentication/settings.py).
ORCHEO_AUTH_RATE_LIMIT_IP 0 Integer ≥ 0 Per-IP HTTP rate limit for authentication endpoints (authentication/settings.py).
ORCHEO_AUTH_RATE_LIMIT_IDENTITY 0 Integer ≥ 0 Rate limit keyed by identity (authentication/settings.py).
ORCHEO_AUTH_RATE_LIMIT_INTERVAL 60 Integer > 0 Interval (seconds) governing the authentication rate limits (authentication/settings.py).
ORCHEO_TRUSTED_PROXY false Boolean (1/0, true/false, etc.) When true, passwordless auth start rate limiting uses the first X-Forwarded-For entry as the client IP. Enable only when the backend is reachable exclusively through a trusted reverse proxy that overwrites this header (identity/dependencies.py).
ORCHEO_AUTH_BOOTSTRAP_SERVICE_TOKEN none Token string Temporary service token used for bootstrapping before persistent storage exists (authentication/settings.py).
ORCHEO_AUTH_BOOTSTRAP_TOKEN_SCOPES admin:tokens:read, admin:tokens:write, workflows:read, workflows:write, workflows:execute, vault:read, vault:write Comma/JSON list of scope strings Scopes granted to the bootstrap token (authentication/settings.py).
ORCHEO_AUTH_BOOTSTRAP_TOKEN_EXPIRES_AT none ISO 8601 string or UNIX timestamp Expiration to attach to the bootstrap token (authentication/settings.py).
ORCHEO_AUTH_DEV_LOGIN_ENABLED false Boolean (1/0, true/false, yes/no, on/off) Enables the developer login flow for local testing (authentication/settings.py).
ORCHEO_AUTH_DEV_COOKIE_NAME orcheo_dev_session Cookie name string Name of the cookie used for dev login sessions (authentication/settings.py).
ORCHEO_AUTH_DEV_SCOPES workflows:read, workflows:write, workflows:execute, vault:read, vault:write Comma/JSON list of scope strings Scopes issued to dev login tokens (authentication/settings.py).
ORCHEO_AUTH_DEV_WORKSPACE_IDS none Comma/JSON list of workspace IDs Limits dev login tokens to specific workspaces (authentication/settings.py).

Transactional email (SMTP)

SMTP is the sole production transport for both passwordless auth challenges (sign-in codes) and workspace invitation emails. When ORCHEO_SMTP_HOST is unset, the backend logs the invitation link or sign-in code instead of delivering email (the self-host/dev default).

Variable Default Valid values Purpose
ORCHEO_SMTP_HOST none Hostname SMTP server host. Unset → log links/codes instead of sending (email_config.py).
ORCHEO_SMTP_PORT 587 Integer SMTP server port (email_config.py).
ORCHEO_SMTP_USERNAME none String SMTP auth username (email_config.py).
ORCHEO_SMTP_PASSWORD none String SMTP auth password (email_config.py).
ORCHEO_SMTP_FROM_EMAIL no-reply@orcheo.cloud Email address From-address for all transactional email; use a domain you control (email_config.py).
ORCHEO_SMTP_USE_TLS true Boolean Use STARTTLS for the SMTP connection (email_config.py).

ChatKit session tokens

Variable Default Valid values Purpose
ORCHEO_CHATKIT_TOKEN_SIGNING_KEY none String (HS or RSA private key material) Primary signing key for ChatKit session tokens; required for ChatKit issuance (chatkit_tokens.py).
ORCHEO_CHATKIT_TOKEN_ISSUER orcheo.chatkit String iss claim embedded into ChatKit session JWTs (chatkit_tokens.py).
ORCHEO_CHATKIT_TOKEN_AUDIENCE chatkit String aud claim embedded into ChatKit session JWTs (chatkit_tokens.py).
ORCHEO_CHATKIT_TOKEN_TTL_SECONDS 300 Integer ≥ 60 Expiry (seconds) for ChatKit tokens (chatkit_tokens.py).
ORCHEO_CHATKIT_TOKEN_ALGORITHM HS256 JWT algorithm supported by PyJWT (HS256, RS256, etc.) Algorithm used to sign ChatKit tokens (chatkit_tokens.py).

Logging & runtime flags

Variable Default Valid values Purpose
ORCHEO_ENV none String (development, dev, local, etc.) Preferred indicator of a developer environment when deciding to expose sensitive logs (chatkit_runtime.py).
NODE_ENV production String Standard runtime environment fallback when ORCHEO_ENV is unset (chatkit_runtime.py).
ORCHEO_LOG_SENSITIVE_DEBUG none Set to 1 to enable; otherwise leave blank Forces sensitive logging even outside of a recognized dev environment (chatkit_runtime.py).
ORCHEO_LOG_LEVEL INFO DEBUG, INFO, WARNING, ERROR, CRITICAL, etc. Controls the logger thresholds configured in logging_config.py.
ORCHEO_LOG_FORMAT console console or json Selects structured log rendering. Any value other than console falls back to JSON rendering (logging_config.py).

Node integration configuration

Variable Default Valid values Purpose
ORCHEO_MCP_STDIO_LOG /tmp/orcheo-mcp-stdio.log Filesystem path Log file path for stdio-based MCP transport in SlackNode; useful for debugging MCP integration issues (nodes/slack.py).

Workflow execution

ORCHEO_PUBLIC_BROWSER_WS_ENDPOINT selects the isolated Playwright server for BrowserNavigateNode(public_https_only=True). The lean stack sets it to ws://public-browser:3000/public-browser. The browser must share the worker's Playwright version and run without worker credentials or private/internet network routes, using the public HTTPS proxy. Connection failures never fall back locally. Without this setting, development uses the existing local proxy. See Public event reader security for deployment boundaries and the installed-image preflight.

Variable Default Valid values Purpose
ORCHEO_WORKFLOW_TRUST_MODE managed (set to allow_client_uploads by orcheo install for local hosting and trusted HTTPS backends) allow_client_uploads or managed Controls whether client-supplied workflow scripts may be ingested. When set to allow_client_uploads, the Upload and Update buttons are enabled in Studio and the CLI workflow upload command is accepted by the backend. When set to managed (or any other value, which is the backend's built-in default when the variable is unset), client uploads are rejected with HTTP 403 and the upload/update UI is hidden; only server-side candidate onboarding via POST /candidates/onboard is permitted. orcheo install writes this variable into the stack .env based on the deployment topology: a local-hosting install (no bundled public ingress and a loopback http:// backend) gets allow_client_uploads with unrestricted definition mode; a trusted HTTPS backend gets allow_client_uploads paired with restricted definition mode (uploads compile to the sandboxed IR); any other (untrusted non-loopback http://) deployment is pinned to managed. Set to allow_client_uploads with unrestricted definition mode only on instances where every workflow author is trusted (graph/ingestion/sandbox.py, app/routers/workflows.py, cli/setup.py).

Celery worker configuration

Variable Default Valid values Purpose
REDIS_URL redis://localhost:6379/0 Redis connection URL Broker URL for Celery task queue (celery_app.py). The desktop apps set this to their own bundled Redis instance on a private loopback port.
ORCHEO_CRON_DISPATCH_INTERVAL 60 Float (seconds), positive and finite Interval at which Celery Beat, the standalone scheduler and the in-process cron scheduler dispatch cron triggers (celery_app.py, app/cron_scheduler.py). Non-numeric, non-positive, and non-finite values (nan, inf) fall back to the default. The standalone scheduler health probe allows three intervals or 30 seconds, whichever is greater, between successful polls.
ORCHEO_CRON_HEALTH_FILE /tmp/orcheo-cron-heartbeat Container-local filesystem path Progress file shared by the standalone scheduler and python -m orcheo.cron_healthcheck. Keep it local to each scheduler container so another container cannot mask stalled progress.
ORCHEO_CELERY_BEAT_SCHEDULE_FILE celerybeat-schedule Filesystem path Location of the Celery Beat schedule database; use -s flag or this env var to override (celery_app.py).
ORCHEO_INPROCESS_CRON true Boolean (1/0, true/false, yes/no, on/off) Runs the cron dispatch loop inside the backend process, polling every ORCHEO_CRON_DISPATCH_INTERVAL seconds (app/cron_scheduler.py). On by default so schedules fire without Redis (desktop app, bare uvicorn). Set to false wherever Celery Beat or the standalone scheduler runs; bundled compose stacks already do. PostgreSQL serializes each occurrence across dispatchers, but one scheduler avoids redundant polling in multi-worker or replicated deployments.
ORCHEO_INPROCESS_EXECUTION true Boolean (1/0, true/false, yes/no, on/off) Executes dispatched runs on the backend event loop instead of publishing them to Celery (app/local_execution.py). On by default so runs do not sit pending without Redis. Set to false wherever a Celery worker runs, so runs are queued to the worker fleet instead of the API process; the bundled compose stacks already do. Ignored inside Celery tasks, which always publish to the broker.

CLI configuration

Variable Default Valid values Purpose
ORCHEO_CONFIG_DIR ~/.config/orcheo Directory path Overrides where the CLI looks for cli.toml (cli/config.py).
ORCHEO_CACHE_DIR ~/.cache/orcheo Directory path Location for CLI caches (cli/config.py).
ORCHEO_PROFILE default Profile name present in cli.toml Chooses which CLI profile to load (cli/config.py).
ORCHEO_API_URL http://localhost:2025 HTTP(S) URL URL of the Orcheo backend used by the CLI/SDK (cli/config.py). For Cloudflare Tunnel or other public split-origin setups, set this to the public backend hostname rather than the Studio hostname.
ORCHEO_SERVICE_TOKEN none Bearer token string Service authentication token used by the CLI/SDK and emitted in generated code snippets (cli/config.py, services/codegen.py).
ORCHEO_HUMAN unset Boolean (1/0, true/false, yes/no, on/off) When set to a truthy value, the CLI uses human-friendly Rich output (colored tables, panels) instead of machine-readable format (JSON, Markdown tables). Equivalent to passing --human (cli/main.py).
ORCHEO_DISABLE_UPDATE_CHECK unset Boolean (1/0, true/false, yes/no, on/off) Disables startup update reminders in the CLI (cli/main.py).
ORCHEO_STACK_DIR ~/.orcheo/stack Directory path Target directory for orcheo install stack assets and generated .env updates (cli/setup.py). When set, orcheo stack and stack-runtime orcheo plugin commands use this full stack even if a lean install exists.
ORCHEO_STACK_VERSION unset Stack release version string (for example 0.1.0 or 0.2.0-rc.1) Pins orcheo install to a specific stack-v* release when --stack-version is not provided. The installer records its resolved stable or staging version here.
ORCHEO_STACK_IMAGE ghcr.io/ai-colleagues/orcheo-stack:latest Container image reference Runtime image used by deploy/stack/docker-compose.yml for backend/worker/celery-beat services. Versioned and staging installs pin it to the resolved stack version.
ORCHEO_STUDIO_IMAGE ghcr.io/ai-colleagues/orcheo-studio:latest Container image reference Studio runtime image. Versioned and staging installs pin it to the same resolved version as ORCHEO_STACK_IMAGE.
ORCHEO_APP_GATEWAY_IMAGE ghcr.io/ai-colleagues/orcheo-app-gateway:latest Container image reference Dedicated Hosted Apps delivery gateway image. Versioned and staging installs pin it to the same resolved version as ORCHEO_STACK_IMAGE.
ORCHEO_POSTGRES_PASSWORD auto-generated on install Non-empty string PostgreSQL password written to stack .env by orcheo install and consumed by deploy/stack/docker-compose.yml to configure the Postgres service and backend DSN.
ORCHEO_LEAN_DIR ~/.orcheo/lean Directory path Target directory for orcheo install --lean assets and its generated .env (cli/lean_setup.py). orcheo stack and stack-runtime orcheo plugin commands fall back to this directory when no full stack is installed; setting it (without ORCHEO_STACK_DIR) makes them use the lean stack even if a full stack exists.
ORCHEO_LEAN_VERSION unset Lean release version string (for example 0.1.0 or 0.2.0-rc.1) Pins orcheo install --lean to a specific lean-v* release when --stack-version is not provided.
ORCHEO_LEAN_ASSET_BASE_URL unset HTTP(S) URL Optional mirror of the deploy/lean directory used by orcheo install --lean to download docker-compose.yml and .env.example (cli/lean_setup.py).
ORCHEO_POSTGRES_DSN (lean stack) required PostgreSQL URL Supabase connection string for deploy/lean/docker-compose.yml, which does not bundle PostgreSQL. Prefer the transaction pooler (*.pooler.supabase.com:6543); the session pooler caps client connections at the project's pool size. orcheo install --lean prompts for it and writes it single-quoted so $ and # in the password survive Compose parsing.
ORCHEO_LEAN_ENABLE_IPV6 true Boolean (true/false) Enables IPv6 on the lean compose network so containers can reach IPv6-only Supabase hosts (db.<ref>.supabase.co). Needs Docker Engine 27+ and outbound IPv6 on the host; set false on older engines.
ORCHEO_LEAN_IMAGE orcheo-lean:local Container image reference Image used by deploy/lean/docker-compose.yml. orcheo install --lean pins it to ghcr.io/ai-colleagues/orcheo-lean:<version>.
ORCHEO_CRON_DISPATCH_OWNER celery celery/scheduler Set to scheduler on every Celery worker sharing a database and queue with the standalone cron scheduler, including non-lean deployments, so queued Beat dispatch tasks are ignored. Stop Celery Beat and disable in-process cron on every backend before starting exactly one standalone scheduler. Deployments using Celery Beat retain celery and must not run the standalone scheduler.
ORCHEO_LEAN_WORKER_CONCURRENCY 2 Positive integer Execution processes in the lean Celery worker. Tune against memory usage and queue latency.
ORCHEO_REPAIR_VOLUME_OWNERSHIP false true/false Set to true for one container restart to repeat recursive ownership repair on shared /data directories. Normal restarts reuse the recorded runtime-user ownership initialization.
ORCHEO_BROWSER_DISABLED false Boolean (1/0, true/false, yes/no, on/off) Refuses browser session creation. The optional lean no-browser Compose overlay sets it to true and stops the reader sidecars.
ORCHEO_STACK_ASSET_BASE_URL unset HTTP(S) URL Optional custom mirror base URL for per-file stack asset downloads. When set, orcheo install skips GitHub tag discovery and downloads stack assets from this mirror (cli/setup.py).
ORCHEO_SETUP_HEALTH_POLL_TIMEOUT_SECONDS 60 Integer ≥ 0 Timeout window used by orcheo install when waiting for docker compose backend health checks (cli/setup.py).
ORCHEO_PUBLIC_INGRESS_ENABLED false Boolean (1/0, true/false, yes/no, on/off) Enables the bundled Caddy ingress profile written by orcheo install. When false, backend and studio are accessible only via their direct localhost port bindings.
ORCHEO_PUBLIC_HOST unset Hostname Public hostname served by bundled Caddy. Required when ORCHEO_PUBLIC_INGRESS_ENABLED=true.
COMPOSE_PROFILES empty Comma-separated Docker Compose profile names Profiles activated by orcheo install and orcheo stack. Set to public-ingress to enable bundled Caddy TLS ingress.
ORCHEO_CADDY_SITE_ADDRESS unset Hostname or Caddy site address Site address consumed by deploy/stack/Caddyfile. Usually the same value as ORCHEO_PUBLIC_HOST.
ORCHEO_CADDY_BACKEND_UPSTREAMS backend:2025 Space-delimited host:port upstream list Backend upstream pool used by bundled Caddy for /api/* and /ws/*. Multiple entries are for replicas of the same logical deployment only.
ORCHEO_CADDY_STUDIO_UPSTREAM studio:2026 host:port Internal Studio upstream used by bundled Caddy for / and SPA routes.
ORCHEO_CADDY_HTTP_BIND 0.0.0.0 IP string Host bind address for Caddy's public port 80 in deploy/stack/docker-compose.yml.
ORCHEO_CADDY_HTTPS_BIND 0.0.0.0 IP string Host bind address for Caddy's public port 443 in deploy/stack/docker-compose.yml.
ORCHEO_BACKEND_LOCAL_PORT 2025 Integer (1‑65535) Localhost port bound for the backend service in the stack compose file.
ORCHEO_STUDIO_LOCAL_PORT 2026 Integer (1‑65535) Localhost port bound for the Studio service in the stack compose file.
ORCHEO_POSTGRES_LOCAL_PORT 5432 Integer (1‑65535) Localhost port bound for the bundled Postgres service in the stack compose file.
ORCHEO_REDIS_LOCAL_PORT 6379 Integer (1‑65535) Localhost port bound for the bundled Redis service in the stack compose file.
ORCHEO_AUTH_ISSUER none OIDC issuer URL OAuth issuer URL for CLI browser-based login. Can also be set in a cli.toml profile via auth_issuer (cli/auth/config.py).
ORCHEO_AUTH_CLIENT_ID none String OAuth client ID for CLI login. Can also be set in a cli.toml profile via auth_client_id (cli/auth/config.py).
ORCHEO_AUTH_SCOPES openid profile email Space-delimited scopes OAuth scopes requested during CLI login. Can also be set in a cli.toml profile via auth_scopes (cli/auth/config.py).
ORCHEO_AUTH_AUDIENCE none String Optional OAuth audience for CLI login. Can also be set in a cli.toml profile via auth_audience (cli/auth/config.py).
ORCHEO_AUTH_ORGANIZATION none String Optional OAuth organization for CLI login (e.g., Auth0 Organizations). Can also be set in a cli.toml profile via auth_organization (cli/auth/config.py).