Config file
~/.octo/config.yml holds your default provider(s), model(s), and global settings, so a bare
octo works without re-typing flags. Every field is optional — a missing file, or a missing field,
falls back to the built-in default. Manage it with octo config rather than hand-editing where
possible.
Top-level keys
Section titled “Top-level keys”| Key | Type | Description |
|---|---|---|
endpoints |
list of endpoint | Configured providers, each bundling shared connection params and a list of models |
default |
string | Composite id <endpoint-id>::<model> used when nothing else selects one; empty falls back to the first endpoint’s first model |
lite |
string | Composite id <endpoint-id>::<model> for cheap internal calls (history compaction’s summarize step and session-title generation); empty infers from the endpoint’s lite_model or the vendor default |
permission_mode |
string | interactive | strict | auto |
coauthor |
bool | Append Co-authored-by to git commits the agent writes (default true) |
access_key |
string | Shared secret for Web UI / API auth when exposed beyond loopback |
compact_auto_pct |
int | Auto-compaction threshold as % of the context window (default 75); the same threshold is checked both between turns and after each tool-call batch |
reasoning_effort |
string | Global reasoning intensity: low | medium | high | xhigh | max; empty means off |
show_reasoning |
bool | Global default for surfacing the reasoning trace to the Web UI |
workspace_dir |
string | Default working dir for new web sessions; "auto" → ~/Desktop/octo |
tools |
tools block | Per-tool behavior knobs |
browser |
browser block | Chrome connection settings |
goal |
{ enabled: bool } |
Gates /goal and the goal tools (default enabled) |
trash |
trash block | File recycle-bin behavior (overwrite backups, retention, size cap) |
memory_backend |
object | Optional external semantic memory backend — see Memory backends |
language |
string | UI language preference (en | zh); empty means English |
notify |
bool | TUI only: send a desktop notification when a turn completes and is waiting for input. Ghostty / iTerm2 / Kitty forward it to the OS; other terminals fall back to the terminal bell (default true) |
terminal_title |
bool | TUI only: set the terminal tab/window title to the session name on startup (OSC 2, honoured by Ghostty, iTerm2, Kitty and most modern terminals; default true) |
When the agent edits this file, octo validates it right after the write and warns
in the turn if it no longer parses or has a semantic problem (a default
pointing at a missing endpoint, a duplicate id or half-filled entry) — a broken edit otherwise
degrades silently, since octo keeps using the last config that parsed cleanly.
Endpoint
Section titled “Endpoint”Each item in endpoints: bundles the connection params shared by a set of models. The two-level
shape lets the same model name live under more than one endpoint — say claude-sonnet-5 via both
the official Anthropic endpoint and a relay — which the old flat list couldn’t express.
| Key | Type | Description |
|---|---|---|
id |
string | Unique identifier and composite-id prefix; matches ^[a-zA-Z0-9_-]+$, no ::. The wizard names it after the provider (anthropic, openai, custom); rename it freely |
name |
string | Optional display name shown in the UI; may differ from id |
provider |
string | anthropic | openai | custom |
base_url |
string | Endpoint URL; empty uses the vendor default. Required for the custom vendor |
api_key |
string | Plaintext fallback used only if the provider’s env var is empty (mode 0600) |
protocol |
string | Wire format for the custom vendor only: anthropic | openai |
lite_model |
string | Optional: name a model in this endpoint’s models to serve as its compaction lite model |
models |
list of model | The models offered through this endpoint |
Each item in an endpoint’s models: list is independently selectable. --model <name> selects it —
and with it the endpoint’s connection params — while default / lite reference it by composite id
<endpoint-id>::<model>. Connection settings (base_url, api_key, protocol) and reasoning
(reasoning_effort, show_reasoning) live on the endpoint and top level respectively, not here.
| Key | Type | Description |
|---|---|---|
model |
string | The model id sent to the API (e.g. claude-sonnet-4-6) — also the name --model and the HTTP API use |
vision |
bool | Whether tools may hand this model images; a model-level capability, auto-detected for known models |
endpoints: - id: anthropic provider: anthropic models: - model: claude-sonnet-5 vision: true - id: deepseek provider: custom protocol: anthropic base_url: https://api.deepseek.com/anthropic models: - model: deepseek-chatdefault: anthropic::claude-sonnet-5lite: anthropic::claude-sonnet-5reasoning_effort: "" # low | medium | high | xhigh | max; empty = offpermission_mode: interactivecoauthor: trueTools block
Section titled “Tools block”tools: tool_search: enabled: auto # auto (default) | on | off threshold_pct: 10 disabled_skills: []disabled_skills hides listed skills from the model and the UI without deleting them from disk.
See Connect MCP servers for what tool_search does.
Browser block
Section titled “Browser block”browser: attach_running: true # reuse your logged-in Chrome instead of a throwaway profile connect_port: 9222 # attach via --remote-debugging-port instead user_data_dir: "" exec_path: "" download_dir: ""See Automate with browser control.
Trash block
Section titled “Trash block”trash: overwrite_backup: true # stage a copy before write_file/edit_file overwrites (git-clean files skipped) retention_days: 14 # age out entries at startup; negative disables max_size_mb: 10240 # evict oldest past this cap; negative disablesSee Sandbox the agent for how the recycle bin fits into the
safety model, and octo trash list|restore|rm|empty for recovery from the CLI.
Next: many of these settings have a matching CLI flag for a per-run override — see the CLI reference.