Configuration
Manage operator-facing swarm settings from the dashboard — feature flags, thresholds, and defaults grouped by subsystem
The Configuration page (Settings → Configuration, at /settings/configuration in the dashboard) surfaces the environment variables that shape how your swarm behaves — steering, memory retrieval, heartbeat and crash recovery, harness selection, integration toggles, security, workflow limits, and branding — as editable settings, so you can tune a running deployment without shelling into the host to edit .env files.

How values resolve
Every setting on this page corresponds to an environment variable the API server reads. Saving a value from the dashboard stores it as a global swarm config entry (the same swarm_config store used by the get-config / set-config MCP tools), and the server applies it via an automatic config reload shortly after the save.
Precedence rules:
- At boot, real environment variables win: a variable set in the server's environment takes precedence over a stored value until the next reload.
- After a save or reload, stored values win: the server re-injects global config over the process environment.
- Settings marked with a Restart required badge are only read at server startup — saving them stores the value, but it takes effect on the next restart.
Each row shows a source chip when the underlying environment variable is set on the server, so you can tell whether the effective value comes from the environment, the stored config, or both.
Groups
Claude transport default
The Harness & tools group includes CLAUDE_TRANSPORT, with cli as the default and sdk as the optional value.
Agents can inherit this default or assign a transport beneath the harness selector on their details page.
An agent override takes precedence over the global default. A repository override takes precedence when the session supplies its repository.
Transport changes apply to future sessions and do not require a worker restart.
The worker resolves this key for each session instead of retaining a scoped value in its deployment environment.
SDK selection is incompatible with an effective Claude Bridge or legacy bridge binary.
| Group | Examples |
|---|---|
| Steering | STEERING_ENABLED, SLACK_THREAD_STEERING, SLACK_THREAD_STEERING_MODE |
| Memory | MEMORY_HYBRID_SEARCH, MEMORY_GRAPH_EXPANSION, MEMORY_RATERS, EMBEDDING_MODEL |
| Heartbeat & crash recovery | HEARTBEAT_INTERVAL_MS, HEARTBEAT_STALL_THRESHOLD_MIN, RUNTIME_STALE_THRESHOLD_MIN, HEARTBEAT_PIN_CRASH_RESUME |
| Harness & tools | SCRIPTS_ONLY_MCP, TASK_TOOL_PRELOAD_ENABLED, TASK_TOOL_MANIFESTS, MULTI_RUNTIME_ENABLED, CAPABILITIES, OPENROUTER_BASE_URL, WORKER_API_READY_TIMEOUT_SECONDS, CONTEXT_PREAMBLE_MAX_TOKENS |
| Database | DB_QUERY_BOUNDED_ENABLED, DB_QUERY_HTTP_BUDGET_MS, DB_QUERY_HTTP_MAX_ROWS, DB_QUERY_MCP_BUDGET_MS, DB_QUERY_MCP_MAX_ROWS, DB_QUERY_CONCURRENCY_CAP, SESSION_LOG_RETENTION_DAYS, AGENT_LOG_RETENTION_DAYS, EVENTS_RETENTION_DAYS, DB_RETENTION_DRY_RUN, DB_RETENTION_TICK_BUDGET_MS, DB_RETENTION_CATCHUP_INTERVAL_MS, DB_RETENTION_MAX_STATEMENT_MS |
| Integrations | SLACK_DISABLE, SLACK_ALLOW_DEV_SOCKET_MODE, SLACK_RENDER_V2, SLACK_RENDER_V2_DELEGATION, SLACK_CONCLUSION_SETTLE_SEC, SLACK_CONCLUSION_TIMEOUT_MIN, SLACK_TREE_STALL_MIN, GITHUB_DISABLE, LINEAR_DISABLE, SLACK_ALERTS_CHANNEL, AGENT_FS_REQUEST_TIMEOUT_MS, SLACK_REACTION_ACCEPTED, SLACK_REACTION_BUFFERED, SLACK_REACTION_NOW, SLACK_REACTION_STEERED, SLACK_REACTION_COMPLETED, SLACK_REACTION_FAILED |
| Security & access | RBAC_ENABLED, BUDGET_ADMISSION_DISABLED, MCP_OAUTH_ALLOW_PRIVATE_HOSTS, CORS_ALLOWED_ORIGINS (custom list replaces hosted/dev defaults; unset or blank uses defaults) |
| Workflows & scheduler | WORKFLOW_MAX_ITERATIONS, SCHEDULER_INTERVAL_MS, SEED_AUTOMATIONS_ENABLED |
| Telemetry & observability | OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME, ANONYMIZED_TELEMETRY |
| Branding & URLs | SWARM_ORG_NAME, SWARM_BRAND_COLOR, DASHBOARD_URL |
Harness provider and model selection are deliberately absent from this page — they are configured per agent. A global value would silently become the default for every agent in the swarm, so those knobs live on each agent's own configuration instead. OPENROUTER_BASE_URL is a deployment-wide routing endpoint rather than a model choice, which is why it does belong here.
Settings with deeper behavior link out to the relevant guide (for example the task steering and harness providers guides) directly from the row.
Database retention permanently deletes history
Leave SESSION_LOG_RETENTION_DAYS, AGENT_LOG_RETENTION_DAYS, and EVENTS_RETENTION_DAYS unset to disable their individual sweeps. Each value must be between 1 and 1,000,000 whole days. We recommend at least seven days so recent task recovery and memory rating keep their context. Start with DB_RETENTION_DRY_RUN=true, verify the exact would-delete counts, then enable one table at a time. Retention deletes session transcripts, task history, or telemetry. Event aggregate totals become retention-window totals after an event sweep.

