Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Config Reference

ZeroClaw is configured via a TOML file. All fields are optional unless noted.

SectionDescription
acpACP (Agent Client Protocol) server configuration ([acp] section).
agentsAliased agents in this install. Each entry under [agents.<alias>]
backupBackup tool configuration ([backup] section).
browserBrowser automation configuration ([browser] section).
browser_delegate
channelsTop-level channel configurations ([channels] section).
claude_codeClaude Code CLI tool configuration ([claude_code] section).
claude_code_runnerClaude Code task runner configuration ([claude_code_runner] section).
cloud_opsControls the read-only cloud transformation analysis tools:
codex_cliCodex CLI tool configuration ([codex_cli] section).
composioComposio managed OAuth tools integration ([composio] section).
conversational_aiConversational AI agent builder configuration ([conversational_ai] section).
costCost tracking and budget enforcement configuration ([cost] section).
cronDeclarative cron jobs ([cron.<alias>]), alias-keyed.
data_retentionData retention and purge configuration ([data_retention] section).
delegateGlobal delegate tool configuration for default timeout values.
embedding_routesEmbedding-routing rules — route hint:<name> to specific
escalationEscalation routing configuration ([escalation] section).
file_downloadStandalone file download tool configuration ([file_download]).
file_uploadStandalone file upload tool configuration ([file_upload]).
file_upload_bundleStandalone multi-file bundle upload tool configuration
gatewayGateway server configuration ([gateway] section).
gemini_cliGemini CLI tool configuration ([gemini_cli] section).
google_workspaceGoogle Workspace CLI (gws) tool configuration ([google_workspace] section).
hardwareWizard-driven hardware configuration for physical world interaction.
heartbeatHeartbeat configuration for periodic health pings ([heartbeat] section).
hooks
http_requestHTTP request tool configuration ([http_request] section).
image_genStandalone image generation tool configuration ([image_gen]).
jiraJira integration configuration ([jira]).
knowledgeKnowledge graph configuration for capturing and reusing expertise.
knowledge_bundlesNamed knowledge bundles ([knowledge_bundles.<alias>]).
link_enricherAutomatic link understanding for inbound channel messages ([link_enricher]).
linkedinLinkedIn integration configuration ([linkedin] section).
localeLocale for tool descriptions (e.g. "en", "zh-CN").
mcpExternal MCP client configuration ([mcp] section).
mcp_bundlesNamed MCP server bundles ([mcp_bundles.<alias>]).
media_pipelineAutomatic media understanding pipeline configuration ([media_pipeline]).
memoryMemory backend configuration ([memory] section).
microsoft365Microsoft 365 integration via Microsoft Graph API ([microsoft365] section).
model_routesModel-routing rules — route hint:<name> to specific
multimodalMultimodal (image) handling configuration ([multimodal] section).
node_transportSecure transport configuration for inter-node communication ([node_transport]).
nodesConfiguration for the dynamic node discovery system ([nodes]).
notionNotion integration configuration ([notion]).
observabilityObservability backend configuration ([observability] section).
onboard_stateMulti-client workspace isolation configuration.
opencode_cliOpenCode CLI tool configuration ([opencode_cli] section).
pacingPacing controls for slow/local LLM workloads ([pacing] section).
peer_groupsNamed peer groups ([peer_groups.<name>]). Each entry binds a
peripheralsPeripheral board integration configuration ([peripherals] section).
pipelinePipeline tool configuration ([pipeline] section).
pluginsPlugin system configuration.
project_intelProject delivery intelligence configuration ([project_intel] section).
providersTop-level wrapper for every provider category. TOML root sees a
proxyProxy configuration for outbound HTTP/HTTPS/SOCKS5 traffic ([proxy] section).
query_classificationAutomatic query classification — classifies user messages by keyword/pattern
reliabilityReliability and supervision configuration ([reliability] section).
risk_profilesNamed risk/autonomy profiles ([risk_profiles.<alias>]).
runtimeRuntime adapter configuration ([runtime] section).
runtime_profilesNamed runtime/LLM execution profiles ([runtime_profiles.<alias>]).
schedulerScheduler configuration for periodic task execution ([scheduler] section).
schema_versionConfig file schema version.
secretsSecrets encryption configuration ([secrets] section).
securitySecurity configuration for audit logging, OTP, e-stop, IAM/SSO, and WebAuthn.
security_opsManaged Cybersecurity Service (MCSS) dashboard agent configuration ([security_ops]).
shell_toolShell tool configuration ([shell_tool] section).
skill_bundlesNamed skill bundles ([skill_bundles.<alias>]).
skillsSkills loading configuration ([skills] section).
sopStandard Operating Procedures engine configuration ([sop]).
storagePersistent storage configuration ([storage] section).
text_browserText browser tool configuration ([text_browser] section).
transcriptionVoice transcription configuration with multi-provider support.
trust
ttsText-to-Speech subsystem configuration ([tts]).
tunnelTunnel configuration for exposing the gateway publicly ([tunnel] section).
verifiable_intentVerifiable Intent (VI) credential verification and issuance ([verifiable_intent] section).
web_fetchWeb fetch tool configuration ([web_fetch] section).
web_searchWeb search tool configuration ([web_search] section).
wssWebSocket Secure (WSS) transport for remote TUI-to-daemon connections ([wss]).

acp

ACP (Agent Client Protocol) server configuration ([acp] section).

KeyTypeDefaultDescription
default_agentstring?Agent alias to use when session/new omits agentAlias and more than
max_sessionsinteger10Maximum number of concurrent ACP sessions. Default: 10.
session_timeout_secsinteger3600Idle session timeout in seconds. Sessions with no activity for this

agents

Aliased agents in this install. Each entry under [agents.<alias>] is one user-facing agent with its own identity, channels, model provider, risk profile, workspace, and memory scope. DelegateTool consults this map when one agent delegates a subtask to another.

backup

Backup tool configuration ([backup] section).

KeyTypeDefaultDescription
compressbooltrueCompress backup archives.
destination_dirstring"state/backups"Output directory for backup archives (relative to workspace root).
enabledbooltrueEnable the backup tool.
encryptboolfalseEncrypt backup archives (requires a configured secret store key).
include_dirsstring[]["config","memory","audit","knowledge"]Workspace subdirectories to include in backups.
max_keepinteger10Maximum number of backups to keep (oldest are pruned).
schedule_cronstring?nullOptional cron expression for scheduled automatic backups.
schedule_timezonestring?nullIANA timezone for schedule_cron.

browser

Browser automation configuration ([browser] section).

Controls the browser_open tool and browser automation backends.

