Config Reference
ZeroClaw is configured via a TOML file. All fields are optional unless noted.
| Section | Description |
|---|---|
acp | ACP (Agent Client Protocol) server configuration ([acp] section). |
agents | Aliased agents in this install. Each entry under [agents.<alias>] |
backup | Backup tool configuration ([backup] section). |
browser | Browser automation configuration ([browser] section). |
browser_delegate | |
channels | Top-level channel configurations ([channels] section). |
claude_code | Claude Code CLI tool configuration ([claude_code] section). |
claude_code_runner | Claude Code task runner configuration ([claude_code_runner] section). |
cloud_ops | Controls the read-only cloud transformation analysis tools: |
codex_cli | Codex CLI tool configuration ([codex_cli] section). |
composio | Composio managed OAuth tools integration ([composio] section). |
conversational_ai | Conversational AI agent builder configuration ([conversational_ai] section). |
cost | Cost tracking and budget enforcement configuration ([cost] section). |
cron | Declarative cron jobs ([cron.<alias>]), alias-keyed. |
data_retention | Data retention and purge configuration ([data_retention] section). |
delegate | Global delegate tool configuration for default timeout values. |
embedding_routes | Embedding-routing rules — route hint:<name> to specific |
escalation | Escalation routing configuration ([escalation] section). |
file_download | Standalone file download tool configuration ([file_download]). |
file_upload | Standalone file upload tool configuration ([file_upload]). |
file_upload_bundle | Standalone multi-file bundle upload tool configuration |
gateway | Gateway server configuration ([gateway] section). |
gemini_cli | Gemini CLI tool configuration ([gemini_cli] section). |
google_workspace | Google Workspace CLI (gws) tool configuration ([google_workspace] section). |
hardware | Wizard-driven hardware configuration for physical world interaction. |
heartbeat | Heartbeat configuration for periodic health pings ([heartbeat] section). |
hooks | |
http_request | HTTP request tool configuration ([http_request] section). |
image_gen | Standalone image generation tool configuration ([image_gen]). |
jira | Jira integration configuration ([jira]). |
knowledge | Knowledge graph configuration for capturing and reusing expertise. |
knowledge_bundles | Named knowledge bundles ([knowledge_bundles.<alias>]). |
link_enricher | Automatic link understanding for inbound channel messages ([link_enricher]). |
linkedin | LinkedIn integration configuration ([linkedin] section). |
locale | Locale for tool descriptions (e.g. "en", "zh-CN"). |
mcp | External MCP client configuration ([mcp] section). |
mcp_bundles | Named MCP server bundles ([mcp_bundles.<alias>]). |
media_pipeline | Automatic media understanding pipeline configuration ([media_pipeline]). |
memory | Memory backend configuration ([memory] section). |
microsoft365 | Microsoft 365 integration via Microsoft Graph API ([microsoft365] section). |
model_routes | Model-routing rules — route hint:<name> to specific |
multimodal | Multimodal (image) handling configuration ([multimodal] section). |
node_transport | Secure transport configuration for inter-node communication ([node_transport]). |
nodes | Configuration for the dynamic node discovery system ([nodes]). |
notion | Notion integration configuration ([notion]). |
observability | Observability backend configuration ([observability] section). |
onboard_state | Multi-client workspace isolation configuration. |
opencode_cli | OpenCode CLI tool configuration ([opencode_cli] section). |
pacing | Pacing controls for slow/local LLM workloads ([pacing] section). |
peer_groups | Named peer groups ([peer_groups.<name>]). Each entry binds a |
peripherals | Peripheral board integration configuration ([peripherals] section). |
pipeline | Pipeline tool configuration ([pipeline] section). |
plugins | Plugin system configuration. |
project_intel | Project delivery intelligence configuration ([project_intel] section). |
providers | Top-level wrapper for every provider category. TOML root sees a |
proxy | Proxy configuration for outbound HTTP/HTTPS/SOCKS5 traffic ([proxy] section). |
query_classification | Automatic query classification — classifies user messages by keyword/pattern |
reliability | Reliability and supervision configuration ([reliability] section). |
risk_profiles | Named risk/autonomy profiles ([risk_profiles.<alias>]). |
runtime | Runtime adapter configuration ([runtime] section). |
runtime_profiles | Named runtime/LLM execution profiles ([runtime_profiles.<alias>]). |
scheduler | Scheduler configuration for periodic task execution ([scheduler] section). |
schema_version | Config file schema version. |
secrets | Secrets encryption configuration ([secrets] section). |
security | Security configuration for audit logging, OTP, e-stop, IAM/SSO, and WebAuthn. |
security_ops | Managed Cybersecurity Service (MCSS) dashboard agent configuration ([security_ops]). |
shell_tool | Shell tool configuration ([shell_tool] section). |
skill_bundles | Named skill bundles ([skill_bundles.<alias>]). |
skills | Skills loading configuration ([skills] section). |
sop | Standard Operating Procedures engine configuration ([sop]). |
storage | Persistent storage configuration ([storage] section). |
text_browser | Text browser tool configuration ([text_browser] section). |
transcription | Voice transcription configuration with multi-provider support. |
trust | |
tts | Text-to-Speech subsystem configuration ([tts]). |
tunnel | Tunnel configuration for exposing the gateway publicly ([tunnel] section). |
verifiable_intent | Verifiable Intent (VI) credential verification and issuance ([verifiable_intent] section). |
web_fetch | Web fetch tool configuration ([web_fetch] section). |
web_search | Web search tool configuration ([web_search] section). |
wss | WebSocket Secure (WSS) transport for remote TUI-to-daemon connections ([wss]). |
acp
ACP (Agent Client Protocol) server configuration ([acp] section).
| Key | Type | Default | Description |
|---|---|---|---|
default_agent | string? | — | Agent alias to use when session/new omits agentAlias and more than |
max_sessions | integer | 10 | Maximum number of concurrent ACP sessions. Default: 10. |
session_timeout_secs | integer | 3600 | Idle 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).
| Key | Type | Default | Description |
|---|---|---|---|
compress | bool | true | Compress backup archives. |
destination_dir | string | "state/backups" | Output directory for backup archives (relative to workspace root). |
enabled | bool | true | Enable the backup tool. |
encrypt | bool | false | Encrypt backup archives (requires a configured secret store key). |
include_dirs | string[] | ["config","memory","audit","knowledge"] | Workspace subdirectories to include in backups. |
max_keep | integer | 10 | Maximum number of backups to keep (oldest are pruned). |
schedule_cron | string? | null | Optional cron expression for scheduled automatic backups. |
schedule_timezone | string? | null | IANA timezone for schedule_cron. |
browser
Browser automation configuration ([browser] section).
Controls the browser_open tool and browser automation backends.
| Key | Type | Default | Description |
|---|---|---|---|
allowed_domains | string[] | ["*"] | Allowed domains for browser_open (exact or subdomain match) |
backend | string | "agent_browser" | Browser automation backend: “agent_browser” | “rust_native” | “computer_use” | “auto” |
computer_use | object | — | Computer-use sidecar configuration ([browser.computer_use] section). |
enabled | bool | true | Enable browser_open tool (opens URLs in the system browser without scraping) |
headed | bool? | null | Show browser window for agent_browser backend. When unset, inherits AGENT_BROWSER_HEADED. |
native_chrome_path | string? | null | Optional Chrome/Chromium executable path for rust-native backend |
native_headless | bool | true | Headless mode for rust-native backend |
native_webdriver_url | string | "http://127.0.0.1:9515" | WebDriver endpoint URL for rust-native backend (e.g. http://127.0.0.1:9515) |
session_name | string? | null | Browser 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.
| Key | Type | Default | Description |
|---|---|---|---|
allow_remote_endpoint | bool | false | Allow remote/public endpoint for computer-use sidecar (default: false) |
api_key 🔑 | string? | null | Optional bearer token for computer-use sidecar |
endpoint | string | "http://127.0.0.1:8787/v1/actions" | Sidecar endpoint for computer-use actions (OS-level mouse/keyboard/screenshot) |
max_coordinate_x | integer? | null | Optional X-axis boundary for coordinate-based actions |
max_coordinate_y | integer? | null | Optional Y-axis boundary for coordinate-based actions |
timeout_ms | integer | 15000 | Per-action request timeout in milliseconds |
window_allowlist | string[] | [] | Optional window title/process allowlist forwarded to sidecar policy |
browser_delegate
| Key | Type | Default | Description |
|---|---|---|---|
allowed_domains | string[] | [] | |
blocked_domains | string[] | [] | |
chrome_profile_dir | string | "" | |
cli_binary | string | "claude" | |
enabled | bool | false | |
task_timeout_secs | integer | 120 |
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").
| Key | Type | Default | Description |
|---|---|---|---|
ack_reactions | bool | true | Whether to add acknowledgement reactions (👀 on receipt, ✅/⚠️ on |
amqp | map | — | AMQP channel instances ([channels.amqp.<alias>]). |
bluesky | map | — | Bluesky channel instances ([channels.bluesky.<alias>]). |
clawdtalk | map | — | ClawdTalk voice channel instances ([channels.clawdtalk.<alias>]). |
cli | bool | true | Enable the CLI interactive channel. Default: true. |
debounce_ms | integer | 0 | Inbound message debounce window in milliseconds. When a sender fires |
dingtalk | map | — | DingTalk channel instances ([channels.dingtalk.<alias>]). |
discord | map | — | Discord bot channel instances ([channels.discord.<alias>]). |
email | map | — | Email channel instances ([channels.email.<alias>]). |
gmail_push | map | — | Gmail Pub/Sub push notification channel instances ([channels.gmail_push.<alias>]). |
imessage | map | — | iMessage channel instances ([channels.imessage.<alias>], macOS only). |
irc | map | — | IRC channel instances ([channels.irc.<alias>]). |
lark | map | — | Lark channel instances ([channels.lark.<alias>]). |
line | map | — | LINE Messaging API channel instances ([channels.line.<alias>]). |
linq | map | — | Linq Partner API channel instances ([channels.linq.<alias>]). |
matrix | map | — | Matrix channel instances ([channels.matrix.<alias>]). |
mattermost | map | — | Mattermost bot channel instances ([channels.mattermost.<alias>]). |
max_concurrent_per_channel | integer | 4 | Per-channel multiplier for the global channel message in-flight budget. |
message_timeout_secs | integer | 300 | Base timeout in seconds for processing a single channel message (LLM + tools). |
mochat | map | — | Mochat customer service channel instances ([channels.mochat.<alias>]). |
mqtt | map | — | MQTT channel instances ([channels.mqtt.<alias>]). |
nextcloud_talk | map | — | Nextcloud Talk bot channel instances ([channels.nextcloud_talk.<alias>]). |
nostr | map | — | |
qq | map | — | QQ Official Bot channel instances ([channels.qq.<alias>]). |
reddit | map | — | Reddit channel instances ([channels.reddit.<alias>]). |
session_backend | string | "sqlite" | Session persistence backend: "jsonl" (legacy) or "sqlite" (new default). |
session_persistence | bool | true | Persist channel conversation history to JSONL files so sessions survive |
session_ttl_hours | integer | 0 | Auto-archive stale sessions older than this many hours. 0 disables. Default: 0. |
show_tool_calls | bool | false | Whether to send tool-call notification messages (e.g. 🔧 web_search_tool: …) |
signal | map | — | Signal channel instances ([channels.signal.<alias>]). |
slack | map | — | Slack bot channel instances ([channels.slack.<alias>]). |
telegram | map | — | Telegram bot channel instances ([channels.telegram.<alias>]). |
twitch | map | — | Twitch chat channel instances ([channels.twitch.<alias>]). |
twitter | map | — | X/Twitter channel instances ([channels.twitter.<alias>]). |
voice_call | map | — | Voice call channel instances ([channels.voice_call.<alias>]). |
voice_duplex | map | — | Voice duplex instances ([channels.voice_duplex.<alias>]). |
voice_wake | map | — | Voice wake word detection channel instances ([channels.voice_wake.<alias>]). |
wati | map | — | WATI WhatsApp Business API channel instances ([channels.wati.<alias>]). |
webhook | map | — | Webhook channel instances ([channels.webhook.<alias>]). |
wechat | map | — | WeChat personal iLink Bot channel instances ([channels.wechat.<alias>]). |
wecom | map | — | WeCom (WeChat Enterprise) Bot Webhook channel instances ([channels.wecom.<alias>]). |
wecom_ws | map | — | WeCom AI Bot WebSocket channel instances ([channels.wecom_ws.<alias>]). |
whatsapp | map | — | WhatsApp 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.
| Key | Type | Default | Description |
|---|---|---|---|
allowed_tools | string[] | ["Read","Edit","Bash","Write"] | Claude Code tools the subprocess is allowed to use |
enabled | bool | false | Enable the claude_code tool |
env_passthrough | string[] | [] | Extra env vars passed to the claude subprocess (e.g. ANTHROPIC_API_KEY for API-key billing) |
max_output_bytes | integer | 2097152 | Maximum output size in bytes (2MB default) |
system_prompt | string? | null | Optional system prompt appended to Claude Code invocations |
timeout_secs | integer | 600 | Maximum 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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable the claude_code_runner tool |
session_ttl | integer | 3600 | Session time-to-live in seconds before auto-cleanup (default: 3600) |
ssh_host | string? | null | SSH host for session handoff links (e.g. “myhost.example.com”) |
tmux_prefix | string | "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.
| Key | Type | Default | Description |
|---|---|---|---|
cost_threshold_monthly_usd | number | 100.0 | Monthly USD threshold to flag cost items. Default: 100.0. |
default_cloud | string | "aws" | Default cloud model_provider for analysis context. Default: “aws”. |
enabled | bool | false | Enable cloud operations tools. Default: false. |
iac_tools | string[] | ["terraform"] | Supported IaC tools for review. Default: [terraform]. |
supported_clouds | string[] | ["aws","azure","gcp"] | Supported cloud model_providers. Default: [aws, azure, gcp]. |
well_architected_frameworks | string[] | ["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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable the codex_cli tool |
env_passthrough | string[] | [] | Extra env vars passed to the codex subprocess (e.g. OPENAI_API_KEY) |
extra_args | string[] | [] | Extra CLI arguments appended to codex exec before the prompt. |
max_output_bytes | integer | 2097152 | Maximum output size in bytes (2MB default) |
timeout_secs | integer | 600 | Maximum 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.
| Key | Type | Default | Description |
|---|---|---|---|
api_key 🔑 | string? | null | Composio API key (stored encrypted when secrets.encrypt = true) |
enabled | bool | false | Enable Composio integration for 1000+ OAuth tools |
entity_id | string | "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.
| Key | Type | Default | Description |
|---|---|---|---|
analytics_enabled | bool | false | Enable conversation analytics tracking. Default: false (privacy-by-default). |
auto_detect_language | bool | true | Automatically detect user language from message content. Default: true. |
conversation_timeout_secs | integer | 1800 | Conversation timeout in seconds (inactivity). Default: 1800. |
default_language | string | "en" | Default language for conversations (BCP-47 tag). Default: “en”. |
enabled | bool | false | Enable conversational AI features. Default: false. |
escalation_confidence_threshold | number | 0.3 | Intent confidence below this threshold triggers escalation. Default: 0.3. |
knowledge_base_tool | string? | null | Optional tool name for RAG-based knowledge base lookup during conversations. |
max_conversation_turns | integer | 50 | Maximum conversation turns before auto-ending. Default: 50. |
supported_languages | string[] | ["en","de","fr","it"] | Supported languages for conversations. Default: [en, de, fr, it]. |
cost
Cost tracking and budget enforcement configuration ([cost] section).
| Key | Type | Default | Description |
|---|---|---|---|
allow_override | bool | false | Allow requests to exceed budget with –override flag (default: false) |
daily_limit_usd | number | 10.0 | Daily spending limit in USD (default: 10.00) |
enabled | bool | true | Enable cost tracking (default: true) |
enforcement | object | — | Configuration for cost enforcement behavior when budget limits are reached. |
monthly_limit_usd | number | 100.0 | Monthly spending limit in USD (default: 100.00) |
rates | object | — | [cost.rates] — top-level rate-sheet namespace. Mirrors the |
track_per_agent | bool | true | Stamp each recorded cost entry with the originating agent alias so |
warn_at_percent | integer | 80 | Warn when spending reaches this percentage of limit (default: 80) |
cost.enforcement
Configuration for cost enforcement behavior when budget limits are reached.
| Key | Type | Default | Description |
|---|---|---|---|
mode | string | "warn" | Enforcement mode: “warn”, “block”, or “route_down”. |
reserve_percent | integer | 10 | Reserve this percentage of budget for critical operations. |
route_down_model | string? | null | Model 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.
| Key | Type | Default | Description |
|---|---|---|---|
providers | object | — | [cost.rates.providers.*] — provider-shaped rate sheets. Each field |
tools | map | {} | [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]).
| Key | Type | Default | Description |
|---|---|---|---|
models | object | — | [cost.rates.providers.models.<type>.<model>] — token-cost rates |
transcription | object | — | cost.rates.providers.transcription.<type>.<model> |
tts | object | — | cost.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).
| Key | Type | Default | Description |
|---|---|---|---|
categories | string[] | [] | Limit retention enforcement to specific data categories (empty = all). |
dry_run | bool | false | Preview what would be deleted without actually removing anything. |
enabled | bool | false | Enable the data_management tool. |
retention_days | integer | 90 | Days of data to retain before purge eligibility. |
delegate
Global delegate tool configuration for default timeout values.
| Key | Type | Default | Description |
|---|---|---|---|
agentic_timeout_secs | integer | 300 | Default timeout in seconds for agentic sub-agent runs. |
timeout_secs | integer | 120 | Default 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.
| Key | Type | Default | Description |
|---|---|---|---|
alert_channels | string[] | [] | 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.
| Key | Type | Default | Description |
|---|---|---|---|
headers | map | {} | Static HTTP headers attached to every download request — typically an |
max_file_size_bytes | integer | 26214400 | Maximum download size in bytes. Enforced while streaming: the transfer |
timeout_secs | integer | 120 | Request timeout in seconds. Default: 120. |
url | string? | null | Download 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.
| Key | Type | Default | Description |
|---|---|---|---|
field_name | string | "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_bytes | integer | 26214400 | Maximum file size in bytes. Larger files are rejected before any |
method | string | "POST" | HTTP method. Only POST (default) and PUT are accepted. |
timeout_secs | integer | 60 | Request timeout in seconds. Default: 60. |
url | string? | null | Upload 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.
| Key | Type | Default | Description |
|---|---|---|---|
field_name | string | "file" | Multipart form-field name reused across every file part. Default: file. |
headers | map | {} | Static HTTP headers attached to every upload request. |
max_file_size_bytes | integer | 10485760 | Maximum per-file size in bytes. Default: 10 MiB. |
max_files | integer | 16 | Maximum number of files per call. Default: 16. |
max_response_body_bytes | integer | 4096 | Maximum response body bytes to read from the upload endpoint. |
max_total_size_bytes | integer | 33554432 | Maximum cumulative size across every file in one call. Default: 32 MiB. |
method | string | "POST" | HTTP method. Only POST (default) and PUT are accepted. |
timeout_secs | integer | 120 | Request timeout in seconds. Default: 120. |
url | string? | null | Upload 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.
| Key | Type | Default | Description |
|---|---|---|---|
allow_public_bind | bool | false | Allow binding to non-localhost without a tunnel (default: false) |
allow_remote_admin | bool | false | Allow authenticated remote callers to use admin endpoints that are |
host | string | "127.0.0.1" | Gateway host (default: 127.0.0.1) |
idempotency_max_keys | integer | 10000 | Maximum distinct idempotency keys retained in memory. |
idempotency_ttl_secs | integer | 300 | TTL for webhook idempotency keys. |
long_running_request_timeout_secs | integer | 600 | HTTP request timeout (seconds) for POST /api/cron/{id}/run, which |
pair_rate_limit_per_minute | integer | 10 | Max /pair requests per minute per client key. |
paired_tokens 🔑 | string[] | [] | Paired bearer tokens (managed automatically, not user-edited) |
pairing_dashboard | object | — | Pairing dashboard configuration ([gateway.pairing_dashboard]). |
path_prefix | string? | null | Optional URL path prefix for reverse-proxy deployments. |
port | integer | 42617 | Gateway port (default: 42617) |
rate_limit_max_keys | integer | 10000 | Maximum distinct client keys tracked by gateway rate limiter maps. |
request_timeout_secs | integer | 30 | HTTP request timeout (seconds) for gateway routes other than the |
require_pairing | bool | true | Require pairing before accepting requests (default: true) |
session_persistence | bool | true | Persist gateway WebSocket chat sessions to SQLite. Default: true. |
session_ttl_hours | integer | 0 | Auto-archive stale gateway sessions older than N hours. 0 = disabled. Default: 0. |
tls | object | — | TLS configuration for the gateway server ([gateway.tls]). |
trust_forwarded_headers | bool | false | Trust proxy-forwarded client IP headers (X-Forwarded-For, X-Real-IP). |
web_dist_dir | string? | null | Path to the web dashboard dist directory. When set, the gateway |
webhook_rate_limit_per_minute | integer | 60 | Max /webhook requests per minute per client key. |
gateway.pairing_dashboard
Pairing dashboard configuration ([gateway.pairing_dashboard]).
| Key | Type | Default | Description |
|---|---|---|---|
code_length | integer | 8 | Length of pairing codes (default: 8) |
code_ttl_secs | integer | 3600 | Time-to-live for pending pairing codes in seconds (default: 3600) |
lockout_secs | integer | 300 | Lockout duration in seconds after max attempts (default: 300) |
max_failed_attempts | integer | 5 | Maximum failed pairing attempts before lockout (default: 5) |
max_pending_codes | integer | 3 | Maximum concurrent pending pairing codes (default: 3) |
gateway.tls
TLS configuration for the gateway server ([gateway.tls]).
| Key | Type | Default | Description |
|---|---|---|---|
cert_path* | string | — | Path to the PEM-encoded server certificate file. |
client_auth | object | — | Client certificate authentication (mTLS) configuration ([gateway.tls.client_auth]). |
enabled | bool | false | Enable TLS for the gateway (default: false). |
key_path* | string | — | Path to the PEM-encoded server private key file. |
gateway.tls.client_auth
Client certificate authentication (mTLS) configuration ([gateway.tls.client_auth]).
| Key | Type | Default | Description |
|---|---|---|---|
ca_cert_path | string | "" | Path to the PEM-encoded CA certificate used to verify client certs. |
enabled | bool | false | Enable client certificate verification (default: false). |
pinned_certs | string[] | [] | Optional SHA-256 fingerprints for certificate pinning. |
require_client_cert | bool | true | Reject 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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable the gemini_cli tool |
env_passthrough | string[] | [] | Extra env vars passed to the gemini subprocess (e.g. GOOGLE_API_KEY) |
max_output_bytes | integer | 2097152 | Maximum output size in bytes (2MB default) |
timeout_secs | integer | 600 | Maximum 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 defaultgwscredential discovery).default_account:None(uses thegwsactive 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.
| Key | Type | Default | Description |
|---|---|---|---|
allowed_operations | object[] | [] | Restrict which resource/method combinations the agent can access. |
allowed_services | string[] | [] | Restrict which Google Workspace services the agent can access. |
audit_log | bool | false | Enable audit logging of every gws invocation (service, resource, |
credentials_path | string? | null | Path to service account JSON or OAuth client credentials file. |
default_account | string? | null | Default Google account email to pass to gws --account. |
enabled | bool | false | Enable the google_workspace tool. Default: false. |
rate_limit_per_minute | integer | 60 | Maximum number of gws API calls allowed per minute. Default: 60. |
timeout_secs | integer | 30 | Command execution timeout in seconds. Default: 30. |
hardware
Wizard-driven hardware configuration for physical world interaction.
| Key | Type | Default | Description |
|---|---|---|---|
baud_rate | integer | 115200 | Baud 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. |
enabled | bool | false | Opt 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_target | string? | null | Target 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_port | string? | null | TTY path for the serial transport — e.g. /dev/ttyACM0 on Linux, /dev/tty.usbmodem1 on macOS, COM3 on Windows. Ignored for other transports. |
transport | None | Native | Serial | Probe | — | Hardware transport mode. |
workspace_datasheets | bool | false | Index 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).
| Key | Type | Default | Description |
|---|---|---|---|
adaptive | bool | false | Enable adaptive intervals that back off on failures and speed up for |
agent | string | "" | Configured agent alias the heartbeat worker runs as. Required |
deadman_channel | string? | null | Channel for dead-man’s switch alerts (e.g. telegram). Falls back to |
deadman_timeout_minutes | integer | 0 | Dead-man’s switch timeout in minutes. If the heartbeat has not ticked |
deadman_to | string? | null | Recipient for dead-man’s switch alerts. Falls back to to. |
enabled | bool | false | Enable periodic heartbeat pings. Default: false. When enabled, |
interval_minutes | integer | 30 | Interval in minutes between heartbeat pings. Minimum: 1. Default: 30. |
load_session_context | bool | false | Load the channel session history before each heartbeat task execution so |
max_interval_minutes | integer | 120 | Maximum interval in minutes when adaptive mode backs off. Default: 120. |
max_run_history | integer | 100 | Maximum number of heartbeat run history records to retain. Default: 100. |
message | string? | null | Optional fallback task text when HEARTBEAT.md has no task entries. |
min_interval_minutes | integer | 5 | Minimum interval in minutes when adaptive mode is enabled. Default: 5. |
target | string? | null | Optional delivery channel for heartbeat output (for example: telegram). |
task_timeout_secs | integer | 600 | Maximum wall-clock seconds allowed for a single agent invocation |
to | string? | null | Optional delivery recipient/chat identifier (required when target is |
two_phase | bool | true | Enable two-phase heartbeat: Phase 1 asks LLM whether to run, Phase 2 |
hooks
| Key | Type | Default | Description |
|---|---|---|---|
builtin | object | — | |
enabled* | bool | — | Enable lifecycle hook execution. |
hooks.builtin
| Key | Type | Default | Description |
|---|---|---|---|
command_logger* | bool | — | Enable the command-logger hook (logs tool calls for auditing). |
webhook_audit | object | — | Configuration 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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable the webhook-audit hook. Default: false. |
include_args | bool | false | Include tool call arguments in the audit payload. Default: false. |
max_args_bytes | integer | 4096 | Maximum size (in bytes) of serialised arguments included in a single |
tool_patterns | string[] | [] | Glob patterns for tool names to audit (e.g. ["Bash", "Write"]). |
url | string | "" | 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.
| Key | Type | Default | Description |
|---|---|---|---|
allow_private_hosts | bool | false | Allow requests to private/LAN hosts (RFC 1918, loopback, link-local, .local). |
allowed_domains | string[] | [] | Allowed domains for HTTP requests (exact or subdomain match) |
allowed_private_hosts | string[] | [] | Private/internal hosts explicitly allowed to bypass SSRF protection. |
enabled | bool | false | Enable http_request tool for API interactions |
max_response_size | integer | 1000000 | Maximum response size in bytes (default: 1MB, 0 = unlimited) |
secrets 🔑 | map | {} | Named authorization secrets for auth_secret requests. |
timeout_secs | integer | 30 | Request 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.
| Key | Type | Default | Description |
|---|---|---|---|
api_key_env | string | "FAL_API_KEY" | Environment variable name holding the fal.ai API key. |
default_model | string | "fal-ai/flux/schnell" | Default fal.ai model identifier. |
enabled | bool | false | Enable 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:falseallowed_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.
| Key | Type | Default | Description |
|---|---|---|---|
allowed_actions | string[] | ["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_url | string | "" | Atlassian instance base URL, e.g. https://yourco.atlassian.net. |
email | string? | — | Jira account email used for Basic auth (Cloud). |
enabled | bool | false | Enable the jira tool. Default: false. |
timeout_secs | integer | 30 | Request timeout in seconds. Default: 30. |
knowledge
Knowledge graph configuration for capturing and reusing expertise.
| Key | Type | Default | Description |
|---|---|---|---|
auto_capture | bool | false | Automatically capture knowledge from conversations. Default: false. |
db_path | string | "/home/runner/.zeroclaw/knowledge.db" | Path to the knowledge graph SQLite database. |
enabled | bool | false | Enable the knowledge graph tool. Default: false. |
max_nodes | integer | 100000 | Maximum number of knowledge nodes. Default: 100000. |
suggest_on_query | bool | true | Proactively suggest relevant knowledge on queries. Default: true. |
knowledge_bundles
Named knowledge bundles ([knowledge_bundles.<alias>]).
link_enricher
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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable the link enricher pipeline stage (default: false) |
max_links | integer | 3 | Maximum number of links to fetch per message (default: 3) |
timeout_secs | integer | 10 | Per-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.
| Key | Type | Default | Description |
|---|---|---|---|
api_version | string | "202602" | LinkedIn REST API version header (YYYYMM format). |
content | object | — | Content strategy configuration for LinkedIn auto-posting ([linkedin.content]). |
enabled | bool | false | Enable the LinkedIn tool. |
image | object | — | Image 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.
| Key | Type | Default | Description |
|---|---|---|---|
github_repos | string[] | [] | GitHub repositories to highlight (format: owner/repo). |
github_users | string[] | [] | GitHub usernames whose public activity to reference. |
instructions | string | "" | Freeform posting instructions for the AI agent. |
persona | string | "" | Professional persona description (name, role, expertise). |
rss_feeds | string[] | [] | RSS feed URLs to monitor for topic inspiration (titles only). |
topics | string[] | [] | Topics of expertise and interest for post themes. |
linkedin.image
Image generation configuration for LinkedIn posts ([linkedin.image]).
| Key | Type | Default | Description |
|---|---|---|---|
card_accent_color | string | "#0A66C2" | Accent color for the fallback card (CSS hex). |
dalle | object | — | OpenAI DALL-E settings ([linkedin.image.dalle]). |
enabled | bool | false | Enable image generation for posts. |
fallback_card | bool | true | Generate a branded SVG text card when all AI model_providers fail. |
flux | object | — | Flux (fal.ai) image generation settings ([linkedin.image.flux]). |
imagen | object | — | Google Imagen (Vertex AI) settings ([linkedin.image.imagen]). |
providers | string[] | ["stability","imagen","dalle","flux"] | ModelProvider priority order. Tried in sequence; first success wins. |
stability | object | — | Stability AI image generation settings ([linkedin.image.stability]). |
temp_dir | string | "linkedin/images" | Temp directory for generated images, relative to workspace. |
linkedin.image.dalle
OpenAI DALL-E settings ([linkedin.image.dalle]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key_env | string | "OPENAI_API_KEY" | Environment variable name holding the OpenAI API key. |
model | string | "dall-e-3" | DALL-E model identifier. |
size | string | "1024x1024" | Image dimensions. |
linkedin.image.flux
Flux (fal.ai) image generation settings ([linkedin.image.flux]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key_env | string | "FAL_API_KEY" | Environment variable name holding the fal.ai API key. |
model | string | "fal-ai/flux/schnell" | Flux model identifier. |
linkedin.image.imagen
Google Imagen (Vertex AI) settings ([linkedin.image.imagen]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key_env | string | "GOOGLE_VERTEX_API_KEY" | Environment variable name holding the API key. |
project_id_env | string | "GOOGLE_CLOUD_PROJECT" | Environment variable for the Google Cloud project ID. |
region | string | "us-central1" | Vertex AI region. |
linkedin.image.stability
Stability AI image generation settings ([linkedin.image.stability]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key_env | string | "STABILITY_API_KEY" | Environment variable name holding the API key. |
model | string | "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).
| Key | Type | Default | Description |
|---|---|---|---|
deferred_loading | bool | true | Load MCP tool schemas on-demand via tool_search instead of eagerly |
enabled | bool | false | Enable MCP tool loading. |
servers | object[] | [] | 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.
| Key | Type | Default | Description |
|---|---|---|---|
describe_images | bool | true | Add image descriptions when a vision-capable model is active. |
enabled | bool | false | Master toggle for the media pipeline (default: false). |
summarize_video | bool | true | Summarize video attachments (placeholder — requires external API). |
transcribe_audio | bool | true | Transcribe 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.
| Key | Type | Default | Description |
|---|---|---|---|
archive_after_days | integer | 7 | Move daily/session files to the archive directory after this many days. Keeps the hot working set small without deleting history. |
audit_enabled | bool | false | Enable audit logging of memory operations. |
audit_retention_days | integer | 30 | Retention period for audit entries in days (default: 30). |
auto_hydrate | bool | true | Auto-hydrate from MEMORY_SNAPSHOT.md when brain.db is missing |
auto_save | bool | true | Auto-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* | string | — | Dotted reference to the active storage instance: <backend>.<alias> |
chunk_max_tokens | integer | 512 | Max tokens per chunk for document splitting |
conflict_threshold | number | 0.85 | Cosine similarity threshold for conflict detection (0.0–1.0). |
conversation_retention_days | integer | 30 | For 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_namespace | string | "default" | Default namespace for memory entries. |
embedding_cache_size | integer | 10000 | Max embedding cache entries before LRU eviction |
embedding_dimensions | integer | 1536 | Vector 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_model | string | "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_provider | string | "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_score | number | 0.85 | FTS score above which to early-return without vector search (0.0–1.0). |
hygiene_enabled | bool | true | Run the periodic hygiene pass that archives stale daily/session files and enforces retention windows. Leave on unless you want to manage cleanup yourself. |
keyword_weight | number | 0.3 | How 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_score | number | 0.4 | Minimum hybrid score (0.0–1.0) for a memory to be included in context. |
policy | object | — | Memory policy configuration ([memory.policy] section). |
purge_after_days | integer | 30 | Delete archived files permanently after this many days. Set high if you need long-term history; set low for privacy / disk-space reasons. |
rerank_enabled | bool | false | Enable LLM reranking when candidate count exceeds threshold. |
rerank_threshold | integer | 5 | Minimum candidate count to trigger reranking. |
response_cache_enabled | bool | false | Enable LLM response caching to avoid paying for duplicate prompts |
response_cache_hot_entries | integer | 256 | Max in-memory hot cache entries for the two-tier response cache (default: 256) |
response_cache_max_entries | integer | 5000 | Max number of cached responses before LRU eviction (default: 5000) |
response_cache_ttl_minutes | integer | 60 | TTL in minutes for cached responses (default: 60) |
retrieval_stages | string[] | ["cache","fts","vector"] | Retrieval stages to execute in order. Valid: “cache”, “fts”, “vector”. |
search_mode | table | — | Search strategy for memory recall. |
snapshot_enabled | bool | false | Enable periodic export of core memories to MEMORY_SNAPSHOT.md |
snapshot_on_hygiene | bool | false | Run snapshot during hygiene passes (heartbeat-driven) |
vector_weight | number | 0.7 | How 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).
| Key | Type | Default | Description |
|---|---|---|---|
max_entries_per_category | integer | 0 | Maximum entries per category (0 = unlimited). |
max_entries_per_namespace | integer | 0 | Maximum entries per namespace (0 = unlimited). |
read_only_namespaces | string[] | [] | Namespaces that are read-only (writes are rejected). |
retention_days_by_category | map | {} | 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.
| Key | Type | Default | Description |
|---|---|---|---|
auth_flow | string | "client_credentials" | Authentication flow: “client_credentials” or “device_code” |
client_id | string? | null | Azure AD application (client) ID |
client_secret 🔑 | string? | null | Azure AD client secret (stored encrypted when secrets.encrypt = true) |
enabled | bool | false | Enable Microsoft 365 integration |
scopes | string[] | ["https://graph.microsoft.com/.default"] | OAuth scopes to request |
tenant_id | string? | null | Azure AD tenant ID |
token_cache_encrypted | bool | true | Encrypt the token cache file on disk |
user_id | string? | null | User 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.
| Key | Type | Default | Description |
|---|---|---|---|
allow_remote_fetch | bool | false | Allow fetching remote image URLs (http/https). Disabled by default. |
max_image_size_mb | integer | 5 | Maximum image payload size in MiB before base64 encoding. |
max_image_turns | integer | 0 | Maximum age of images in conversation turns. |
max_images | integer | 4 | Maximum number of image attachments accepted per request. |
vision_model | string? | null | Model to use when routing to the vision model_provider (e.g. "llava:7b"). |
vision_model_provider | string? | null | ModelProvider name to use for vision/image messages (e.g. "ollama"). |
node_transport
Secure transport configuration for inter-node communication ([node_transport]).
| Key | Type | Default | Description |
|---|---|---|---|
allowed_peers | string[] | [] | Allow specific node IPs/CIDRs. |
connection_pool_size | integer | 4 | Maximum number of connections per peer. |
enabled | bool | true | Enable the secure transport layer. |
max_request_age_secs | integer | 300 | Maximum age of signed requests in seconds (replay protection). |
mutual_tls | bool | false | Require client certificates (mutual TLS). |
require_https | bool | true | Require HTTPS for all node communication. |
shared_secret 🔑 | string | "" | Shared secret for HMAC authentication between nodes. |
tls_cert_path | string? | null | Path to TLS certificate file. |
tls_key_path | string? | null | Path 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.
| Key | Type | Default | Description |
|---|---|---|---|
auth_token 🔑 | string? | null | Optional bearer token for node authentication. |
enabled | bool | false | Enable dynamic node discovery endpoint. |
max_nodes | integer | 16 | Maximum 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.
| Key | Type | Default | Description |
|---|---|---|---|
api_key 🔑 | string | "" | |
database_id | string | "" | |
enabled | bool | false | |
input_property | string | "Input" | |
max_concurrent | integer | 4 | |
poll_interval_secs | integer | 5 | |
recover_stale | bool | true | |
result_property | string | "Result" | |
status_property | string | "Status" |
observability
Observability backend configuration ([observability] section).
| Key | Type | Default | Description |
|---|---|---|---|
backend* | string | — | “none” | “log” | “verbose” | “prometheus” | “otel” |
log_persistence | string | "rolling" | Log persistence mode: “none” | “rolling” | “full”. |
log_persistence_max_entries | integer | 200 | Maximum entries retained when log_persistence = "rolling". |
log_persistence_path | string | "state/runtime-trace.jsonl" | Log persistence file path. Relative paths resolve under workspace_dir. |
log_tool_io | string | "redacted" | Tool I/O capture policy: “off” | “redacted” | “full”. |
log_tool_io_denylist | string[] | [] | Tool names whose I/O is never logged beyond name + outcome + duration |
log_tool_io_truncate_bytes | integer | 40960 | Truncate the captured tool input and output at this many bytes when |
otel_endpoint | string? | null | OTLP endpoint (e.g. "http://localhost:4318"). Only used when backend = "otel". |
otel_headers 🔑 | map? | null | Optional HTTP headers sent with every OTLP export request (e.g. authorization). |
otel_service_name | string? | null | Service 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.
| Key | Type | Default | Description |
|---|---|---|---|
completed_sections | string[] | [] | Section keys the user has completed at least once. |
quickstart_completed | bool | false | true 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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable the opencode_cli tool |
env_passthrough | string[] | [] | Extra env vars passed to the opencode subprocess |
max_output_bytes | integer | 2097152 | Maximum output size in bytes (2MB default) |
timeout_secs | integer | 600 | Maximum 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.
| Key | Type | Default | Description |
|---|---|---|---|
loop_detection_enabled | bool | true | Enable pattern-based loop detection (exact repeat, ping-pong, |
loop_detection_max_repeats | integer | 3 | Number of consecutive identical tool+args calls before the first |
loop_detection_min_elapsed_secs | integer? | null | Minimum elapsed seconds before loop detection activates. |
loop_detection_window_size | integer | 20 | Sliding window size for the pattern-based loop detector. |
loop_ignore_tools | string[] | [] | Tool names excluded from identical-output / alternating-pattern loop |
message_timeout_scale_max | integer? | null | Override for the hardcoded timeout scaling cap (default: 4). |
step_timeout_secs | integer? | null | Per-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.
| Key | Type | Default | Description |
|---|---|---|---|
boards | object[] | [] | Board configurations (nucleo-f401re, rpi-gpio, etc.) |
datasheet_dir | string? | null | Path to datasheet docs (relative to workspace) for RAG retrieval. |
enabled | bool | false | Enable peripheral support (boards become agent tools) |
pipeline
Pipeline tool configuration ([pipeline] section).
| Key | Type | Default | Description |
|---|---|---|---|
allowed_tools | string[] | [] | Tools allowed in pipeline steps. Steps referencing tools not on this |
enabled | bool | false | Enable the execute_pipeline meta-tool. |
max_steps | integer | 20 | Maximum number of steps allowed in a single pipeline invocation. |
plugins
Plugin system configuration.
| Key | Type | Default | Description |
|---|---|---|---|
auto_discover | bool | false | Auto-discover and load plugins on startup |
enabled | bool | false | Enable the plugin system (default: false) |
max_plugins | integer | 50 | Maximum number of plugins that can be loaded |
plugins_dir | string | "/home/runner/.zeroclaw/plugins" | Directory where plugins are stored |
security | object | — | Plugin 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.
| Key | Type | Default | Description |
|---|---|---|---|
signature_mode | string | "disabled" | Signature enforcement mode: “disabled”, “permissive”, or “strict”. |
trusted_publisher_keys | string[] | [] | Hex-encoded Ed25519 public keys of trusted plugin publishers. |
project_intel
Project delivery intelligence configuration ([project_intel] section).
| Key | Type | Default | Description |
|---|---|---|---|
default_language | string | "en" | Default report language (en, de, fr, it). Default: “en”. |
enabled | bool | false | Enable the project_intel tool. Default: false. |
include_git_data | bool | true | Include git log data in reports. Default: true. |
include_jira_data | bool | false | Include Jira data in reports. Default: false. |
jira_base_url | string? | null | Jira instance base URL (required if include_jira_data is true). |
report_output_dir | string | "/home/runner/.zeroclaw/project-reports" | Output directory for generated reports. |
risk_sensitivity | string | "medium" | Risk detection sensitivity: low, medium, high. Default: “medium”. |
templates_dir | string? | null | Optional 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.
| Key | Type | Default | Description |
|---|---|---|---|
models | object | — | Typed model provider container — one slot per canonical model_provider type. |
transcription | object | — | Typed transcription-provider container — one slot per STT family. |
tts | object | — | Typed 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).
| Key | Type | Default | Description |
|---|---|---|---|
all_proxy | string? | null | Fallback proxy URL for all schemes. |
enabled | bool | false | Enable proxy support for selected scope. |
http_proxy | string? | null | Proxy URL for HTTP requests (supports http, https, socks5, socks5h). |
https_proxy | string? | null | Proxy URL for HTTPS requests (supports http, https, socks5, socks5h). |
no_proxy | string[] | [] | No-proxy bypass list. Same format as NO_PROXY. |
scope | table | — | Proxy application scope — determines which outbound traffic uses the proxy. |
services | string[] | [] | 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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable automatic query classification. Default: false. |
rules | object[] | [] | Classification rules evaluated in priority order. |
reliability
Reliability and supervision configuration ([reliability] section).
Controls model_provider retries, API key rotation, and channel restart backoff.
| Key | Type | Default | Description |
|---|---|---|---|
api_keys 🔑 | string[] | [] | Additional API keys for round-robin rotation on rate-limit (429) errors. |
channel_initial_backoff_secs | integer | 2 | Initial backoff for channel/daemon restarts. |
channel_max_backoff_secs | integer | 60 | Max backoff for channel/daemon restarts. |
provider_backoff_ms | integer | 500 | Base backoff (ms) for model_provider retry delay. |
provider_retries | integer | 2 | Retries per model_provider before bailing. |
scheduler_poll_secs | integer | 15 | Scheduler polling cadence in seconds. |
scheduler_retries | integer | 2 | Max retries for cron job execution attempts. |
risk_profiles
Named risk/autonomy profiles ([risk_profiles.<alias>]).
runtime
Runtime adapter configuration ([runtime] section).
| Key | Type | Default | Description |
|---|---|---|---|
docker | object | — | Docker runtime configuration ([runtime.docker] section). |
kind | string | "native" | Runtime kind (native | docker). |
reasoning_effort | string? | null | Optional reasoning effort for model_providers that expose a level control. |
reasoning_enabled | bool? | null | Global reasoning override for model_providers that expose explicit controls. |
runtime.docker
Docker runtime configuration ([runtime.docker] section).
| Key | Type | Default | Description |
|---|---|---|---|
allowed_workspace_roots | string[] | [] | Optional workspace root allowlist for Docker mount validation. |
cpu_limit | number? | 1.0 | Optional CPU limit (None = no explicit limit). |
image | string | "alpine:3.20" | Runtime image used to execute shell commands. |
memory_limit_mb | integer? | 512 | Optional memory limit in MB (None = no explicit limit). |
mount_workspace | bool | true | Mount configured workspace into /workspace. |
network | string | "none" | Docker network mode (none, bridge, etc.). |
read_only_rootfs | bool | true | Mount 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.
| Key | Type | Default | Description |
|---|---|---|---|
catch_up_on_startup | bool | true | Run all overdue jobs at scheduler startup. Default: true. |
enabled | bool | true | Enable the built-in scheduler loop. When false, no cron jobs run. |
max_concurrent | integer | 4 | Maximum tasks executed in parallel within a single polling cycle. |
max_run_history | integer | 50 | Maximum number of historical cron run records to retain. Default: 50. |
max_tasks | integer | 64 | Maximum number of persisted scheduled tasks per polling cycle. |
schema_version
Config file schema version.
secrets
Secrets encryption configuration ([secrets] section).
| Key | Type | Default | Description |
|---|---|---|---|
encrypt | bool | true | Enable 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).
| Key | Type | Default | Description |
|---|---|---|---|
audit | object | — | Audit logging configuration |
estop | map | — | Emergency stop configuration. |
nevis | map | — | Nevis IAM integration configuration. |
otp | map | — | Security OTP configuration. |
webauthn | object | — | WebAuthn / FIDO2 hardware key authentication configuration ([security.webauthn]). |
security.audit
Audit logging configuration
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Enable audit logging |
log_path | string | "audit.log" | Path to audit log file (relative to zeroclaw dir) |
max_size_mb | integer | 100 | Maximum log size in MB before rotation |
sign_events | bool | false | Sign events with HMAC for tamper evidence |
security.estop
Emergency stop configuration.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable emergency stop controls. |
require_otp_to_resume | bool | true | Require a valid OTP before resume operations. |
state_file | string | "/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.
| Key | Type | Default | Description |
|---|---|---|---|
client_id | string | "" | OAuth2 client ID registered in Nevis. |
client_secret 🔑 | string? | null | OAuth2 client secret. Encrypted via SecretStore when stored on disk. |
enabled | bool | false | Enable Nevis IAM integration. Defaults to false for backward compatibility. |
instance_url | string | "" | Base URL of the Nevis instance (e.g. https://nevis.example.com). |
jwks_url | string? | null | JWKS endpoint URL for local token validation. |
realm | string | "master" | Nevis realm to authenticate against. |
require_mfa | bool | false | Require MFA verification for all Nevis-authenticated requests. |
role_mapping | map[] | [] | Nevis role to ZeroClaw permission mappings. |
session_timeout_secs | integer | 3600 | Session timeout in seconds. |
token_validation | string | "local" | Token validation strategy: "local" (JWKS) or "remote" (introspection). |
security.otp
Security OTP configuration.
| Key | Type | Default | Description |
|---|---|---|---|
cache_valid_secs | integer | 300 | Reuse window for recently validated OTP codes. |
challenge_max_attempts | integer | 3 | Maximum number of OTP challenge attempts before lockout. |
enabled | bool | false | Enable OTP gating. Defaults to disabled for backward compatibility. |
gated_actions | string[] | ["shell","file_write","browser_open","browser","memory_forget"] | Tool/action names gated by OTP. Empty or malformed entries are rejected |
gated_domain_categories | string[] | [] | Domain-category presets expanded into gated_domains. |
gated_domains | string[] | [] | Explicit domain patterns gated by OTP. |
method | table | — | OTP validation strategy. |
token_ttl_secs | integer | 30 | TOTP 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).
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable WebAuthn authentication. Default: false. |
rp_id | string | "localhost" | Relying Party ID (domain name, e.g. “example.com”). Default: “localhost”. |
rp_name | string | "ZeroClaw" | Relying Party display name. Default: “ZeroClaw”. |
rp_origin | string | "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]).
| Key | Type | Default | Description |
|---|---|---|---|
auto_triage | bool | false | Automatically triage incoming alerts without user prompt. |
enabled | bool | false | Enable security operations tools. |
max_auto_severity | string | "low" | Maximum severity level that can be auto-remediated without approval. |
playbooks_dir | string | "/home/runner/.zeroclaw/playbooks" | Directory containing incident response playbook definitions (JSON). |
report_output_dir | string | "/home/runner/.zeroclaw/security-reports" | Directory for generated security reports. |
require_approval_for_actions | bool | true | Require human approval before executing playbook actions. |
siem_integration | string? | null | Optional 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.
| Key | Type | Default | Description |
|---|---|---|---|
timeout_secs | integer | 60 | Maximum shell command execution time in seconds (default: 60). |
skill_bundles
Named skill bundles ([skill_bundles.<alias>]).
skills
Skills loading configuration ([skills] section).
| Key | Type | Default | Description |
|---|---|---|---|
allow_scripts | bool | false | Allow script-like files in skills (.sh, .bash, .ps1, shebang shell files). |
install_suggestions | object | — | Prompt-triggered skill install suggestions ([skills.install_suggestions] section). |
open_skills_dir | string? | null | Optional path to a local open-skills repository. |
open_skills_enabled | bool | false | Enable loading and syncing the community open-skills repository. |
prompt_injection_mode | table | — | Skills loading configuration ([skills] section). |
registry_url | string? | null | URL of the skills registry repository for bare-name installs. |
skill_creation | object | — | Autonomous skill creation configuration ([skills.skill_creation] section). |
skill_improvement | object | — | Skill self-improvement configuration ([skills.auto_improve] section). |
skills.install_suggestions
Prompt-triggered skill install suggestions ([skills.install_suggestions] section).
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable suggestions for installable skills before normal agent turns. |
skills.skill_creation
Autonomous skill creation configuration ([skills.skill_creation] section).
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable automatic skill creation after successful multi-step tasks. |
max_skills | integer | 500 | Maximum number of auto-generated skills to keep. |
similarity_threshold | number | 0.85 | Embedding similarity threshold for deduplication. |
skills.skill_improvement
Skill self-improvement configuration ([skills.auto_improve] section).
| Key | Type | Default | Description |
|---|---|---|---|
cooldown_secs | integer | 3600 | Minimum interval (in seconds) between improvements for the same skill. |
enabled | bool | true | Enable 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.
| Key | Type | Default | Description |
|---|---|---|---|
approval_timeout_secs | integer | 300 | Approval timeout in seconds. When a run waits for approval longer than |
default_execution_mode | string | "supervised" | Default execution mode for SOPs that omit execution_mode. |
max_concurrent_total | integer | 4 | Maximum total concurrent SOP runs across all SOPs. |
max_finished_runs | integer | 100 | Maximum number of finished runs kept in memory for status queries. |
sops_dir | string? | null | Directory 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.
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable text_browser tool |
preferred_browser | string? | null | Preferred text browser (“lynx”, “links”, or “w3m”). If unset, auto-detects. |
timeout_secs | integer | 30 | Request 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.
| Key | Type | Default | Description |
|---|---|---|---|
api_key 🔑 | string? | null | API key used for transcription requests (Groq transcription provider). |
api_url | string | "https://api.groq.com/openai/v1/audio/transcriptions" | Whisper API endpoint URL (Groq transcription provider). |
assemblyai | object | — | AssemblyAI STT model_provider configuration ([transcription.assemblyai]). |
deepgram | object | — | Deepgram STT model_provider configuration ([transcription.deepgram]). |
enabled | bool | false | Enable voice transcription for channels that support it. |
google | object | — | Google Cloud Speech-to-Text model_provider configuration ([transcription.google]). |
initial_prompt | string? | null | Optional initial prompt to bias transcription toward expected vocabulary |
language | string? | null | Optional language hint (ISO-639-1, e.g. “en”, “ru”) for Groq transcription provider. |
local_whisper | object | — | Local/self-hosted Whisper-compatible STT endpoint ([transcription.local_whisper]). |
max_audio_bytes | integer? | null | Optional global audio size upper bound in bytes, enforced before |
max_duration_secs | integer | 120 | Maximum voice duration in seconds (messages longer than this are skipped). |
model | string | "whisper-large-v3-turbo" | Whisper model name (Groq transcription provider). |
openai | object | — | OpenAI Whisper STT model_provider configuration ([transcription.openai]). |
transcribe_non_ptt_audio | bool | false | Also transcribe non-PTT (forwarded/regular) audio messages on WhatsApp, |
transcription.assemblyai
AssemblyAI STT model_provider configuration ([transcription.assemblyai]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key 🔑 | string? | null | AssemblyAI API key. |
transcription.deepgram
Deepgram STT model_provider configuration ([transcription.deepgram]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key 🔑 | string? | null | Deepgram API key. |
model | string | "nova-2" | Deepgram model name (default: “nova-2”). |
transcription.google
Google Cloud Speech-to-Text model_provider configuration ([transcription.google]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key 🔑 | string? | null | Google Cloud API key. |
language_code | string | "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.
| Key | Type | Default | Description |
|---|---|---|---|
bearer_token 🔑 | string? | null | Bearer token for endpoint authentication. |
max_audio_bytes | integer | 26214400 | Maximum audio file size in bytes accepted by this endpoint. |
timeout_secs | integer | 300 | Request timeout in seconds. Defaults to 300 (large files on local GPU). |
url* | string | — | HTTP or HTTPS endpoint URL, e.g. "http://10.10.0.1:8001/v1/transcribe". |
transcription.openai
OpenAI Whisper STT model_provider configuration ([transcription.openai]).
| Key | Type | Default | Description |
|---|---|---|---|
api_key 🔑 | string? | null | OpenAI API key for Whisper transcription. |
model | string | "whisper-1" | Whisper model name (default: “whisper-1”). |
trust
| Key | Type | Default | Description |
|---|---|---|---|
correction_penalty | number | 0.05 | |
decay_half_life_days | number | 30.0 | |
initial_score | number | 0.8 | |
regression_threshold | number | 0.5 | |
success_boost | number | 0.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.
| Key | Type | Default | Description |
|---|---|---|---|
default_format | string | "mp3" | Default audio output format ("mp3", "opus", "wav"). |
default_voice | string | "alloy" | Default voice ID passed to the selected tts provider. |
enabled | bool | false | Enable TTS synthesis. |
max_text_length | integer | 4096 | Maximum 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".
| Key | Type | Default | Description |
|---|---|---|---|
cloudflare | object | — | |
custom | object | — | |
ngrok | object | — | |
openvpn | object | — | OpenVPN tunnel configuration ([tunnel.openvpn]). |
pinggy | object | — | |
tailscale | object | — | |
tunnel_provider* | string | — | How 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
| Key | Type | Default | Description |
|---|---|---|---|
token 🔑 | string | "" | Cloudflare Tunnel token (from Zero Trust dashboard) |
tunnel.custom
| Key | Type | Default | Description |
|---|---|---|---|
health_url | string? | null | Optional URL to check tunnel health |
start_command | string | "" | Command template to start the tunnel. Use {port} and {host} placeholders. |
url_pattern | string? | null | Optional regex to extract public URL from command stdout |
tunnel.ngrok
| Key | Type | Default | Description |
|---|---|---|---|
auth_token 🔑 | string | "" | ngrok auth token |
domain | string? | null | Optional 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.
| Key | Type | Default | Description |
|---|---|---|---|
advertise_address | string? | null | Advertised address once VPN is connected (e.g., "10.8.0.2:42617"). |
auth_file | string? | null | Optional path to auth credentials file (--auth-user-pass). |
config_file* | string | — | Path to .ovpn configuration file (must not be empty). |
connect_timeout_secs | integer | 30 | Connection timeout in seconds (default: 30, must be > 0). |
extra_args | string[] | [] | Extra openvpn CLI arguments forwarded verbatim. |
tunnel.pinggy
| Key | Type | Default | Description |
|---|---|---|---|
region | string? | null | Server region: "us" (USA), "eu" (Europe), "ap" (Asia), "br" (South America), "au" (Australia), or omit for auto. |
token 🔑 | string? | null | Pinggy access token (optional — free tier works without one). |
tunnel.tailscale
| Key | Type | Default | Description |
|---|---|---|---|
funnel | bool | false | Use Tailscale Funnel (public internet) vs Serve (tailnet only) |
hostname | string? | null | Optional hostname override |
verifiable_intent
Verifiable Intent (VI) credential verification and issuance ([verifiable_intent] section).
| Key | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable VI credential verification on commerce tool calls (default: false). |
strictness | string | "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).
| Key | Type | Default | Description |
|---|---|---|---|
allowed_domains | string[] | ["*"] | Allowed domains for web fetch (exact or subdomain match; ["*"] = all public hosts) |
allowed_private_hosts | string[] | [] | Private/internal hosts allowed to bypass SSRF protection (e.g. ["192.168.1.10", "internal.local"]) |
blocked_domains | string[] | [] | Blocked domains (exact or subdomain match; always takes priority over allowed_domains) |
enabled | bool | false | Enable web_fetch tool for fetching web page content |
firecrawl | object | — | Firecrawl fallback configuration for JS-heavy and bot-blocked sites. |
max_response_size | integer | 500000 | Maximum response size in bytes (default: 500KB, plain text is much smaller than raw HTML) |
timeout_secs | integer | 30 | Request 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.
| Key | Type | Default | Description |
|---|---|---|---|
api_key_env | string | "FIRECRAWL_API_KEY" | Environment variable name for the Firecrawl API key |
api_url | string | "https://api.firecrawl.dev/v1" | Firecrawl API base URL |
enabled | bool | false | Enable Firecrawl fallback |
mode | table | — | Firecrawl fallback mode: scrape a single page or crawl linked pages. |
web_search
Web search tool configuration ([web_search] section).
| Key | Type | Default | Description |
|---|---|---|---|
brave_api_key 🔑 | string? | null | Brave Search API key (required if search_provider is “brave”) |
enabled | bool | false | Enable web_search_tool for web searches |
jina_api_key 🔑 | string? | null | Jina AI API key (required if search_provider is “jina”) |
max_results | integer | 5 | Maximum results per search (1-10) |
search_provider | string | "duckduckgo" | Search provider: “duckduckgo” (free), “brave” (requires API key), “tavily” (requires API key), “searxng” (self-hosted), or “jina” (requires API key) |
searxng_instance_url | string? | null | SearXNG instance URL (required if search_provider is "searxng"), e.g. "https://searx.example.com". |
tavily_api_key 🔑 | string? | null | Tavily Search API key (required if search_provider is “tavily”) |
timeout_secs | integer | 15 | Request 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.
| Key | Type | Default | Description |
|---|---|---|---|
bind | string | "0.0.0.0" | Bind address for the WSS listener (default: “0.0.0.0”). |
cert_path | string | "" | Path to the PEM-encoded server certificate file. |
enabled | bool | false | Enable the WSS listener (default: false). |
key_path | string | "" | Path to the PEM-encoded server private key file. |
port | integer | 9781 | Port for the WSS listener (default: 9781). |