Environment variables
Common server, storage, integration, and runtime configuration for self-hosting Clowld Space.
Clowld Space reads environment variables at process startup. After changing one, restart the affected API, web, or daemon process. Docker Compose's docker compose restart does not re-read .env; recreate containers with up -d for changes to take effect.
This page lists deployment-facing configuration only; test variables and internal run variables are not covered here. It is a grouped reference — for full deployment steps, see the self-host quickstart.
Minimum production configuration
DATABASE_URL=postgres://user:password@postgres:5432/clowld?sslmode=require
JWT_SECRET=<long-random-secret>
APP_ENV=production
FRONTEND_ORIGIN=https://clowld.example.com
CLOWLD_APP_URL=https://clowld.example.com
CLOWLD_PUBLIC_URL=https://api.clowld.example.comYou also need to pick an email service, otherwise verification codes and invitations are only written to the server log.
JWT_SECRET is required in production: with APP_ENV=production the backend refuses to boot if it is empty or a known placeholder (generate one with openssl rand -hex 32). Do not set CLOWLD_DEV_VERIFICATION_CODE.
API and database
| Variable | Default | Description |
|---|---|---|
DATABASE_URL | local clowld database | PostgreSQL connection string |
DATABASE_MAX_CONNS | 25 | Maximum database connections per API process |
DATABASE_MIN_CONNS | 5 | Minimum connections each API process keeps |
CLOWLD_DATABASE_SEARCH_WORK_MEM_MB | 64 | PostgreSQL work_mem ceiling in MB for each search plan node; set 1-64 to lower it or 0 to keep the database/session default. The legacy DATABASE_SEARCH_WORK_MEM_MB name is promoted at startup only when the current name is unset; an explicitly empty current value selects the default |
DATABASE_REPLICA_URL | empty | Optional PostgreSQL read-only replica connection string; new connections are validated as read-only, while businesses must explicitly opt into eventual-consistency reads in code |
DATABASE_REPLICA_MAX_CONNS | 10 | Maximum replica connections per API process |
DATABASE_REPLICA_MIN_CONNS | 0 | Minimum replica connections each API process keeps |
CLOWLD_DATABASE_STARTUP_TIMEOUT | 3m | Container-level retry budget shared by migration and API startup; set to 0 for one fail-fast attempt per phase |
CLOWLD_DATABASE_CONNECT_TIMEOUT | 5s | Fallback timeout for each startup connection attempt; native pgx connect_timeout, PGCONNECT_TIMEOUT, or service settings take precedence |
PORT | 8080 | API listen port |
JWT_SECRET | required in production | Secret for sign-in JWTs and some signing flows; production refuses to boot on empty or known placeholders |
APP_ENV | empty | Set to production in production |
AUTH_TOKEN_TTL | 720h (30 days) | Lifetime of browser JWTs and cookies; accepts a Go duration or a positive integer of seconds. Sessions slide: one in continuous use is re-issued rather than expiring, from the halfway point of its lifetime onward. Values below 60s are clamped to 60s |
LOG_LEVEL | application default | Log level |
CLOWLD_SHUTDOWN_HOLD_DURATION | 0 | How long to wait after a termination signal before graceful shutdown begins |
CLOWLD_RUNTIME_RECONNECT_GRACE | 3h | How long an offline runtime may reconnect before its in-flight runs fail; values below 150s are clamped |
When setting a shutdown hold on Kubernetes, terminationGracePeriodSeconds must exceed the hold plus the time the actual shutdown needs.
The primary and replica connection limits are independent. Budget their sum across every API process against the PostgreSQL cluster's connection ceiling. Replica connections are recycled after five minutes by default to refresh read-only validation after promotion. Replica connection failures transparently fall back to primary and open a short passive circuit; no background database probe is added. Replica reads have no application-enforced staleness bound, so monitor lag in the database layer and keep consistency-sensitive reads on primary.
Public URLs and browser access
| Variable | Default | Description |
|---|---|---|
FRONTEND_ORIGIN | empty | Frontend origin users visit; used for CORS, cookies, and invitation links |
CLOWLD_APP_URL | falls back to FRONTEND_ORIGIN | User-reachable web URL; CLI sign-in and account-link URLs use it |
CLOWLD_PUBLIC_URL | empty | Public API URL used for webhook and callback URLs; it never falls back to the daemon-only address |
CLOWLD_DAEMON_SERVER_URL | falls back one way to CLOWLD_PUBLIC_URL, then CLOWLD_APP_URL / FRONTEND_ORIGIN | Server URL the API process inserts into clowld setup self-host; health checks and the daemon's API/WebSocket connections use the saved value |
CORS_ALLOWED_ORIGINS | empty | Extra allowed HTTP origins, comma-separated |
ALLOWED_ORIGINS | falls back to CORS / frontend origins | WebSocket origin allowlist, comma-separated |
COOKIE_DOMAIN | empty | Required when the frontend and API use different hosts and the browser talks to the API domain directly; keep empty for single-domain deployments |
CLOWLD_DAEMON_SERVER_URL is returned by the unauthenticated /api/config endpoint and is visible to clients. Treat it as public configuration; never put credentials, tokens, query-string secrets, or other sensitive values in it. The server strips URL userinfo, query strings, and fragments before returning daemon setup URLs.
When the frontend and API run on different hosts and the browser talks to the API domain directly, you must set COOKIE_DOMAIN — otherwise the browser cannot read the CSRF cookie: every write request returns 403 CSRF validation failed while reads work fine. Use the narrowest parent domain that covers both hosts (.agent.example.com over .example.com). It spreads the sign-in session cookie to every host under that domain, which is only acceptable when all of those hosts are operated by the same trusted party. After changing it, clear the old cookies on both hosts and sign in again. If you follow the same-origin recipe in the self-host quickstart (the browser only visits the app domain), keep it empty. Do not use an IP address — browsers ignore cookies whose Domain is an IP.
Self-hosted deployments must set FRONTEND_ORIGIN. Without it, invitation links, cookie security attributes, and WebSocket origin checks can all disagree with your actual domain.
Email and sign-in
Resend
| Variable | Default | Description |
|---|---|---|
RESEND_API_KEY | empty | Setting it enables Resend |
RESEND_API_KEY_FILE | empty | Read the Resend key from this file; cannot be combined with RESEND_API_KEY |
RESEND_FROM_EMAIL | noreply@clowld.com | Sender address; must belong to a verified domain |
CLOWLD_SECRETS_DIR | ./secrets | Host directory mounted read-only at /run/secrets by the self-host Compose file |
SMTP
SMTP takes priority over Resend whenever SMTP_HOST is non-empty.
| Variable | Default | Description |
|---|---|---|
SMTP_HOST | empty | SMTP host; setting it enables SMTP |
SMTP_PORT | 25 | Common values: 25, 587, 465 |
SMTP_USERNAME | empty | Username; leave empty for anonymous relays |
SMTP_PASSWORD | empty | Password |
SMTP_PASSWORD_FILE | empty | Read the SMTP password from this file; cannot be combined with SMTP_PASSWORD |
SMTP_FROM_EMAIL | falls back to RESEND_FROM_EMAIL | Envelope From and message From |
SMTP_TLS | starttls | implicit, smtps, or ssl means implicit TLS; port 465 enables it automatically |
SMTP_TLS_INSECURE | false | Skips certificate verification; trusted internal networks only |
SMTP_EHLO_NAME | hostname | EHLO/FQDN required by strict relays |
Google OAuth
| Variable | Default | Description |
|---|---|---|
GOOGLE_CLIENT_ID | empty | Google OAuth client ID |
GOOGLE_CLIENT_SECRET | empty | Google OAuth client secret |
GOOGLE_REDIRECT_URI | http://localhost:3000/auth/callback | Must exactly match the callback URL in the Google Console |
Signup scope
| Variable | Default | Description |
|---|---|---|
ALLOW_SIGNUP | true | Whether new accounts can be created when no allowlist is configured |
ALLOWED_EMAILS | empty | Full email addresses allowed to sign up, comma-separated |
ALLOWED_EMAIL_DOMAINS | empty | Email domains allowed to sign up, comma-separated |
DISABLE_WORKSPACE_CREATION | false | Blocks all users from creating workspaces; no owner/admin exception |
CLOWLD_DEV_VERIFICATION_CODE | empty | Fixed 6-digit test code for non-production environments |
For the exact allowlist evaluation order, see Sign-in and signup.
Attachment storage
When S3_BUCKET is unset, Clowld Space uses local disk.
S3 or compatible storage
| Variable | Default | Description |
|---|---|---|
S3_BUCKET | empty | Bucket name; do not use the full hostname |
S3_REGION | us-west-2 | Region the bucket lives in |
AWS_ACCESS_KEY_ID | SDK default credential chain | Static access key |
AWS_SECRET_ACCESS_KEY | SDK default credential chain | Static secret key |
AWS_ENDPOINT_URL | empty | S3-compatible endpoint such as MinIO |
S3_USE_PATH_STYLE | true with a custom endpoint | Whether to use path-style addressing |
ATTACHMENT_DOWNLOAD_MODE | auto | auto, cloudfront, presign, or proxy |
ATTACHMENT_DOWNLOAD_URL_TTL | 30m | Lifetime of signed download URLs |
Use ATTACHMENT_DOWNLOAD_MODE=proxy when the endpoint — an internal MinIO, for example — is not reachable from the browser.
Local disk
| Variable | Default | Description |
|---|---|---|
LOCAL_UPLOAD_DIR | ./data/uploads | Directory for files and metadata; needs a persistent volume |
LOCAL_UPLOAD_BASE_URL | empty | Optional public base URL; when empty, in-app relative URLs are returned |
CloudFront
| Variable | Description |
|---|---|
CLOUDFRONT_DOMAIN | CDN domain |
CLOUDFRONT_KEY_PAIR_ID | CloudFront key pair ID |
CLOUDFRONT_PRIVATE_KEY | Full private key |
CLOUDFRONT_PRIVATE_KEY_SECRET | Use when reading the private key from Secrets Manager |
Redis and rate limiting
| Variable | Default | Description |
|---|---|---|
REDIS_URL | empty | The one connection URL used by all Redis-backed features, including shared rate limiting, realtime events, channel WebSocket leases, and token caches |
REDIS_CLUSTER_MODE | false | Forces the Redis Cluster client, including for a single configuration endpoint; cluster mode requires database 0 and REALTIME_RELAY_MODE=sharded |
REDIS_DISABLE_CLIENT_NAME | false | Set true when a managed Redis blocks CLIENT SETNAME |
RATE_LIMIT_AUTH | 5 | Per-IP requests per minute to send a verification code or start Google sign-in |
RATE_LIMIT_AUTH_VERIFY | 20 | Per-IP code verifications per minute |
RATE_LIMIT_INVITATION_ACTOR_10M | 10 | Workspace invitations each inviter may create per 10-minute sliding window; 0 disables this gate |
RATE_LIMIT_INVITATION_WORKSPACE_24H | 50 | Workspace invitations all admins may create per workspace per 24-hour sliding window; 0 disables this gate |
RATE_LIMIT_INVITATION_RECIPIENT_24H | 6 | Invitations one normalized recipient email may receive across workspaces per 24-hour sliding window; 0 disables this gate |
RATE_LIMIT_TRUSTED_PROXIES | empty | Comma-separated proxy CIDRs allowed to provide X-Forwarded-For |
CLOWLD_TRUSTED_PROXIES | empty | Trusted proxy CIDRs for automation webhooks and realtime connections |
Deployments behind a reverse proxy must list their real proxy ranges. Do not blanket-trust all sources, or clients can forge forwarded IPs.
The auth rate limits require REDIS_URL; without it, the startup log notes that auth rate limiting is disabled. Invitation limits still run in process-local memory without Redis and become shared across replicas when Redis is configured. If configured Redis becomes temporarily unavailable, auth rate limiting fails open, while invitation creation returns a retryable 503 instead of sending email without protection.
External integrations
| Integration | Variable | Description |
|---|---|---|
| GitHub | GITHUB_APP_SLUG | GitHub App slug |
| GitHub | GITHUB_WEBHOOK_SECRET | Webhook HMAC and connect-state signing secret |
| GitHub | GITHUB_APP_ID | Needed for CI status and mergeability on PR cards and the "pick from GitHub" repository picker |
| GitHub | GITHUB_APP_PRIVATE_KEY | Full PEM private key paired with the App ID; same uses as above |
| Lark | CLOWLD_LARK_SECRET_KEY | Base64-encoded 32-byte credential encryption key |
| Slack | CLOWLD_SLACK_SECRET_KEY | Base64-encoded 32-byte token encryption key |
| Telegram | CLOWLD_TELEGRAM_SECRET_KEY | Base64-encoded 32-byte Bot token encryption key |
| Composio | COMPOSIO_API_KEY | Enables Composio tool connections |
| Composio | COMPOSIO_CALLBACK_BASE_URL | Callback API URL; can fall back to CLOWLD_PUBLIC_URL |
| Composio | COMPOSIO_STATE_SECRET | OAuth state signing secret; can be derived from JWT_SECRET |
| Self-hosted Git | CLOWLD_VCS_INTEGRATION_ENABLED | Forgejo/Gitea/GitLab integration switch; enabled by default in compose |
| Self-hosted Git | CLOWLD_VCS_SECRET_KEY | Base64-encoded 32-byte encryption key (openssl rand -base64 32); the feature is entirely unavailable without it |
| Plugins | CLOWLD_PLUGIN_SECRET_KEY | Base64-encoded 32-byte key for stored secrets and encrypted surface launch URLs |
| Plugins | CLOWLD_PLUGIN_SURFACE_ORIGIN | Dedicated cookie-free browser origin routed to this backend; must differ from app/API origins and preserve Host |
| Plugins | CLOWLD_PLUGIN_API_URL | Complete versioned Plugin Public API base URL, such as https://plugin-api.example.com/v1; falls back to CLOWLD_PUBLIC_URL + /v1 |
| Plugins | CLOWLD_PLUGIN_DIR | Optional absolute directory used to publish local plugin bundles during development |
Without GITHUB_APP_ID and the private key, PRs still link, mirror, and move issues on merge normally, but cards show no CI or mergeability status, and the "pick from GitHub" repository entry is disabled.
For setup steps, see GitHub integration, Lark bot, Slack bot, and Telegram bot.
Server-side LLM
This group configures server-side assist generation, such as conversation titles; it is not the AI coding tool credentials agents use to execute runs.
| Variable | Default | Description |
|---|---|---|
CLOWLD_LLM_API_KEY | empty | OpenAI-compatible API key |
CLOWLD_LLM_BASE_URL | empty | OpenAI-compatible endpoint |
CLOWLD_LLM_DEFAULT_MODEL | gpt-5.6-luna | Used when a request does not specify a model |
CLOWLD_LLM_MAX_RETRIES | 2 | Retry ceiling per call; 0 disables retries, 1–5 cap it at N |
CLOWLD_LLM_DISABLE_THINKING | false | Add chat_template_kwargs: {"enable_thinking": false} to every request, for gateways that honor the field |
CLOWLD_LLM_MAX_RETRIES is the single source for the retry policy. Leave it unset for the default of 2, set 0 to send exactly one request per call, or set 1–5 to cap retries at that many. It is a ceiling, not a quota: only retryable failures consume it, and a success or the caller's own deadline can end the call sooner. Any other value — negative, non-numeric, or above 5 — fails startup instead of being corrected silently. The ceiling is a latency budget: backoff starts at 0.5s and doubles to an 8s cap, so a larger budget would outlast the callers' own deadlines and turn a retryable failure into a timeout. Retries cover connection failures and HTTP 408, 409, 429 and 5xx; all other 4xx responses are returned as-is. The server logs the effective policy at startup as llm retry policy, with no credentials in the line.
CLOWLD_LLM_DISABLE_THINKING is for gateways whose models spend a reasoning ("thinking") pass that dominates the latency budget of the assist calls. When set to true (or 1), the server adds chat_template_kwargs: {"enable_thinking": false} to every request body; gateways that forward the field — vLLM/sglang-style deployments and some GLM/Qwen-style LiteLLM routes — then skip the thinking pass. Standard OpenAI endpoints reject unknown body fields, so only enable this when your upstream accepts it. GPT-5.6-family models already get reasoning_effort: none on the follow-up questions request. Chat auto-titling sends no reasoning field; this switch affects it only when the configured upstream accepts chat_template_kwargs. Accepted values are true/false and 1/0 (case-insensitive); anything else fails startup. The startup log reports the effective state alongside the retry policy.
Two features use this layer, and each one sends chat content to the endpoint you configure:
- Chat auto-titling — the first user message of a new chat session, sent verbatim. Attachments are never included.
- Follow-up questions (the suggestion buttons under an agent reply) — the tail of the conversation: up to 6 messages, with the reply being answered capped at 3000 characters and each older message at 800.
When both the API key and the base URL are empty, this layer is disabled and makes no upstream request at all — neither feature above sends anything. That is the supported configuration when your policy does not allow this layer to send chat content off the deployment: chat sessions keep the title the client derives from the first message, the follow-up question buttons do not appear, and everything else is unaffected.
This covers the assist layer only. Running an agent is a separate data path: when an agent answers a chat, your daemon executes that agent's AI coding tool using the tool's own credentials, and does not forward the CLOWLD_LLM_* settings above to it. (The run-scoped Clowld Space connection variables the agent needs are injected by the daemon separately.) Emptying the variables above does not affect that path — govern it through the agent's runtime configuration.
Daemon configuration
The variables below are read on the computer that runs your agents, not in the API container.
| Variable | Default | Description |
|---|---|---|
CLOWLD_SERVER_URL | ws://localhost:8080/ws | Clowld Space API / WebSocket URL; also accepts http(s) |
CLOWLD_DAEMON_DEVICE_NAME | hostname | Device name shown in the runtime list |
CLOWLD_AGENT_RUNTIME_NAME | Local Agent | Runtime display name |
CLOWLD_DAEMON_POLL_INTERVAL | 30s | Run polling interval when no wake event arrives |
CLOWLD_DAEMON_WS_CLAIM_POLL_INTERVAL | 3m | Upper bound for healthy WebSocket claim safety polls, configured independently of CLOWLD_DAEMON_POLL_INTERVAL; downward jitter makes the normal default 2m30s–2m45s, while old servers and uncertain claims retain the ordinary poll interval |
CLOWLD_DAEMON_HEARTBEAT_INTERVAL | 15s | Heartbeat interval |
CLOWLD_DAEMON_MAX_CONCURRENT_TASKS | 20 | Concurrent run ceiling per daemon |
CLOWLD_AGENT_TIMEOUT | 0 | Absolute time limit per run; 0 means no limit |
CLOWLD_AGENT_IDLE_WATCHDOG | 2h | Silence ceiling with no output and no tool execution; 0 disables the watchdog entirely |
CLOWLD_AGENT_TOOL_WATCHDOG | same as CLOWLD_AGENT_IDLE_WATCHDOG | Silence ceiling for a single tool call; set it only to give tools more room than the model gets, 0 never force-stops a tool call. Cursor background shells stay in flight until their owned processes exit; at this boundary the daemon stops those processes and gives Cursor a fresh watchdog budget to produce its terminal result. If process ownership or cleanup cannot be verified, the ordinary run-cancellation policy applies |
CLOWLD_OPENCODE_IDLE_WATCHDOG | 10m | OpenCode-specific silence threshold |
CLOWLD_CODEX_SEMANTIC_INACTIVITY_TIMEOUT | same as CLOWLD_AGENT_IDLE_WATCHDOG | Codex semantic-silence threshold. Codex's own timer cannot see that a tool is running, so it tracks the larger of the idle / tool budgets instead of holding a separate, shorter ceiling |
CLOWLD_CODEX_FIRST_TURN_TIMEOUT | 0 | Explicit override for the Codex first-turn no-progress ceiling; 0 keeps the default. The effective first-turn wait stays bounded by CLOWLD_CODEX_SEMANTIC_INACTIVITY_TIMEOUT and the overall execution timeout — set CLOWLD_CODEX_SEMANTIC_INACTIVITY_TIMEOUT strictly above this value (with some margin), or the wait is truncated to it and the model-catalog startup retry is skipped. Equal values are not enough: the semantic timer is armed first, so at equal durations the retry can still be lost |
CLOWLD_CODEX_HANDSHAKE_TIMEOUT | 30s; thread/start, thread/resume: 60s | Codex app-server startup handshake ceilings. An explicit value overrides both budgets globally |
CLOWLD_CODEX_TURN_INTERRUPT_TIMEOUT | 2s | Grace period after cancellation for Codex app-server to acknowledge turn/interrupt and emit turn/completed, preserving final token usage before forced process cleanup. On unusually slow hosts, tune this from the interrupt latency recorded in daemon logs |
CLOWLD_DAEMON_AUTO_UPDATE | Cloud true; self-hosted false | Whether to check for and apply CLI updates automatically |
CLOWLD_DAEMON_AUTO_UPDATE_INTERVAL | 6h | Update check interval |
CLOWLD_DAEMON_AUTO_RELOAD | true | Whether to restart into a clowld binary replaced on disk out of band (brew upgrade, a re-download, a local build). Independent of CLOWLD_DAEMON_AUTO_UPDATE |
CLOWLD_WORKSPACES_ROOT | ~/clowld_workspaces | Root directory for run working directories |
CLOWLD_AGENT_TEMP_BASE | /tmp (Linux/macOS) | Linux/macOS only. Parent directory for private per-run temp dirs; must be an existing, writable absolute directory, and an invalid value fails run startup instead of falling back to /tmp. Pick a short path — child tools may bind AF_UNIX sockets under it, and sun_path is limited to 108 bytes on Linux and 104 on macOS |
CLOWLD_KEEP_ENV_AFTER_TASK | false | Keep run directories for debugging |
For the internal context that the daemon injects into agent runs, see Task runtime environment.
@/home/clowld/clowld_workspaces/clowld-spac-8e9e35d1c531/cs-534-ff75298c9d0f/workdir/combined_env_en.txt
CLOWLD_CLAUDE_PATH=/opt/bin/claude
CLOWLD_CLAUDE_ARGS=--max-turns 40Cursor's verified background cleanup requires Linux 6.9 or newer (process-group pidfds), macOS kernel support for process identity queries and audit-token signalling, or a successfully assigned nested Job Object on Windows. On macOS, each process is signalled using a kernel-checked PID version; no same-session group join is required. These macOS APIs are private and checked at capture time. A launch that cannot be claimed returns its original tool result and uses the ordinary idle watchdog, including when the tool watchdog is 0. Already-claimed work remains in flight if cleanup cannot be confirmed. With the tool watchdog set to 0 there is no such boundary at all: claimed background work keeps the run in flight for as long as it lives, so the run is bounded only by CLOWLD_AGENT_TIMEOUT, which is 0 by default.
Owned Cursor background processes are also stopped when the run completes normally, so a background server started by that run does not intentionally survive finalization. macOS can recognize late children through retained original-parent identities, but cannot prove a chain whose intermediate processes disappeared before observation. Such processes, work that leaves the tracked group, or persistent ownership/signalling errors can leave background work behind. Unconfirmed cleanup is logged and never grants a successful-cleanup recovery window; unknown processes are not killed based only on their numeric PID or process group.
Precedence is command-line flag → environment variable → ~/.clowld-space/cli/config.json → built-in default. For watchdog behavior, see Daemon and runtimes.
Persisting daemon configuration
Common daemon-side settings can also be written to ~/.clowld-space/cli/config.json instead of relying on shell environment variables; named profiles keep theirs at ~/.clowld-space/cli/profiles/<name>/config.json:
clowld config set poll_interval 10s
clowld config showSupported keys:
| Key | Default | Description |
|---|---|---|
server_url | ws://localhost:8080/ws | Clowld Space API / WebSocket URL |
app_url | empty | Web URL used for browser sign-in |
workspace_id | empty | Default workspace |
device_name | hostname | Device name shown in the runtime list |
runtime_name | Local Agent | Runtime display name |
workspaces_root | profile-aware path under ~ | Root directory for run working directories |
max_concurrent_tasks | 20 | Concurrent run ceiling; 0 or empty means unset |
poll_interval | 30s | Run polling interval |
ws_claim_poll_interval | 3m | Upper bound for healthy WebSocket claim safety polls, independent of poll_interval; the daemon applies downward-only jitter |
heartbeat_interval | 15s | Heartbeat interval |
agent_timeout | unlimited | Absolute time limit per run |
codex_semantic_inactivity_timeout | derived | Codex semantic-silence threshold. With nothing set it takes the larger of the idle and tool watchdog budgets; a tool budget of 0 falls back to the idle budget, and only when the whole watchdog suite is disabled does Codex keep its own 10m |
codex_handshake_timeout | 30s; thread/start, thread/resume: 60s | Codex app-server startup handshake ceilings. An explicit value overrides both budgets globally |
disable_auto_update | follows environment | true turns auto-update off; false clears the local override and returns to the env var or default |
auto_update_check_interval | 6h | Update check interval |
disable_auto_reload | follows environment | true stops the daemon following a binary replaced on disk; false clears the local override. Resolved separately from disable_auto_update |
A few value rules:
- Duration keys accept positive Go durations (such as
10s,2h);0sand negative values are rejected. The one exception isagent_timeout:0sis valid and explicitly disables the run time limit. - Passing an empty string clears a persisted value and falls back to the env var or built-in default, for example
clowld config set poll_interval "". max_concurrent_tasksrequires a non-negative integer.- Relative
workspaces_rootvalues are converted to absolute paths when saved.
Observability and analytics
| Variable | Default | Description |
|---|---|---|
ANALYTICS_DISABLED | false | Set true to turn off PostHog reporting |
POSTHOG_API_KEY | empty | Reporting is off when unset; set it to use your own PostHog project |
POSTHOG_HOST | https://us.i.posthog.com | PostHog host |
METRICS_ADDR | empty | Prometheus metrics listen address; empty means not started |
REALTIME_METRICS_TOKEN | empty | Bearer token protecting /health/realtime |
Next steps
- Sign-in and signup — sign-in methods and signup restrictions.
- Troubleshooting — symptom-based diagnosis of deployment problems.
- Daemon and runtimes — the daemon-side counterparts of this configuration.
Clowld Space
- Company governance:
CLOWLD_COMPANY_GOVERNANCE_ENABLED,CLOWLD_COMPANY_NAME,CLOWLD_COMPANY_EMAIL_DOMAINS,CLOWLD_COMPANY_CEO_EMAIL. - Model prices:
MODEL_PRICING_TIMEZONE,MODEL_PRICING_LITELLM_URL,MODEL_PRICING_MODELS_URL.