KeyTypeDefaultDescription
allowed_domainsstring[]["*"]Allowed domains for browser_open (exact or subdomain match)
backendstring"agent_browser"Browser automation backend: “agent_browser” | “rust_native” | “computer_use” | “auto”
computer_useobjectComputer-use sidecar configuration ([browser.computer_use] section).
enabledbooltrueEnable browser_open tool (opens URLs in the system browser without scraping)
headedbool?nullShow browser window for agent_browser backend. When unset, inherits AGENT_BROWSER_HEADED.
native_chrome_pathstring?nullOptional Chrome/Chromium executable path for rust-native backend
native_headlessbooltrueHeadless mode for rust-native backend
native_webdriver_urlstring"http://127.0.0.1:9515"WebDriver endpoint URL for rust-native backend (e.g. http://127.0.0.1:9515)
session_namestring?nullBrowser session name (for agent-browser automation)

browser.computer_use

Computer-use sidecar configuration ([browser.computer_use] section).

Delegates OS-level mouse, keyboard, and screenshot actions to a local sidecar.

KeyTypeDefaultDescription
allow_remote_endpointboolfalseAllow remote/public endpoint for computer-use sidecar (default: false)
api_key 🔑string?nullOptional bearer token for computer-use sidecar
endpointstring"http://127.0.0.1:8787/v1/actions"Sidecar endpoint for computer-use actions (OS-level mouse/keyboard/screenshot)
max_coordinate_xinteger?nullOptional X-axis boundary for coordinate-based actions
max_coordinate_yinteger?nullOptional Y-axis boundary for coordinate-based actions
timeout_msinteger15000Per-action request timeout in milliseconds
window_allowliststring[][]Optional window title/process allowlist forwarded to sidecar policy

browser_delegate

KeyTypeDefaultDescription
allowed_domainsstring[][]
blocked_domainsstring[][]
chrome_profile_dirstring""
cli_binarystring"claude"
enabledboolfalse
task_timeout_secsinteger120

channels

Top-level channel configurations ([channels] section).

each channel type is a keyed table of named instances (aliases). [channels.telegram.default] is the conventional single-instance key. Access via config.channels.telegram.get("default").

KeyTypeDefaultDescription
ack_reactionsbooltrueWhether to add acknowledgement reactions (👀 on receipt, ✅/⚠️ on
amqpmapAMQP channel instances ([channels.amqp.<alias>]).
blueskymapBluesky channel instances ([channels.bluesky.<alias>]).
clawdtalkmapClawdTalk voice channel instances ([channels.clawdtalk.<alias>]).
clibooltrueEnable the CLI interactive channel. Default: true.
debounce_msinteger0Inbound message debounce window in milliseconds. When a sender fires
dingtalkmapDingTalk channel instances ([channels.dingtalk.<alias>]).
discordmapDiscord bot channel instances ([channels.discord.<alias>]).
emailmapEmail channel instances ([channels.email.<alias>]).
gmail_pushmapGmail Pub/Sub push notification channel instances ([channels.gmail_push.<alias>]).
imessagemapiMessage channel instances ([channels.imessage.<alias>], macOS only).
ircmapIRC channel instances ([channels.irc.<alias>]).
larkmapLark channel instances ([channels.lark.<alias>]).
linemapLINE Messaging API channel instances ([channels.line.<alias>]).
linqmapLinq Partner API channel instances ([channels.linq.<alias>]).
matrixmapMatrix channel instances ([channels.matrix.<alias>]).
mattermostmapMattermost bot channel instances ([channels.mattermost.<alias>]).
max_concurrent_per_channelinteger4Per-channel multiplier for the global channel message in-flight budget.
message_timeout_secsinteger300Base timeout in seconds for processing a single channel message (LLM + tools).
mochatmapMochat customer service channel instances ([channels.mochat.<alias>]).
mqttmapMQTT channel instances ([channels.mqtt.<alias>]).
nextcloud_talkmapNextcloud Talk bot channel instances ([channels.nextcloud_talk.<alias>]).
nostrmap
qqmapQQ Official Bot channel instances ([channels.qq.<alias>]).
redditmapReddit channel instances ([channels.reddit.<alias>]).
session_backendstring"sqlite"Session persistence backend: "jsonl" (legacy) or "sqlite" (new default).
session_persistencebooltruePersist channel conversation history to JSONL files so sessions survive
session_ttl_hoursinteger0Auto-archive stale sessions older than this many hours. 0 disables. Default: 0.
show_tool_callsboolfalseWhether to send tool-call notification messages (e.g. 🔧 web_search_tool: …)
signalmapSignal channel instances ([channels.signal.<alias>]).
slackmapSlack bot channel instances ([channels.slack.<alias>]).
telegrammapTelegram bot channel instances ([channels.telegram.<alias>]).
twitchmapTwitch chat channel instances ([channels.twitch.<alias>]).
twittermapX/Twitter channel instances ([channels.twitter.<alias>]).
voice_callmapVoice call channel instances ([channels.voice_call.<alias>]).
voice_duplexmapVoice duplex instances ([channels.voice_duplex.<alias>]).
voice_wakemapVoice wake word detection channel instances ([channels.voice_wake.<alias>]).
watimapWATI WhatsApp Business API channel instances ([channels.wati.<alias>]).
webhookmapWebhook channel instances ([channels.webhook.<alias>]).
wechatmapWeChat personal iLink Bot channel instances ([channels.wechat.<alias>]).
wecommapWeCom (WeChat Enterprise) Bot Webhook channel instances ([channels.wecom.<alias>]).
wecom_wsmapWeCom AI Bot WebSocket channel instances ([channels.wecom_ws.<alias>]).
whatsappmapWhatsApp channel instances ([channels.whatsapp.<alias>]).

claude_code

Claude Code CLI tool configuration ([claude_code] section).

Delegates coding tasks to the claude -p CLI. Authentication uses the binary’s own OAuth session (Max subscription) by default — no API key needed unless env_passthrough includes ANTHROPIC_API_KEY.

KeyTypeDefaultDescription
allowed_toolsstring[]["Read","Edit","Bash","Write"]Claude Code tools the subprocess is allowed to use
enabledboolfalseEnable the claude_code tool
env_passthroughstring[][]Extra env vars passed to the claude subprocess (e.g. ANTHROPIC_API_KEY for API-key billing)
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
system_promptstring?nullOptional system prompt appended to Claude Code invocations
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

claude_code_runner

Claude Code task runner configuration ([claude_code_runner] section).

Spawns Claude Code in a tmux session with HTTP hooks that POST tool execution events back to ZeroClaw’s gateway, updating a Slack message in-place with progress plus an SSH handoff link.

KeyTypeDefaultDescription
enabledboolfalseEnable the claude_code_runner tool
session_ttlinteger3600Session time-to-live in seconds before auto-cleanup (default: 3600)
ssh_hoststring?nullSSH host for session handoff links (e.g. “myhost.example.com”)
tmux_prefixstring"zc-claude-"Prefix for tmux session names (default: “zc-claude-”)

cloud_ops

Controls the read-only cloud transformation analysis tools: IaC review, migration assessment, cost analysis, and architecture review.

KeyTypeDefaultDescription
cost_threshold_monthly_usdnumber100.0Monthly USD threshold to flag cost items. Default: 100.0.
default_cloudstring"aws"Default cloud model_provider for analysis context. Default: “aws”.
enabledboolfalseEnable cloud operations tools. Default: false.
iac_toolsstring[]["terraform"]Supported IaC tools for review. Default: [terraform].
supported_cloudsstring[]["aws","azure","gcp"]Supported cloud model_providers. Default: [aws, azure, gcp].
well_architected_frameworksstring[]["aws-waf"]Well-Architected Frameworks to check against. Default: [aws-waf].

codex_cli

Codex CLI tool configuration ([codex_cli] section).

Delegates coding tasks to the codex exec CLI. Authentication uses the binary’s own session by default — no API key needed unless env_passthrough includes OPENAI_API_KEY.

KeyTypeDefaultDescription
enabledboolfalseEnable the codex_cli tool
env_passthroughstring[][]Extra env vars passed to the codex subprocess (e.g. OPENAI_API_KEY)
extra_argsstring[][]Extra CLI arguments appended to codex exec before the prompt.
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

composio

Composio managed OAuth tools integration ([composio] section).

Provides access to 1000+ OAuth-connected tools via the Composio platform.

KeyTypeDefaultDescription
api_key 🔑string?nullComposio API key (stored encrypted when secrets.encrypt = true)
enabledboolfalseEnable Composio integration for 1000+ OAuth tools
entity_idstring"default"Default entity ID for multi-user setups

conversational_ai

Conversational AI agent builder configuration ([conversational_ai] section).

Status: Reserved for future use. This configuration is parsed but not yet consumed by the runtime. Setting enabled = true will produce a startup warning.

KeyTypeDefaultDescription
analytics_enabledboolfalseEnable conversation analytics tracking. Default: false (privacy-by-default).
auto_detect_languagebooltrueAutomatically detect user language from message content. Default: true.
conversation_timeout_secsinteger1800Conversation timeout in seconds (inactivity). Default: 1800.
default_languagestring"en"Default language for conversations (BCP-47 tag). Default: “en”.
enabledboolfalseEnable conversational AI features. Default: false.
escalation_confidence_thresholdnumber0.3Intent confidence below this threshold triggers escalation. Default: 0.3.
knowledge_base_toolstring?nullOptional tool name for RAG-based knowledge base lookup during conversations.
max_conversation_turnsinteger50Maximum conversation turns before auto-ending. Default: 50.
supported_languagesstring[]["en","de","fr","it"]Supported languages for conversations. Default: [en, de, fr, it].

cost

Cost tracking and budget enforcement configuration ([cost] section).

KeyTypeDefaultDescription
allow_overrideboolfalseAllow requests to exceed budget with –override flag (default: false)
daily_limit_usdnumber10.0Daily spending limit in USD (default: 10.00)
enabledbooltrueEnable cost tracking (default: true)
enforcementobjectConfiguration for cost enforcement behavior when budget limits are reached.
monthly_limit_usdnumber100.0Monthly spending limit in USD (default: 100.00)
ratesobject[cost.rates] — top-level rate-sheet namespace. Mirrors the
track_per_agentbooltrueStamp each recorded cost entry with the originating agent alias so
warn_at_percentinteger80Warn when spending reaches this percentage of limit (default: 80)

cost.enforcement

Configuration for cost enforcement behavior when budget limits are reached.

KeyTypeDefaultDescription
modestring"warn"Enforcement mode: “warn”, “block”, or “route_down”.
reserve_percentinteger10Reserve this percentage of budget for critical operations.
route_down_modelstring?nullModel hint to route to when budget is exceeded (used with “route_down” mode).

cost.rates

[cost.rates] — top-level rate-sheet namespace. Mirrors the [providers.*] shape so each subsection here points at the same kind of resource its [providers.*] counterpart configures.

KeyTypeDefaultDescription
providersobject[cost.rates.providers.*] — provider-shaped rate sheets. Each field
toolsmap{}[cost.rates.tools.<name>] — per-call rates for tools that

cost.rates.providers

[cost.rates.providers.*] — provider-shaped rate sheets. Each field here mirrors a corresponding field on [providers.*] with the trailing alias segment replaced by the resource the rate prices. The inner typed wrappers carry the per-provider-type slot layout and own dispatch (their slot list is the single source of truth, shared with their providers counterpart via the for_each_*_provider_slot! macros in [crate::providers]).

KeyTypeDefaultDescription
modelsobject[cost.rates.providers.models.<type>.<model>] — token-cost rates
transcriptionobjectcost.rates.providers.transcription.<type>.<model>
ttsobjectcost.rates.providers.tts.<type>.<voice>

cron

Declarative cron jobs ([cron.<alias>]), alias-keyed.

Each entry is a named scheduled job synced into the database at scheduler startup. Subsystem runtime knobs (enable/disable, catch-up, run-history retention) live on [scheduler].

data_retention

Data retention and purge configuration ([data_retention] section).

KeyTypeDefaultDescription
categoriesstring[][]Limit retention enforcement to specific data categories (empty = all).
dry_runboolfalsePreview what would be deleted without actually removing anything.
enabledboolfalseEnable the data_management tool.
retention_daysinteger90Days of data to retain before purge eligibility.

delegate

Global delegate tool configuration for default timeout values.

KeyTypeDefaultDescription
agentic_timeout_secsinteger300Default timeout in seconds for agentic sub-agent runs.
timeout_secsinteger120Default timeout in seconds for non-agentic sub-agent model_provider calls.

embedding_routes

Embedding-routing rules — route hint:<name> to specific model_provider + model combos for embedding requests.

escalation

Escalation routing configuration ([escalation] section).

Controls which channels receive alert notifications when escalate_to_human is called with high or critical urgency. Channels are identified by name (e.g. "telegram", "slack"). Alerts are sent best-effort and do not block the escalation.

KeyTypeDefaultDescription
alert_channelsstring[][]Channel names to alert on high/critical escalations (default: empty).

file_download

Standalone file download tool configuration ([file_download]).

When url is set to a non-empty value, registers a file_download tool that GETs a file from the configured endpoint and writes it to the agent’s workspace filesystem. The LLM supplies only a document identifier and a workspace-relative destination path; the endpoint URL comes solely from this config and is never model-controlled. Response bytes are streamed to disk and never loaded into model context.

When url is None or empty, the tool is not registered.

KeyTypeDefaultDescription
headersmap{}Static HTTP headers attached to every download request — typically an
max_file_size_bytesinteger26214400Maximum download size in bytes. Enforced while streaming: the transfer
timeout_secsinteger120Request timeout in seconds. Default: 120.
urlstring?nullDownload endpoint URL. Tool is disabled when this is None or empty.

file_upload

Standalone file upload tool configuration ([file_upload]).

When url is set to a non-empty value, registers a file_upload tool that POSTs files from the agent’s local filesystem to the configured endpoint using multipart/form-data. The LLM provides only a file path; the host reads the bytes and uploads them without ever including file content in the model context.

When url is None or empty, the tool is not registered.

KeyTypeDefaultDescription
field_namestring"file"Multipart form-field name for the file part. Default: file.
headers 🔑map{}Static HTTP headers attached to every upload request. Same shape as
max_file_size_bytesinteger26214400Maximum file size in bytes. Larger files are rejected before any
methodstring"POST"HTTP method. Only POST (default) and PUT are accepted.
timeout_secsinteger60Request timeout in seconds. Default: 60.
urlstring?nullUpload endpoint URL. Tool is disabled when this is None or empty.

file_upload_bundle

Standalone multi-file bundle upload tool configuration ([file_upload_bundle]).

When url is set to a non-empty value, registers a file_upload_bundle tool that POSTs N files from the agent’s local filesystem to the configured endpoint as a single multipart/form-data request. The LLM provides only file paths; the host reads the bytes.

When url is None or empty, the tool is not registered.

KeyTypeDefaultDescription
field_namestring"file"Multipart form-field name reused across every file part. Default: file.
headersmap{}Static HTTP headers attached to every upload request.
max_file_size_bytesinteger10485760Maximum per-file size in bytes. Default: 10 MiB.
max_filesinteger16Maximum number of files per call. Default: 16.
max_response_body_bytesinteger4096Maximum response body bytes to read from the upload endpoint.
max_total_size_bytesinteger33554432Maximum cumulative size across every file in one call. Default: 32 MiB.
methodstring"POST"HTTP method. Only POST (default) and PUT are accepted.
timeout_secsinteger120Request timeout in seconds. Default: 120.
urlstring?nullUpload endpoint URL. Tool is disabled when this is None or empty.

gateway

Gateway server configuration ([gateway] section).

Controls the HTTP gateway for webhook and pairing endpoints.

KeyTypeDefaultDescription
allow_public_bindboolfalseAllow binding to non-localhost without a tunnel (default: false)
allow_remote_adminboolfalseAllow authenticated remote callers to use admin endpoints that are
hoststring"127.0.0.1"Gateway host (default: 127.0.0.1)
idempotency_max_keysinteger10000Maximum distinct idempotency keys retained in memory.
idempotency_ttl_secsinteger300TTL for webhook idempotency keys.
long_running_request_timeout_secsinteger600HTTP request timeout (seconds) for POST /api/cron/{id}/run, which
pair_rate_limit_per_minuteinteger10Max /pair requests per minute per client key.
paired_tokens 🔑string[][]Paired bearer tokens (managed automatically, not user-edited)
pairing_dashboardobjectPairing dashboard configuration ([gateway.pairing_dashboard]).
path_prefixstring?nullOptional URL path prefix for reverse-proxy deployments.
portinteger42617Gateway port (default: 42617)
rate_limit_max_keysinteger10000Maximum distinct client keys tracked by gateway rate limiter maps.
request_timeout_secsinteger30HTTP request timeout (seconds) for gateway routes other than the
require_pairingbooltrueRequire pairing before accepting requests (default: true)
session_persistencebooltruePersist gateway WebSocket chat sessions to SQLite. Default: true.
session_ttl_hoursinteger0Auto-archive stale gateway sessions older than N hours. 0 = disabled. Default: 0.
tlsobjectTLS configuration for the gateway server ([gateway.tls]).
trust_forwarded_headersboolfalseTrust proxy-forwarded client IP headers (X-Forwarded-For, X-Real-IP).
web_dist_dirstring?nullPath to the web dashboard dist directory. When set, the gateway
webhook_rate_limit_per_minuteinteger60Max /webhook requests per minute per client key.

gateway.pairing_dashboard

Pairing dashboard configuration ([gateway.pairing_dashboard]).

KeyTypeDefaultDescription
code_lengthinteger8Length of pairing codes (default: 8)
code_ttl_secsinteger3600Time-to-live for pending pairing codes in seconds (default: 3600)
lockout_secsinteger300Lockout duration in seconds after max attempts (default: 300)
max_failed_attemptsinteger5Maximum failed pairing attempts before lockout (default: 5)
max_pending_codesinteger3Maximum concurrent pending pairing codes (default: 3)

gateway.tls

TLS configuration for the gateway server ([gateway.tls]).

KeyTypeDefaultDescription
cert_path*stringPath to the PEM-encoded server certificate file.
client_authobjectClient certificate authentication (mTLS) configuration ([gateway.tls.client_auth]).
enabledboolfalseEnable TLS for the gateway (default: false).
key_path*stringPath to the PEM-encoded server private key file.

gateway.tls.client_auth

Client certificate authentication (mTLS) configuration ([gateway.tls.client_auth]).

KeyTypeDefaultDescription
ca_cert_pathstring""Path to the PEM-encoded CA certificate used to verify client certs.
enabledboolfalseEnable client certificate verification (default: false).
pinned_certsstring[][]Optional SHA-256 fingerprints for certificate pinning.
require_client_certbooltrueReject connections that do not present a valid client certificate (default: true).

gemini_cli

Gemini CLI tool configuration ([gemini_cli] section).

Delegates coding tasks to the gemini -p CLI. Authentication uses the binary’s own session by default — no API key needed unless env_passthrough includes GOOGLE_API_KEY.

KeyTypeDefaultDescription
enabledboolfalseEnable the gemini_cli tool
env_passthroughstring[][]Extra env vars passed to the gemini subprocess (e.g. GOOGLE_API_KEY)
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

google_workspace

Google Workspace CLI (gws) tool configuration ([google_workspace] section).

Defaults

  • enabled: false (tool is not registered unless explicitly opted-in).
  • allowed_services: empty vector, which grants access to the full default service set: drive, sheets, gmail, calendar, docs, slides, tasks, people, chat, classroom, forms, keep, meet, events.
  • allowed_operations: empty vector, which preserves the legacy behavior of allowing any resource/method under the allowed service set.
  • credentials_path: None (uses default gws credential discovery).
  • default_account: None (uses the gws active account).
  • rate_limit_per_minute: 60.
  • timeout_secs: 30.
  • audit_log: false.

Compatibility

Configs that omit the [google_workspace] section entirely are treated as GoogleWorkspaceConfig::default() (disabled, all defaults allowed). Adding the section is purely opt-in and does not affect other config sections.

Rollback / Migration

To revert, remove the [google_workspace] section from the config file (or set enabled = false). No data migration is required; the tool simply stops being registered.

KeyTypeDefaultDescription
allowed_operationsobject[][]Restrict which resource/method combinations the agent can access.
allowed_servicesstring[][]Restrict which Google Workspace services the agent can access.
audit_logboolfalseEnable audit logging of every gws invocation (service, resource,
credentials_pathstring?nullPath to service account JSON or OAuth client credentials file.
default_accountstring?nullDefault Google account email to pass to gws --account.
enabledboolfalseEnable the google_workspace tool. Default: false.
rate_limit_per_minuteinteger60Maximum number of gws API calls allowed per minute. Default: 60.
timeout_secsinteger30Command execution timeout in seconds. Default: 30.

hardware

Wizard-driven hardware configuration for physical world interaction.

KeyTypeDefaultDescription
baud_rateinteger115200Baud rate negotiated on the serial link. 115200 matches the common Arduino / ESP32 bootloader default; bump to 230400+ when your firmware explicitly supports faster rates and you need the throughput.
enabledboolfalseOpt in to direct physical-hardware control — GPIO pins, USB-tethered microcontrollers (Arduino, ESP32, Nucleo), or SWD/JTAG debug probes. Leave off for software-only use; turning it on without the right transport configured does nothing.
probe_targetstring?nullTarget chip identifier for transport = probe (e.g. STM32F401RE, nRF52840_xxAA). Passed straight to probe-rs for flash/debug operations; must match a chip probe-rs recognizes.
serial_portstring?nullTTY path for the serial transport — e.g. /dev/ttyACM0 on Linux, /dev/tty.usbmodem1 on macOS, COM3 on Windows. Ignored for other transports.
transportNone | Native | Serial | ProbeHardware transport mode.
workspace_datasheetsboolfalseIndex PDF schematics and datasheets from the workspace into a local RAG store, so the agent can look up pin assignments and electrical specs inline when you ask hardware questions. Off by default — turn on once the workspace has relevant PDFs dropped in.

heartbeat

Heartbeat configuration for periodic health pings ([heartbeat] section).

KeyTypeDefaultDescription
adaptiveboolfalseEnable adaptive intervals that back off on failures and speed up for
agentstring""Configured agent alias the heartbeat worker runs as. Required
deadman_channelstring?nullChannel for dead-man’s switch alerts (e.g. telegram). Falls back to
deadman_timeout_minutesinteger0Dead-man’s switch timeout in minutes. If the heartbeat has not ticked
deadman_tostring?nullRecipient for dead-man’s switch alerts. Falls back to to.
enabledboolfalseEnable periodic heartbeat pings. Default: false. When enabled,
interval_minutesinteger30Interval in minutes between heartbeat pings. Minimum: 1. Default: 30.
load_session_contextboolfalseLoad the channel session history before each heartbeat task execution so
max_interval_minutesinteger120Maximum interval in minutes when adaptive mode backs off. Default: 120.
max_run_historyinteger100Maximum number of heartbeat run history records to retain. Default: 100.
messagestring?nullOptional fallback task text when HEARTBEAT.md has no task entries.
min_interval_minutesinteger5Minimum interval in minutes when adaptive mode is enabled. Default: 5.
targetstring?nullOptional delivery channel for heartbeat output (for example: telegram).
task_timeout_secsinteger600Maximum wall-clock seconds allowed for a single agent invocation
tostring?nullOptional delivery recipient/chat identifier (required when target is
two_phasebooltrueEnable two-phase heartbeat: Phase 1 asks LLM whether to run, Phase 2

hooks

KeyTypeDefaultDescription
builtinobject
enabled*boolEnable lifecycle hook execution.

hooks.builtin

KeyTypeDefaultDescription
command_logger*boolEnable the command-logger hook (logs tool calls for auditing).
webhook_auditobjectConfiguration for the webhook-audit builtin hook.

hooks.builtin.webhook_audit

Configuration for the webhook-audit builtin hook.

Sends an HTTP POST with a JSON body to an external endpoint each time a tool call matches one of the configured patterns. Useful for centralised audit logging, SIEM ingestion, or compliance pipelines.

KeyTypeDefaultDescription
enabledboolfalseEnable the webhook-audit hook. Default: false.
include_argsboolfalseInclude tool call arguments in the audit payload. Default: false.
max_args_bytesinteger4096Maximum size (in bytes) of serialised arguments included in a single
tool_patternsstring[][]Glob patterns for tool names to audit (e.g. ["Bash", "Write"]).
urlstring""Target URL that will receive the audit POST requests.

http_request

HTTP request tool configuration ([http_request] section).

Domain filtering: allowed_domains controls which hosts are reachable (use ["*"] for all public hosts, which is the default). If allowed_domains is empty, all requests are rejected.

KeyTypeDefaultDescription
allow_private_hostsboolfalseAllow requests to private/LAN hosts (RFC 1918, loopback, link-local, .local).
allowed_domainsstring[][]Allowed domains for HTTP requests (exact or subdomain match)
allowed_private_hostsstring[][]Private/internal hosts explicitly allowed to bypass SSRF protection.
enabledboolfalseEnable http_request tool for API interactions
max_response_sizeinteger1000000Maximum response size in bytes (default: 1MB, 0 = unlimited)
secrets 🔑map{}Named authorization secrets for auth_secret requests.
timeout_secsinteger30Request timeout in seconds (default: 30)

image_gen

Standalone image generation tool configuration ([image_gen]).

When enabled, registers an image_gen tool that generates images via fal.ai’s synchronous API (Flux / Nano Banana models) and saves them to the workspace images/ directory.

KeyTypeDefaultDescription
api_key_envstring"FAL_API_KEY"Environment variable name holding the fal.ai API key.
default_modelstring"fal-ai/flux/schnell"Default fal.ai model identifier.
enabledboolfalseEnable the standalone image generation tool. Default: false.

jira

Jira integration configuration ([jira]).

When enabled = true, registers the jira tool which can get tickets, search with JQL, and add comments. Requires base_url and api_token (or the JIRA_API_TOKEN env var).

Defaults

  • enabled: false
  • allowed_actions: ["get_ticket"] — read-only by default. Add "search_tickets" or "comment_ticket" to unlock them.
  • timeout_secs: 30

Auth

Jira Cloud uses HTTP Basic auth: email + api_token. Jira Server/Data Center uses Bearer token auth: omit email and set api_token to a personal access token. api_token is stored encrypted at rest; set it here or via JIRA_API_TOKEN.

KeyTypeDefaultDescription
allowed_actionsstring[]["get_ticket"]Actions the agent is permitted to call.
api_token 🔑string""Jira API token. Encrypted at rest. Falls back to JIRA_API_TOKEN env var.
base_urlstring""Atlassian instance base URL, e.g. https://yourco.atlassian.net.
emailstring?Jira account email used for Basic auth (Cloud).
enabledboolfalseEnable the jira tool. Default: false.
timeout_secsinteger30Request timeout in seconds. Default: 30.

knowledge

Knowledge graph configuration for capturing and reusing expertise.

KeyTypeDefaultDescription
auto_captureboolfalseAutomatically capture knowledge from conversations. Default: false.
db_pathstring"/home/runner/.zeroclaw/knowledge.db"Path to the knowledge graph SQLite database.
enabledboolfalseEnable the knowledge graph tool. Default: false.
max_nodesinteger100000Maximum number of knowledge nodes. Default: 100000.
suggest_on_querybooltrueProactively suggest relevant knowledge on queries. Default: true.

knowledge_bundles

Named knowledge bundles ([knowledge_bundles.<alias>]).

Automatic link understanding for inbound channel messages ([link_enricher]).

When enabled, URLs in incoming messages are automatically fetched and summarised. The summary is prepended to the message before the agent processes it, giving the LLM context about linked pages without an explicit tool call.

KeyTypeDefaultDescription
enabledboolfalseEnable the link enricher pipeline stage (default: false)
max_linksinteger3Maximum number of links to fetch per message (default: 3)
timeout_secsinteger10Per-link fetch timeout in seconds (default: 10)

linkedin

LinkedIn integration configuration ([linkedin] section).

When enabled, the linkedin tool is registered in the agent tool surface. Requires LINKEDIN_* credentials in the workspace .env file.

KeyTypeDefaultDescription
api_versionstring"202602"LinkedIn REST API version header (YYYYMM format).
contentobjectContent strategy configuration for LinkedIn auto-posting ([linkedin.content]).
enabledboolfalseEnable the LinkedIn tool.
imageobjectImage generation configuration for LinkedIn posts ([linkedin.image]).

linkedin.content

Content strategy configuration for LinkedIn auto-posting ([linkedin.content]).

The agent reads this via the linkedin get_content_strategy action to know what feeds to check, which repos to highlight, and how to write posts.

KeyTypeDefaultDescription
github_reposstring[][]GitHub repositories to highlight (format: owner/repo).
github_usersstring[][]GitHub usernames whose public activity to reference.
instructionsstring""Freeform posting instructions for the AI agent.
personastring""Professional persona description (name, role, expertise).
rss_feedsstring[][]RSS feed URLs to monitor for topic inspiration (titles only).
topicsstring[][]Topics of expertise and interest for post themes.

linkedin.image

Image generation configuration for LinkedIn posts ([linkedin.image]).

KeyTypeDefaultDescription
card_accent_colorstring"#0A66C2"Accent color for the fallback card (CSS hex).
dalleobjectOpenAI DALL-E settings ([linkedin.image.dalle]).
enabledboolfalseEnable image generation for posts.
fallback_cardbooltrueGenerate a branded SVG text card when all AI model_providers fail.
fluxobjectFlux (fal.ai) image generation settings ([linkedin.image.flux]).
imagenobjectGoogle Imagen (Vertex AI) settings ([linkedin.image.imagen]).
providersstring[]["stability","imagen","dalle","flux"]ModelProvider priority order. Tried in sequence; first success wins.
stabilityobjectStability AI image generation settings ([linkedin.image.stability]).
temp_dirstring"linkedin/images"Temp directory for generated images, relative to workspace.

linkedin.image.dalle

OpenAI DALL-E settings ([linkedin.image.dalle]).

KeyTypeDefaultDescription
api_key_envstring"OPENAI_API_KEY"Environment variable name holding the OpenAI API key.
modelstring"dall-e-3"DALL-E model identifier.
sizestring"1024x1024"Image dimensions.

linkedin.image.flux

Flux (fal.ai) image generation settings ([linkedin.image.flux]).

KeyTypeDefaultDescription
api_key_envstring"FAL_API_KEY"Environment variable name holding the fal.ai API key.
modelstring"fal-ai/flux/schnell"Flux model identifier.

linkedin.image.imagen

Google Imagen (Vertex AI) settings ([linkedin.image.imagen]).

KeyTypeDefaultDescription
api_key_envstring"GOOGLE_VERTEX_API_KEY"Environment variable name holding the API key.
project_id_envstring"GOOGLE_CLOUD_PROJECT"Environment variable for the Google Cloud project ID.
regionstring"us-central1"Vertex AI region.

linkedin.image.stability

Stability AI image generation settings ([linkedin.image.stability]).

KeyTypeDefaultDescription
api_key_envstring"STABILITY_API_KEY"Environment variable name holding the API key.
modelstring"stable-diffusion-xl-1024-v1-0"Stability model identifier.

locale

Locale for tool descriptions (e.g. "en", "zh-CN").

When set, tool descriptions shown in system prompts are loaded from Fluent .ftl locale files. Falls back to embedded English, then to hardcoded descriptions.

If omitted or empty, the locale is auto-detected from ZEROCLAW_LOCALE, LANG, or LC_ALL environment variables (defaulting to "en").

mcp

External MCP client configuration ([mcp] section).

KeyTypeDefaultDescription
deferred_loadingbooltrueLoad MCP tool schemas on-demand via tool_search instead of eagerly
enabledboolfalseEnable MCP tool loading.
serversobject[][]Configured MCP servers. The #[nested] annotation makes the macro

mcp_bundles

Named MCP server bundles ([mcp_bundles.<alias>]).

media_pipeline

Automatic media understanding pipeline configuration ([media_pipeline]).

When enabled, inbound channel messages with media attachments are pre-processed before reaching the agent: audio is transcribed, images are annotated, and videos are summarised.

KeyTypeDefaultDescription
describe_imagesbooltrueAdd image descriptions when a vision-capable model is active.
enabledboolfalseMaster toggle for the media pipeline (default: false).
summarize_videobooltrueSummarize video attachments (placeholder — requires external API).
transcribe_audiobooltrueTranscribe audio attachments using the configured transcription model_provider.

memory

Memory backend configuration ([memory] section).

Controls conversation memory storage, embeddings, hybrid search, response caching, and memory snapshot/hydration. Backend-specific connection settings live under [storage.<backend>.<alias>]; this section selects which storage instance to use via the backend dotted reference.

KeyTypeDefaultDescription
archive_after_daysinteger7Move daily/session files to the archive directory after this many days. Keeps the hot working set small without deleting history.
audit_enabledboolfalseEnable audit logging of memory operations.
audit_retention_daysinteger30Retention period for audit entries in days (default: 30).
auto_hydratebooltrueAuto-hydrate from MEMORY_SNAPSHOT.md when brain.db is missing
auto_savebooltrueAuto-save what you tell ZeroClaw into memory as conversation history — the agent’s own replies are not saved. Turn off if you want memory to only hold things you explicitly record via the memory tool.
backend*stringDotted reference to the active storage instance: <backend>.<alias>
chunk_max_tokensinteger512Max tokens per chunk for document splitting
conflict_thresholdnumber0.85Cosine similarity threshold for conflict detection (0.0–1.0).
conversation_retention_daysinteger30For the sqlite backend only — drop conversation rows older than this many days to keep the DB lean. Doesn’t touch core memories or notes.
default_namespacestring"default"Default namespace for memory entries.
embedding_cache_sizeinteger10000Max embedding cache entries before LRU eviction
embedding_dimensionsinteger1536Vector width produced by the embedding model — must match the model’s native dimension or vectors won’t store correctly. Look up the number on the model_provider’s model page.
embedding_modelstring"text-embedding-3-small"Embedding model identifier — must match a model your chosen embedding model_provider serves (e.g. text-embedding-3-small for OpenAI). Changing this invalidates existing embeddings; you’ll need to re-index.
embedding_providerstring"none"Source of embedding vectors for semantic search. none = keyword-only retrieval (no API calls, no vector cost); openai = OpenAI’s embedding API; custom:URL = any OpenAI-compatible embedding endpoint (LiteLLM, local gateway, etc.).
fts_early_return_scorenumber0.85FTS score above which to early-return without vector search (0.0–1.0).
hygiene_enabledbooltrueRun the periodic hygiene pass that archives stale daily/session files and enforces retention windows. Leave on unless you want to manage cleanup yourself.
keyword_weightnumber0.3How heavily BM25 (keyword) overlap counts when search_mode = hybrid. Raise toward 1.0 for exact-term matching; lower it when paraphrases should still score well.
min_relevance_scorenumber0.4Minimum hybrid score (0.0–1.0) for a memory to be included in context.
policyobjectMemory policy configuration ([memory.policy] section).
purge_after_daysinteger30Delete archived files permanently after this many days. Set high if you need long-term history; set low for privacy / disk-space reasons.
rerank_enabledboolfalseEnable LLM reranking when candidate count exceeds threshold.
rerank_thresholdinteger5Minimum candidate count to trigger reranking.
response_cache_enabledboolfalseEnable LLM response caching to avoid paying for duplicate prompts
response_cache_hot_entriesinteger256Max in-memory hot cache entries for the two-tier response cache (default: 256)
response_cache_max_entriesinteger5000Max number of cached responses before LRU eviction (default: 5000)
response_cache_ttl_minutesinteger60TTL in minutes for cached responses (default: 60)
retrieval_stagesstring[]["cache","fts","vector"]Retrieval stages to execute in order. Valid: “cache”, “fts”, “vector”.
search_modetableSearch strategy for memory recall.
snapshot_enabledboolfalseEnable periodic export of core memories to MEMORY_SNAPSHOT.md
snapshot_on_hygieneboolfalseRun snapshot during hygiene passes (heartbeat-driven)
vector_weightnumber0.7How heavily vector (semantic) similarity counts when search_mode = hybrid. Raise toward 1.0 to favor meaning-based matches; lower it to lean on keyword overlap instead.

memory.policy

Memory policy configuration ([memory.policy] section).

KeyTypeDefaultDescription
max_entries_per_categoryinteger0Maximum entries per category (0 = unlimited).
max_entries_per_namespaceinteger0Maximum entries per namespace (0 = unlimited).
read_only_namespacesstring[][]Namespaces that are read-only (writes are rejected).
retention_days_by_categorymap{}Retention days by category (overrides global). Keys: “core”, “daily”, “conversation”.

microsoft365

Microsoft 365 integration via Microsoft Graph API ([microsoft365] section).

Provides access to Outlook mail, Teams messages, Calendar events, OneDrive files, and SharePoint search.

KeyTypeDefaultDescription
auth_flowstring"client_credentials"Authentication flow: “client_credentials” or “device_code”
client_idstring?nullAzure AD application (client) ID
client_secret 🔑string?nullAzure AD client secret (stored encrypted when secrets.encrypt = true)
enabledboolfalseEnable Microsoft 365 integration
scopesstring[]["https://graph.microsoft.com/.default"]OAuth scopes to request
tenant_idstring?nullAzure AD tenant ID
token_cache_encryptedbooltrueEncrypt the token cache file on disk
user_idstring?nullUser principal name or “me” (for delegated flows)

model_routes

Model-routing rules — route hint:<name> to specific model_provider + model combos.

multimodal

Multimodal (image) handling configuration ([multimodal] section).

Privacy and cost note

Tool results that print real local image paths (e.g. shell tools doing ls /pictures or find . -name '*.png') are canonicalized into [IMAGE:...] markers and base64-inlined into the next provider request. This means image bytes that previously stayed local will be uploaded to the configured provider when surfaced by a tool.

max_images (and the trim_old_images LRU policy) bounds the per-request image budget, but operators running shell-style tools over directories of personal or sensitive images should be aware of the upload semantics. See docs/book/src/contributing/privacy.md for the project’s privacy stance.

KeyTypeDefaultDescription
allow_remote_fetchboolfalseAllow fetching remote image URLs (http/https). Disabled by default.
max_image_size_mbinteger5Maximum image payload size in MiB before base64 encoding.
max_image_turnsinteger0Maximum age of images in conversation turns.
max_imagesinteger4Maximum number of image attachments accepted per request.
vision_modelstring?nullModel to use when routing to the vision model_provider (e.g. "llava:7b").
vision_model_providerstring?nullModelProvider name to use for vision/image messages (e.g. "ollama").

node_transport

Secure transport configuration for inter-node communication ([node_transport]).

KeyTypeDefaultDescription
allowed_peersstring[][]Allow specific node IPs/CIDRs.
connection_pool_sizeinteger4Maximum number of connections per peer.
enabledbooltrueEnable the secure transport layer.
max_request_age_secsinteger300Maximum age of signed requests in seconds (replay protection).
mutual_tlsboolfalseRequire client certificates (mutual TLS).
require_httpsbooltrueRequire HTTPS for all node communication.
shared_secret 🔑string""Shared secret for HMAC authentication between nodes.
tls_cert_pathstring?nullPath to TLS certificate file.
tls_key_pathstring?nullPath to TLS private key file.

nodes

Configuration for the dynamic node discovery system ([nodes]).

When enabled, external processes/devices can connect via WebSocket at /ws/nodes and advertise their capabilities at runtime.

KeyTypeDefaultDescription
auth_token 🔑string?nullOptional bearer token for node authentication.
enabledboolfalseEnable dynamic node discovery endpoint.
max_nodesinteger16Maximum number of concurrent node connections.

notion

Notion integration configuration ([notion]).

When enabled = true, the agent polls a Notion database for pending tasks and exposes a notion tool for querying, reading, creating, and updating pages. Requires api_key (or the NOTION_API_KEY env var) and database_id.

KeyTypeDefaultDescription
api_key 🔑string""
database_idstring""
enabledboolfalse
input_propertystring"Input"
max_concurrentinteger4
poll_interval_secsinteger5
recover_stalebooltrue
result_propertystring"Result"
status_propertystring"Status"

observability

Observability backend configuration ([observability] section).

KeyTypeDefaultDescription
backend*string“none” | “log” | “verbose” | “prometheus” | “otel”
log_persistencestring"rolling"Log persistence mode: “none” | “rolling” | “full”.
log_persistence_max_entriesinteger200Maximum entries retained when log_persistence = "rolling".
log_persistence_pathstring"state/runtime-trace.jsonl"Log persistence file path. Relative paths resolve under workspace_dir.
log_tool_iostring"redacted"Tool I/O capture policy: “off” | “redacted” | “full”.
log_tool_io_denyliststring[][]Tool names whose I/O is never logged beyond name + outcome + duration
log_tool_io_truncate_bytesinteger40960Truncate the captured tool input and output at this many bytes when
otel_endpointstring?nullOTLP endpoint (e.g. "http://localhost:4318"). Only used when backend = "otel".
otel_headers 🔑map?nullOptional HTTP headers sent with every OTLP export request (e.g. authorization).
otel_service_namestring?nullService name reported to the OTel collector. Defaults to “zeroclaw”.

onboard_state

Multi-client workspace isolation configuration.

When enabled, each client engagement gets an isolated workspace with separate memory, audit, secrets, and tool restrictions. Opaque state the Quickstart flow writes so it can tell, on a re-run, which sections the user has already walked through at least once — which lets it offer “Reconfigure? [y/N]” skip gates instead of forcing users through every field again.

This is meta-state about the Quickstart flow, not user-facing config.

KeyTypeDefaultDescription
completed_sectionsstring[][]Section keys the user has completed at least once.
quickstart_completedboolfalsetrue once the Quickstart has applied a BuilderSubmission

opencode_cli

OpenCode CLI tool configuration ([opencode_cli] section).

Delegates coding tasks to the opencode run CLI. Authentication uses the binary’s own session by default — no API key needed unless env_passthrough includes provider-specific keys.

KeyTypeDefaultDescription
enabledboolfalseEnable the opencode_cli tool
env_passthroughstring[][]Extra env vars passed to the opencode subprocess
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

pacing

Pacing controls for slow/local LLM workloads ([pacing] section).

All fields are optional and default to values that preserve existing behavior. When set, they extend — not replace — the existing timeout and loop-detection subsystems.

KeyTypeDefaultDescription
loop_detection_enabledbooltrueEnable pattern-based loop detection (exact repeat, ping-pong,
loop_detection_max_repeatsinteger3Number of consecutive identical tool+args calls before the first
loop_detection_min_elapsed_secsinteger?nullMinimum elapsed seconds before loop detection activates.
loop_detection_window_sizeinteger20Sliding window size for the pattern-based loop detector.
loop_ignore_toolsstring[][]Tool names excluded from identical-output / alternating-pattern loop
message_timeout_scale_maxinteger?nullOverride for the hardcoded timeout scaling cap (default: 4).
step_timeout_secsinteger?nullPer-step timeout in seconds: the maximum time allowed for a single

peer_groups

Named peer groups ([peer_groups.<name>]). Each entry binds a channel, a list of member agents, and optional non-agent (external) members and a per-group blocklist. Mutual opt-in: two agents become peers only when both appear in the same group’s agents. Empty by default for single-agent installs. See crate::multi_agent::PeerGroupConfig.

peripherals

Peripheral board integration configuration ([peripherals] section).

Boards become agent tools when enabled.

KeyTypeDefaultDescription
boardsobject[][]Board configurations (nucleo-f401re, rpi-gpio, etc.)
datasheet_dirstring?nullPath to datasheet docs (relative to workspace) for RAG retrieval.
enabledboolfalseEnable peripheral support (boards become agent tools)

pipeline

Pipeline tool configuration ([pipeline] section).

KeyTypeDefaultDescription
allowed_toolsstring[][]Tools allowed in pipeline steps. Steps referencing tools not on this
enabledboolfalseEnable the execute_pipeline meta-tool.
max_stepsinteger20Maximum number of steps allowed in a single pipeline invocation.

plugins

Plugin system configuration.

KeyTypeDefaultDescription
auto_discoverboolfalseAuto-discover and load plugins on startup
enabledboolfalseEnable the plugin system (default: false)
max_pluginsinteger50Maximum number of plugins that can be loaded
plugins_dirstring"/home/runner/.zeroclaw/plugins"Directory where plugins are stored
securityobjectPlugin signature verification configuration ([plugins.security]).

plugins.security

Plugin signature verification configuration ([plugins.security]).

Controls Ed25519 signature verification for plugin manifests. In strict mode, only plugins signed by a trusted publisher key are loaded. In permissive mode, unsigned or untrusted plugins produce warnings but are still loaded. In disabled mode (the default), no signature checking occurs.

KeyTypeDefaultDescription
signature_modestring"disabled"Signature enforcement mode: “disabled”, “permissive”, or “strict”.
trusted_publisher_keysstring[][]Hex-encoded Ed25519 public keys of trusted plugin publishers.

project_intel

Project delivery intelligence configuration ([project_intel] section).

KeyTypeDefaultDescription
default_languagestring"en"Default report language (en, de, fr, it). Default: “en”.
enabledboolfalseEnable the project_intel tool. Default: false.
include_git_databooltrueInclude git log data in reports. Default: true.
include_jira_databoolfalseInclude Jira data in reports. Default: false.
jira_base_urlstring?nullJira instance base URL (required if include_jira_data is true).
report_output_dirstring"/home/runner/.zeroclaw/project-reports"Output directory for generated reports.
risk_sensitivitystring"medium"Risk detection sensitivity: low, medium, high. Default: “medium”.
templates_dirstring?nullOptional custom templates directory.

providers

Top-level wrapper for every provider category. TOML root sees a single [providers] table with one sub-key per category:

[providers.models.anthropic.default]
api_key = "..."

[providers.tts.openai.default]
api_key = "..."

[providers.transcription.groq.default]
api_key = "..."

Each category keeps its own typed-slot internals (so per-family endpoints and extras stay validated at the type level); this wrapper just gives them a shared top-level home.

KeyTypeDefaultDescription
modelsobjectTyped model provider container — one slot per canonical model_provider type.
transcriptionobjectTyped transcription-provider container — one slot per STT family.
ttsobjectTyped TTS-provider container — one slot per TTS family. Mirrors

providers.models

Typed model provider container — one slot per canonical model_provider type.

Replaces the HashMap<String, HashMap<String, ModelProviderConfig>> with a typed struct so each family’s per-alias map carries its own typed config (with the family’s *Endpoint enum and family-specific extras visible at the type level).

TOML shape is preserved byte-identical: each named field deserializes from the same [model_providers.<type>.<alias>] block as before.

Adding a new model_provider family means: define the typed config in schema.rs, then add one row to for_each_model_provider_slot!, and every helper picks up the new slot automatically.

One slot per family (ai21, aihubmix, anthropic, anyscale, arcee, astrai, atomic_chat, avian, azure, baichuan, baseten, bedrock, cerebras, cloudflare, cohere, copilot, custom, deepinfra, deepmyst, deepseek, doubao, featherless, fireworks, friendli, gemini, gemini_cli, github_models, glm, groq, huggingface, hunyuan, hyperbolic, inception, kilo, kilocli, lambda_ai, lepton, litellm, llamacpp, lmstudio, minimax, mistral, moonshot, morph, nebius, novita, nscale, nvidia, ollama, openai, opencode, openrouter, osaurus, ovh, perplexity, qianfan, qwen, reka, sambanova, sglang, siliconflow, stepfun, synthetic, telnyx, together, upstage, venice, vercel, vllm, xai, yi, zai). Each slot is a [providers.models.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

providers.transcription

Typed transcription-provider container — one slot per STT family. Mirrors ModelProviders / TtsProviders. Closed set of 6 families: groq, openai, deepgram, assemblyai, google, local_whisper.

One slot per family (assemblyai, deepgram, google, groq, local_whisper, openai). Each slot is a [providers.transcription.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

providers.tts

Typed TTS-provider container — one slot per TTS family. Mirrors ModelProviders but smaller (TTS has a closed set of 5 families: openai, elevenlabs, google, edge, piper). No catch-all needed.

One slot per family (edge, elevenlabs, google, openai, piper). Each slot is a [providers.tts.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

proxy

Proxy configuration for outbound HTTP/HTTPS/SOCKS5 traffic ([proxy] section).

KeyTypeDefaultDescription
all_proxystring?nullFallback proxy URL for all schemes.
enabledboolfalseEnable proxy support for selected scope.
http_proxystring?nullProxy URL for HTTP requests (supports http, https, socks5, socks5h).
https_proxystring?nullProxy URL for HTTPS requests (supports http, https, socks5, socks5h).
no_proxystring[][]No-proxy bypass list. Same format as NO_PROXY.
scopetableProxy application scope — determines which outbound traffic uses the proxy.
servicesstring[][]Service selectors used when scope = “services”.

query_classification

Automatic query classification — classifies user messages by keyword/pattern and routes to the appropriate model hint. Disabled by default.

KeyTypeDefaultDescription
enabledboolfalseEnable automatic query classification. Default: false.
rulesobject[][]Classification rules evaluated in priority order.

reliability

Reliability and supervision configuration ([reliability] section).

Controls model_provider retries, API key rotation, and channel restart backoff.

KeyTypeDefaultDescription
api_keys 🔑string[][]Additional API keys for round-robin rotation on rate-limit (429) errors.
channel_initial_backoff_secsinteger2Initial backoff for channel/daemon restarts.
channel_max_backoff_secsinteger60Max backoff for channel/daemon restarts.
provider_backoff_msinteger500Base backoff (ms) for model_provider retry delay.
provider_retriesinteger2Retries per model_provider before bailing.
scheduler_poll_secsinteger15Scheduler polling cadence in seconds.
scheduler_retriesinteger2Max retries for cron job execution attempts.

risk_profiles

Named risk/autonomy profiles ([risk_profiles.<alias>]).

runtime

Runtime adapter configuration ([runtime] section).

KeyTypeDefaultDescription
dockerobjectDocker runtime configuration ([runtime.docker] section).
kindstring"native"Runtime kind (native | docker).
reasoning_effortstring?nullOptional reasoning effort for model_providers that expose a level control.
reasoning_enabledbool?nullGlobal reasoning override for model_providers that expose explicit controls.

runtime.docker

Docker runtime configuration ([runtime.docker] section).

KeyTypeDefaultDescription
allowed_workspace_rootsstring[][]Optional workspace root allowlist for Docker mount validation.
cpu_limitnumber?1.0Optional CPU limit (None = no explicit limit).
imagestring"alpine:3.20"Runtime image used to execute shell commands.
memory_limit_mbinteger?512Optional memory limit in MB (None = no explicit limit).
mount_workspacebooltrueMount configured workspace into /workspace.
networkstring"none"Docker network mode (none, bridge, etc.).
read_only_rootfsbooltrueMount root filesystem as read-only.

runtime_profiles

Named runtime/LLM execution profiles ([runtime_profiles.<alias>]).

scheduler

Scheduler configuration for periodic task execution ([scheduler] section).

Owns the cron-runtime knobs: per-job declarations live on Config.cron: HashMap<String, CronJobDecl> (alias-keyed), while the scheduler loop’s runtime behavior (enabled, polling cap, catch-up) lives here.

KeyTypeDefaultDescription
catch_up_on_startupbooltrueRun all overdue jobs at scheduler startup. Default: true.
enabledbooltrueEnable the built-in scheduler loop. When false, no cron jobs run.
max_concurrentinteger4Maximum tasks executed in parallel within a single polling cycle.
max_run_historyinteger50Maximum number of historical cron run records to retain. Default: 50.
max_tasksinteger64Maximum number of persisted scheduled tasks per polling cycle.

schema_version

Config file schema version.

secrets

Secrets encryption configuration ([secrets] section).

KeyTypeDefaultDescription
encryptbooltrueEnable encryption for API keys and tokens at rest

security

Security configuration for audit logging, OTP, e-stop, IAM/SSO, and WebAuthn.

Sandbox backend and resource limits live on per-agent risk profiles (see RiskProfileConfig::sandbox_* and RiskProfileConfig::max_*); the runtime resolves them via Config::active_risk_profile(agent_alias).

KeyTypeDefaultDescription
auditobjectAudit logging configuration
estopmapEmergency stop configuration.
nevismapNevis IAM integration configuration.
otpmapSecurity OTP configuration.
webauthnobjectWebAuthn / FIDO2 hardware key authentication configuration ([security.webauthn]).

security.audit

Audit logging configuration

KeyTypeDefaultDescription
enabledbooltrueEnable audit logging
log_pathstring"audit.log"Path to audit log file (relative to zeroclaw dir)
max_size_mbinteger100Maximum log size in MB before rotation
sign_eventsboolfalseSign events with HMAC for tamper evidence

security.estop

Emergency stop configuration.

KeyTypeDefaultDescription
enabledboolfalseEnable emergency stop controls.
require_otp_to_resumebooltrueRequire a valid OTP before resume operations.
state_filestring"/home/runner/.zeroclaw/estop-state.json"File path used to persist estop state.

security.nevis

Nevis IAM integration configuration.

When enabled is true, ZeroClaw validates incoming requests against a Nevis Security Suite instance and maps Nevis roles to tool/workspace permissions.

KeyTypeDefaultDescription
client_idstring""OAuth2 client ID registered in Nevis.
client_secret 🔑string?nullOAuth2 client secret. Encrypted via SecretStore when stored on disk.
enabledboolfalseEnable Nevis IAM integration. Defaults to false for backward compatibility.
instance_urlstring""Base URL of the Nevis instance (e.g. https://nevis.example.com).
jwks_urlstring?nullJWKS endpoint URL for local token validation.
realmstring"master"Nevis realm to authenticate against.
require_mfaboolfalseRequire MFA verification for all Nevis-authenticated requests.
role_mappingmap[][]Nevis role to ZeroClaw permission mappings.
session_timeout_secsinteger3600Session timeout in seconds.
token_validationstring"local"Token validation strategy: "local" (JWKS) or "remote" (introspection).

security.otp

Security OTP configuration.

KeyTypeDefaultDescription
cache_valid_secsinteger300Reuse window for recently validated OTP codes.
challenge_max_attemptsinteger3Maximum number of OTP challenge attempts before lockout.
enabledboolfalseEnable OTP gating. Defaults to disabled for backward compatibility.
gated_actionsstring[]["shell","file_write","browser_open","browser","memory_forget"]Tool/action names gated by OTP. Empty or malformed entries are rejected
gated_domain_categoriesstring[][]Domain-category presets expanded into gated_domains.
gated_domainsstring[][]Explicit domain patterns gated by OTP.
methodtableOTP validation strategy.
token_ttl_secsinteger30TOTP time-step in seconds.

security.webauthn

WebAuthn / FIDO2 hardware key authentication configuration ([security.webauthn]).

Enables registration and authentication via hardware security keys (YubiKey, SoloKey, etc.) and platform authenticators (Touch ID, Windows Hello).

KeyTypeDefaultDescription
enabledboolfalseEnable WebAuthn authentication. Default: false.
rp_idstring"localhost"Relying Party ID (domain name, e.g. “example.com”). Default: “localhost”.
rp_namestring"ZeroClaw"Relying Party display name. Default: “ZeroClaw”.
rp_originstring"http://localhost:42617"Relying Party origin URL (e.g. "https://example.com"). Default: "http://localhost:42617".

security_ops

Managed Cybersecurity Service (MCSS) dashboard agent configuration ([security_ops]).

KeyTypeDefaultDescription
auto_triageboolfalseAutomatically triage incoming alerts without user prompt.
enabledboolfalseEnable security operations tools.
max_auto_severitystring"low"Maximum severity level that can be auto-remediated without approval.
playbooks_dirstring"/home/runner/.zeroclaw/playbooks"Directory containing incident response playbook definitions (JSON).
report_output_dirstring"/home/runner/.zeroclaw/security-reports"Directory for generated security reports.
require_approval_for_actionsbooltrueRequire human approval before executing playbook actions.
siem_integrationstring?nullOptional SIEM webhook URL for alert ingestion.

shell_tool

Shell tool configuration ([shell_tool] section).

Controls the behaviour of the shell execution tool. The main tunable is timeout_secs — the maximum wall-clock time a single shell command may run before it is killed.

KeyTypeDefaultDescription
timeout_secsinteger60Maximum shell command execution time in seconds (default: 60).

skill_bundles

Named skill bundles ([skill_bundles.<alias>]).

skills

Skills loading configuration ([skills] section).

KeyTypeDefaultDescription
allow_scriptsboolfalseAllow script-like files in skills (.sh, .bash, .ps1, shebang shell files).
install_suggestionsobjectPrompt-triggered skill install suggestions ([skills.install_suggestions] section).
open_skills_dirstring?nullOptional path to a local open-skills repository.
open_skills_enabledboolfalseEnable loading and syncing the community open-skills repository.
prompt_injection_modetableSkills loading configuration ([skills] section).
registry_urlstring?nullURL of the skills registry repository for bare-name installs.
skill_creationobjectAutonomous skill creation configuration ([skills.skill_creation] section).
skill_improvementobjectSkill self-improvement configuration ([skills.auto_improve] section).

skills.install_suggestions

Prompt-triggered skill install suggestions ([skills.install_suggestions] section).

KeyTypeDefaultDescription
enabledboolfalseEnable suggestions for installable skills before normal agent turns.

skills.skill_creation

Autonomous skill creation configuration ([skills.skill_creation] section).

KeyTypeDefaultDescription
enabledboolfalseEnable automatic skill creation after successful multi-step tasks.
max_skillsinteger500Maximum number of auto-generated skills to keep.
similarity_thresholdnumber0.85Embedding similarity threshold for deduplication.

skills.skill_improvement

Skill self-improvement configuration ([skills.auto_improve] section).

KeyTypeDefaultDescription
cooldown_secsinteger3600Minimum interval (in seconds) between improvements for the same skill.
enabledbooltrueEnable automatic skill improvement after successful skill usage.

sop

Standard Operating Procedures engine configuration ([sop]).

The default_execution_mode field uses the SopExecutionMode type from sop::types (re-exported via sop::SopExecutionMode). To avoid circular module references, config stores it using the same enum definition.

KeyTypeDefaultDescription
approval_timeout_secsinteger300Approval timeout in seconds. When a run waits for approval longer than
default_execution_modestring"supervised"Default execution mode for SOPs that omit execution_mode.
max_concurrent_totalinteger4Maximum total concurrent SOP runs across all SOPs.
max_finished_runsinteger100Maximum number of finished runs kept in memory for status queries.
sops_dirstring?nullDirectory containing SOP definitions (subdirs with SOP.toml + SOP.md).

storage

Persistent storage configuration ([storage] section).

Storage is a two-tier alias-keyed map: [storage.<backend>.<alias>], parallel to [model_providers.<type>.<alias>]. Each backend has its own typed config struct. MemoryConfig.backend carries a dotted reference ("sqlite.default", "postgres.work") that resolves to one of these entries via [Config::resolve_active_storage].

One slot per family (lucid, markdown, postgres, qdrant, sqlite). Each slot is a [storage.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

text_browser

Text browser tool configuration ([text_browser] section).

Uses text-based browsers (lynx, links, w3m) to render web pages as plain text. Designed for headless/SSH environments without graphical browsers.

KeyTypeDefaultDescription
enabledboolfalseEnable text_browser tool
preferred_browserstring?nullPreferred text browser (“lynx”, “links”, or “w3m”). If unset, auto-detects.
timeout_secsinteger30Request timeout in seconds (default: 30)

transcription

Voice transcription configuration with multi-provider support.

The top-level api_url, model, and api_key fields remain for backward compatibility with existing Groq-based configurations.

KeyTypeDefaultDescription
api_key 🔑string?nullAPI key used for transcription requests (Groq transcription provider).
api_urlstring"https://api.groq.com/openai/v1/audio/transcriptions"Whisper API endpoint URL (Groq transcription provider).
assemblyaiobjectAssemblyAI STT model_provider configuration ([transcription.assemblyai]).
deepgramobjectDeepgram STT model_provider configuration ([transcription.deepgram]).
enabledboolfalseEnable voice transcription for channels that support it.
googleobjectGoogle Cloud Speech-to-Text model_provider configuration ([transcription.google]).
initial_promptstring?nullOptional initial prompt to bias transcription toward expected vocabulary
languagestring?nullOptional language hint (ISO-639-1, e.g. “en”, “ru”) for Groq transcription provider.
local_whisperobjectLocal/self-hosted Whisper-compatible STT endpoint ([transcription.local_whisper]).
max_audio_bytesinteger?nullOptional global audio size upper bound in bytes, enforced before
max_duration_secsinteger120Maximum voice duration in seconds (messages longer than this are skipped).
modelstring"whisper-large-v3-turbo"Whisper model name (Groq transcription provider).
openaiobjectOpenAI Whisper STT model_provider configuration ([transcription.openai]).
transcribe_non_ptt_audioboolfalseAlso transcribe non-PTT (forwarded/regular) audio messages on WhatsApp,

transcription.assemblyai

AssemblyAI STT model_provider configuration ([transcription.assemblyai]).

KeyTypeDefaultDescription
api_key 🔑string?nullAssemblyAI API key.

transcription.deepgram

Deepgram STT model_provider configuration ([transcription.deepgram]).

KeyTypeDefaultDescription
api_key 🔑string?nullDeepgram API key.
modelstring"nova-2"Deepgram model name (default: “nova-2”).

transcription.google

Google Cloud Speech-to-Text model_provider configuration ([transcription.google]).

KeyTypeDefaultDescription
api_key 🔑string?nullGoogle Cloud API key.
language_codestring"en-US"BCP-47 language code (default: “en-US”).

transcription.local_whisper

Local/self-hosted Whisper-compatible STT endpoint ([transcription.local_whisper]).

Configures a self-hosted STT endpoint. Can be on localhost, a private network host, or any reachable URL.

KeyTypeDefaultDescription
bearer_token 🔑string?nullBearer token for endpoint authentication.
max_audio_bytesinteger26214400Maximum audio file size in bytes accepted by this endpoint.
timeout_secsinteger300Request timeout in seconds. Defaults to 300 (large files on local GPU).
url*stringHTTP or HTTPS endpoint URL, e.g. "http://10.10.0.1:8001/v1/transcribe".

transcription.openai

OpenAI Whisper STT model_provider configuration ([transcription.openai]).

KeyTypeDefaultDescription
api_key 🔑string?nullOpenAI API key for Whisper transcription.
modelstring"whisper-1"Whisper model name (default: “whisper-1”).

trust

KeyTypeDefaultDescription
correction_penaltynumber0.05
decay_half_life_daysnumber30.0
initial_scorenumber0.8
regression_thresholdnumber0.5
success_boostnumber0.01

tts

Text-to-Speech subsystem configuration ([tts]).

Per-instance TTS configs live under [tts_providers.<type>.<alias>] (parallel to providers.models). What remains here are the global runtime knobs that apply to every model_provider invocation.

KeyTypeDefaultDescription
default_formatstring"mp3"Default audio output format ("mp3", "opus", "wav").
default_voicestring"alloy"Default voice ID passed to the selected tts provider.
enabledboolfalseEnable TTS synthesis.
max_text_lengthinteger4096Maximum input text length in characters (default 4096).

tunnel

Tunnel configuration for exposing the gateway publicly ([tunnel] section).

Supported model_providers: "none" (default), "cloudflare", "tailscale", "ngrok", "openvpn", "pinggy", "custom".

KeyTypeDefaultDescription
cloudflareobject
customobject
ngrokobject
openvpnobjectOpenVPN tunnel configuration ([tunnel.openvpn]).
pinggyobject
tailscaleobject
tunnel_provider*stringHow the gateway gets exposed to the public internet so webhooks (Telegram, Slack, etc.) can reach it. none = keep it local, no tunnel; cloudflare = Cloudflare Tunnel via cloudflared (needs a Zero Trust account and token); tailscale = Tailscale Funnel/Serve (tailnet-only or public, no account beyond tailscale); ngrok = ngrok agent with auth token; openvpn = bring-your-own OpenVPN egress; pinggy = Pinggy SSH tunnels (quick one-shot URLs); custom = run an arbitrary command you define under [tunnel.custom].

tunnel.cloudflare

KeyTypeDefaultDescription
token 🔑string""Cloudflare Tunnel token (from Zero Trust dashboard)

tunnel.custom

KeyTypeDefaultDescription
health_urlstring?nullOptional URL to check tunnel health
start_commandstring""Command template to start the tunnel. Use {port} and {host} placeholders.
url_patternstring?nullOptional regex to extract public URL from command stdout

tunnel.ngrok

KeyTypeDefaultDescription
auth_token 🔑string""ngrok auth token
domainstring?nullOptional custom domain

tunnel.openvpn

OpenVPN tunnel configuration ([tunnel.openvpn]).

Required when tunnel.tunnel_provider = "openvpn". Omitting this section entirely preserves previous behavior. Setting tunnel.tunnel_provider = "none" (or removing the [tunnel.openvpn] block) cleanly reverts to no-tunnel mode.

Defaults: connect_timeout_secs = 30.

KeyTypeDefaultDescription
advertise_addressstring?nullAdvertised address once VPN is connected (e.g., "10.8.0.2:42617").
auth_filestring?nullOptional path to auth credentials file (--auth-user-pass).
config_file*stringPath to .ovpn configuration file (must not be empty).
connect_timeout_secsinteger30Connection timeout in seconds (default: 30, must be > 0).
extra_argsstring[][]Extra openvpn CLI arguments forwarded verbatim.

tunnel.pinggy

KeyTypeDefaultDescription
regionstring?nullServer region: "us" (USA), "eu" (Europe), "ap" (Asia), "br" (South America), "au" (Australia), or omit for auto.
token 🔑string?nullPinggy access token (optional — free tier works without one).

tunnel.tailscale

KeyTypeDefaultDescription
funnelboolfalseUse Tailscale Funnel (public internet) vs Serve (tailnet only)
hostnamestring?nullOptional hostname override

verifiable_intent

Verifiable Intent (VI) credential verification and issuance ([verifiable_intent] section).

KeyTypeDefaultDescription
enabledboolfalseEnable VI credential verification on commerce tool calls (default: false).
strictnessstring"strict"Strictness mode for constraint evaluation: “strict” (fail-closed on unknown

web_fetch

Web fetch tool configuration ([web_fetch] section).

Fetches web pages and converts HTML to plain text for LLM consumption. Domain filtering: allowed_domains controls which hosts are reachable (use ["*"] for all public hosts). blocked_domains takes priority over allowed_domains. If allowed_domains is empty, all requests are rejected (deny-by-default).

KeyTypeDefaultDescription
allowed_domainsstring[]["*"]Allowed domains for web fetch (exact or subdomain match; ["*"] = all public hosts)
allowed_private_hostsstring[][]Private/internal hosts allowed to bypass SSRF protection (e.g. ["192.168.1.10", "internal.local"])
blocked_domainsstring[][]Blocked domains (exact or subdomain match; always takes priority over allowed_domains)
enabledboolfalseEnable web_fetch tool for fetching web page content
firecrawlobjectFirecrawl fallback configuration for JS-heavy and bot-blocked sites.
max_response_sizeinteger500000Maximum response size in bytes (default: 500KB, plain text is much smaller than raw HTML)
timeout_secsinteger30Request timeout in seconds (default: 30)

web_fetch.firecrawl

Firecrawl fallback configuration for JS-heavy and bot-blocked sites.

When enabled, if the standard web fetch fails (HTTP error, empty body, or body shorter than 100 characters suggesting a JS-only page), the tool falls back to the Firecrawl API for stealth content extraction.

KeyTypeDefaultDescription
api_key_envstring"FIRECRAWL_API_KEY"Environment variable name for the Firecrawl API key
api_urlstring"https://api.firecrawl.dev/v1"Firecrawl API base URL
enabledboolfalseEnable Firecrawl fallback
modetableFirecrawl fallback mode: scrape a single page or crawl linked pages.

Web search tool configuration ([web_search] section).

KeyTypeDefaultDescription
brave_api_key 🔑string?nullBrave Search API key (required if search_provider is “brave”)
enabledboolfalseEnable web_search_tool for web searches
jina_api_key 🔑string?nullJina AI API key (required if search_provider is “jina”)
max_resultsinteger5Maximum results per search (1-10)
search_providerstring"duckduckgo"Search provider: “duckduckgo” (free), “brave” (requires API key), “tavily” (requires API key), “searxng” (self-hosted), or “jina” (requires API key)
searxng_instance_urlstring?nullSearXNG instance URL (required if search_provider is "searxng"), e.g. "https://searx.example.com".
tavily_api_key 🔑string?nullTavily Search API key (required if search_provider is “tavily”)
timeout_secsinteger15Request timeout in seconds

wss

WebSocket Secure (WSS) transport for remote TUI-to-daemon connections ([wss]).

When enabled, the daemon listens for TLS-encrypted WebSocket connections on the configured bind address and port. TUI clients connect via --connect wss://host:port.

KeyTypeDefaultDescription
bindstring"0.0.0.0"Bind address for the WSS listener (default: “0.0.0.0”).
cert_pathstring""Path to the PEM-encoded server certificate file.
enabledboolfalseEnable the WSS listener (default: false).
key_pathstring""Path to the PEM-encoded server private key file.
portinteger9781Port for the WSS listener (default: 9781).