Skip to content

Reference: config.yaml

Every top-level block, what it's for, and what happens when it's absent. Copy config/config.example.yaml to config/config.yaml to start — every block below except organization, providers and defaults is optional and off by default. Which blocks (and which environment variables) turn a capability on, what appears when one does, and what it costs to run is the matrix in Turn features on and off.

BlockPurposeWhen absent
organizationThe GitHub organization (or user) this installation serves — the account its GitHub App is installed on. Names the shared memory scope (org:<organization>) and the About block every model run carriesrequired — nothing in the code assumes an organization
providersModel providers (anthropic, openai-compatible + a baseUrl) and which env var holds each one's keyrequired — nothing to route to
defaultsagent used with no other signal; models/efforts per agentrequired — the built-in agent floor is the last resort, not a real default
channels / usersStatic per-scope defaults, keyed by platform-namespaced id (slack:C…, slack:U…)that scope has no static defaults; runtime config set still applies
grantsWhat each actor holds — actions (commands, agent:run:<name>, dispatch), channels whose runs it may read, repos it may use — keyed by platform-namespaced id, or <ns>:* for everyone authenticated on a surface (access:* is the org)nobody is an admin; Slack users hold the open chat commands and every unrestricted agent, browser sessions every read, credentials nothing — see reference: authorization
restrictAgents and repos closed to everyone not granted themnothing restricted — every agent and repo open to whoever can reach the bot — see reference: authorization
executionWhere tool calls actually run: local (bot host), e2b / cloudflare (per-thread sandbox), plus an optional resident block for always-warm per-repo environmentslocal — fine for dev, not for untrusted users reaching coding
workspaceDirWhere local-execution workspaces live on disk./workspaces
memoryCross-session memory: read/write to a durable store, per-scope budgetoff — model input is byte-identical to memory disabled
selfImprovementThe friction → GitHub-issue pipeline over run history: target repo, label, thresholdsfriction propose refuses (no target repo); friction report still works over runHistory
schedulesWhere the /runs Scheduled panel reads cron firing history fromthe panel lists schedules with no firing history
shipagent:ship pipeline caps: maxRounds, maxMinutessane built-in defaults (3 rounds, 120 min)
costs/costs dashboard: Cloudflare account + token, optional Anthropic admin key, named groups of Workers/containers/DOs to price/costs refuses to start — nothing to report on
dashboardDashboard authentication: auth: access (the Cloudflare Access JWT, ACCESS_TEAM_DOMAIN + ACCESS_AUD), token (Authorization: Bearer from the env var token.env names, default DASHBOARD_TOKEN, resolving to the one actor token.actoraccess:<name>) or none (loopback callers on a localhost deployment only; a public PUBLIC_BASE_URL refuses to start) — see dashboard routesaccess when both ACCESS_* are set, else none — a deployed installation is unchanged; a localhost one without Access now admits its loopback callers
slack.catchUpReconnect catch-up window after a deploy/drainon, 30-minute window
runtimeOverridesWhere chat-set overrides (config set, config instructions) persistdata/overrides.json on host disk — ephemeral on Cloudflare Containers
runHistoryDurable run records: retention window, byte/count caps, which store backs itoff — runs are live-only, evicted ~60s after finish
tracingSpan log verbosity: log: roots (one JSON line per request) or slow (plus every span of 1 s or more)roots

Two blocks that matter most for "does a restart lose anything"

runtimeOverrides.worker and runHistory.worker (and memory.worker, schedules.worker) all point at the same state Worker (deploy/cloudflare-memory/) with the same bearer. Set them, and a bot restart loses nothing durable: overrides, memory, and run history (the friction ledger reads it) all live on Durable Objects, not the container's disk. Skip them (the default on a fresh clone), and all three fall back to a host-disk file or in-memory store — fine for local dev, silently ephemeral on a platform with no persistent disk. See explanation: Worker topology.

Full annotated example

config/config.example.yaml in the repo root is the living reference — every key, every default, every caveat, as a comment next to the setting it documents. This page is the map; that file is the terrain.