Editing
Controls match the value type:
- Toggles (feature flags) persist immediately when switched.
- Selects (enumerated values such as
SLACK_THREAD_STEERING_MODE) persist on change. - Text and number inputs show a Save button once the value differs from what is stored.
Every row shows its default, and rows with a stored value offer a Reset action that deletes the stored entry and returns the setting to its default (or to the environment value, if one is set). The Reload config button in the header forces an immediate config reload — useful after changing environment variables outside the dashboard.
Credentials live elsewhere
This page intentionally excludes secrets. Integration credentials (Slack tokens, GitHub app keys, OAuth secrets) are managed on the Integrations pages, and swarm-wide secret values on the Secrets page — see the secrets encryption guide.
Multiple runtimes per agent
MULTI_RUNTIME_ENABLED is off by default: one worker process serves one agent, and that worker's reported concurrency becomes the agent's task limit. Turning it on lets several processes serve the same agent — each is tracked with its own capacity and liveness, and the agent's limit moves to its agent-scoped AGENT_MAX_TASKS setting (seeded from the agent's current limit the first time it registers, so enabling the flag does not change what the swarm enforces).
Workers must be updated before enabling it: with the flag on, a worker that does not identify its runtime is rejected at registration and shutdown. A worker that stops reporting for RUNTIME_STALE_THRESHOLD_MIN (default 5 minutes) stops counting toward its agent, and an agent whose last live worker expires is marked offline. See the multi-runtime agents guide for the rollout order, shared-workspace Compose example, rollback behavior, and the heartbeat and crash recovery runbook.
Workspace state is not shared for you. Work for one agent can continue on a different process than the one that started it, so runtimes sharing an AGENT_ID need compatible workspace state. In Docker Compose or similar deployments, give them the same persistent workspace/repository volume when continuation depends on local files. If their workspaces are independent, task continuation must rely only on state that can be reconstructed from shared sources — the repository, the control plane, or attachments — because enabling this setting does not synchronize arbitrary local filesystem state between workers.
OPENROUTER_BASE_URL points the harnesses at a model gateway
This is the one exception to the "no model knobs here" rule above, and it is not a model choice: it sets where OpenRouter-shaped requests go, not which model runs. Point it at any gateway serving OpenRouter-compatible GET /models and POST /chat/completions — openrouter.ai, OrcaRouter, or a self-hosted proxy — and the OpenCode and pi-mono harnesses, model refreshes, and internal summarizers all route through it. Leave it blank for openrouter.ai.
A saved value reaches both sides without a restart. The API server re-injects it over its process environment on the debounced config reload. Each worker fetches the resolved config before starting a task and passes it into the harness adapter, so the change lands on that worker's next task; a task already running keeps the gateway it started with.
The gateway credential is not set here — OPENROUTER_API_KEY belongs on the Secrets page or in the worker environment. Setup for each harness, model-string rules, and which harnesses this cannot redirect: Model Gateways.
WORKER_API_READY_TIMEOUT_SECONDS is bootstrap-only
Every worker and lead container's docker-entrypoint.sh polls the control-plane API's public GET /health endpoint before doing anything else that depends on it (fetching config, syncing skills, restoring services). If the API never becomes reachable within WORKER_API_READY_TIMEOUT_SECONDS (a positive integer, default 90), the container logs a stable [entrypoint] FATAL: API readiness timed out after Ns waiting for <url>; exiting. line and exits non-zero rather than starting half-provisioned.
This check runs before the container can reach the API at all, so it can only ever read the value from its own process environment — a row saved here documents and validates the setting (and is what the Restart required badge refers to), but it cannot reach an already-waiting container. Set it as a real deployment environment variable on the worker/lead container, not just in the dashboard.
CONTEXT_PREAMBLE_MAX_TOKENS is read once at process start
Every follow-up task gets a bounded text summary of its parent/ancestor task chain prepended to its prompt, uniformly across all harness providers (not just those with native session resume). CONTEXT_PREAMBLE_MAX_TOKENS (default 2000, ~4 chars/token, so ~8,000 chars) caps that summary's size. It exists to prevent the SIGTERM-143 context-saturation failure mode seen with unbounded session resumes — raising it too far risks reintroducing that failure, so keep it well below the target model's context window.
The API server reads this value into a module-level constant at boot, so a saved value takes effect on the next restart (the Restart required badge on this row).
Task tool preloading (proposal)
TASK_TOOL_PRELOAD_ENABLED defaults to false. With it enabled, each new agent MCP session reads
TASK_TOOL_MANIFESTS, selects tools using the authenticated agent's current task, and marks their
MCP metadata with anthropic/alwaysLoad: true. Claude Code supports this annotation; no reduction
in tool searches is claimed for other harnesses. Existing sessions retain their original selection.
Both settings can be stored in global or agent-scoped configuration. Agent-scoped values override global values; resolved configuration takes precedence over environment defaults. The dashboard edits global values. For a small pilot, use agent-scoped configuration instead.
{
"taskTypes": {
"review": ["get-tasks", "script-run", "get-repos"]
},
"schedules": {
"12345678-1234-4234-8234-123456789abc": ["script-run", "kv-get"]
}
}Keys match exactly. A schedule entry replaces the task-type selection, including an empty array to opt out. Each entry accepts at most 16 registered swarm tool names. Unsupported shapes or unknown names are rejected on config writes. Invalid environment values fall back to ordinary discovery with a server warning. Missing task context, an unowned task, or no match adds no tools. Slack tools preload only when the task has Slack context. Capability filters, scripts-only mode, and tool-call permissions still apply; preloading never grants access or removes searchable tools.
Each selected tool adds its description and input schema to the initial model context. A long schema can cost more than the search it replaces. Compare input/cache tokens, cost, and tool-search steps on the same recurring targets before enabling this broadly. Turn the flag off to restore ordinary discovery for new sessions. This proposal does not enable either setting.
Seeded automation auto-enable
SEED_AUTOMATIONS_ENABLED defaults to true and controls whether a freshly seeded workflow or
schedule that needs no integration and no required param/placeholder — and whose own template
doesn't recommend staying off — arrives already enabled at boot, instead of disabled-but-inventoried.
An item that needs a credential or a param this install doesn't have is unaffected either way.
This includes daily-swarm-update-check, a zero-config schedule that calls the public GitHub
releases API on a daily cron and posts to the configured admin channel when a newer
desplega-ai/agent-swarm release is available — the only outbound network call and notification
this switch turns on by default. Turn the switch off, or disable that schedule individually from
its details page, to stop it.
The API server reads this value at boot when seeding runs (restartRequired): flip it, then restart
to change what a future seed pass creates. It does not retroactively enable or disable automations
already created on this install.
Access control
Reading configuration requires dashboard access (API key). Writes go through the config API's RBAC gate (config.write.any): operator and user tokens can save, and agent principals are restricted to lead agents.
Adding a new setting
If you are contributing a new operator-facing environment variable to Agent Swarm, register it in the configuration catalog at apps/ui/src/lib/configuration-catalog.ts (group, value kind, default, description, and docs link) so it appears on this page. Reserved bootstrap keys (API_KEY, SECRETS_ENCRYPTION_KEY) and credentials must never be added to the catalog.
CORS_ALLOW_ANY_ORIGIN is deployment-only and is not available in Configuration. Set it in the API deployment environment and restart the API for arbitrary-origin bearer-token clients using credentials: "omit". It never grants credentialed CORS to an unlisted origin: cookie-authenticated responses, including page JSON and /@swarm/api/*, still require CORS_ALLOWED_ORIGINS (or the built-in defaults). HTTP, MCP, and database config writes reject this reserved key; legacy stored rows are ignored during startup and reload and can be deleted. Prefer configuring trusted origins with CORS_ALLOWED_ORIGINS.
Overview
The Agent Swarm dashboard — what it is, the hosted instance at app.agent-swarm.dev, and how to self-host it
Playbooks
Ten production playbooks for running an agent swarm — feature development, prospecting, content, UX audits, customer support, code health, code-health reports, DORA metrics, cross-source reports, and self-documenting releases. Real flows, real schedules, real agents.