TaskFlow
DashboardFreewriteWhiteboardsProjectsCRMTasksNotificationsSettingsAgent TowerAPI Docs
OpenClaw Docs
?

User

Member

Caricamento in corso...

Home
Progetti
Task
Notifiche
CRM

    OpenClaw

    Documentation Mirror

    Documentation Overview

    Docs

    Auth credential semantics
    Scheduled tasks
    Hooks
    Automation & tasks
    Standing orders
    Task flow
    Background tasks
    BlueBubbles
    Broadcast groups
    Channel routing
    Discord
    Feishu
    Google Chat
    Group messages
    Groups
    iMessage
    Chat channels
    IRC
    LINE
    Channel location parsing
    Matrix
    Matrix migration
    Matrix push rules for quiet previews
    Mattermost
    Microsoft Teams
    Nextcloud Talk
    Nostr
    Pairing
    QA channel
    QQ bot
    Signal
    Slack
    Synology Chat
    Telegram
    Tlon
    Channel troubleshooting
    Twitch
    WeChat
    WhatsApp
    Yuanbao
    Zalo
    Zalo personal
    CI pipeline
    ACP
    Agent
    Agents
    Approvals
    Backup
    Browser
    Channels
    Clawbot
    `openclaw commitments`
    Completion
    Config
    Configure
    Cron
    Daemon
    Dashboard
    Devices
    Directory
    DNS
    Docs
    Doctor
    Flows (redirect)
    Gateway
    Health
    Hooks
    CLI reference
    Inference CLI
    Logs
    MCP
    Memory
    Message
    Migrate
    Models
    Node
    Nodes
    Onboard
    Pairing
    Plugins
    Proxy
    QR
    Reset
    Sandbox CLI
    Secrets
    Security
    Sessions
    Setup
    Skills
    Status
    System
    `openclaw tasks`
    TUI
    Uninstall
    Update
    Voicecall
    Webhooks
    Wiki
    Active memory
    Agent runtime
    Agent loop
    Agent runtimes
    Agent workspace
    Gateway architecture
    Channel docking
    Inferred commitments
    Compaction
    Context
    Context engine
    Delegate architecture
    Dreaming
    Experimental features
    Features
    Markdown formatting
    Memory overview
    Builtin memory engine
    Honcho memory
    QMD memory engine
    Memory search
    Messages
    Model failover
    Model providers
    Models CLI
    Multi-agent routing
    OAuth
    OpenClaw App SDK
    Presence
    QA overview
    Matrix QA
    Command queue
    Steering queue
    Retry policy
    Session management
    Session pruning
    Session tools
    SOUL.md personality guide
    Streaming and chunking
    System prompt
    Timezones
    TypeBox
    Typing indicators
    Usage tracking
    Date and time
    Node + tsx crash
    Diagnostics flags
    Authentication
    Background exec and process tool
    Bonjour discovery
    Bridge protocol
    CLI backends
    Configuration — agents
    Configuration — channels
    Configuration — tools and custom providers
    Configuration
    Configuration examples
    Configuration reference
    Diagnostics export
    Discovery and transports
    Doctor
    Gateway lock
    Health checks
    Heartbeat
    Gateway runbook
    Local models
    Gateway logging
    Multiple gateways
    Network model
    OpenAI chat completions
    OpenResponses API
    OpenShell
    OpenTelemetry export
    Gateway-owned pairing
    Prometheus metrics
    Gateway protocol
    Remote access
    Remote gateway setup
    Sandbox vs tool policy vs elevated
    Sandboxing
    Secrets management
    Secrets apply plan contract
    Security audit checks
    Security
    Tailscale
    Tools invoke API
    Troubleshooting
    Trusted proxy auth
    Debugging
    Environment variables
    FAQ
    FAQ: first-run setup
    FAQ: models and auth
    GPT-5.5 / Codex agentic parity
    GPT-5.5 / Codex parity maintainer notes
    Help
    Scripts
    Testing
    Testing: live suites
    General troubleshooting
    OpenClaw
    Ansible
    Azure
    Bun (experimental)
    ClawDock
    Release channels
    DigitalOcean
    Docker
    Docker VM runtime
    exe.dev
    Fly.io
    GCP
    Hetzner
    Hostinger
    Install
    Installer internals
    Kubernetes
    macOS VMs
    Migration guide
    Migrating from Claude
    Migrating from Hermes
    Nix
    Node.js
    Northflank
    Oracle Cloud
    Podman
    Railway
    Raspberry Pi
    Render
    Uninstall
    Updating
    Logging
    Network
    Audio and voice notes
    Camera capture
    Image and media support
    Nodes
    Location command
    Media understanding
    Talk mode
    Node troubleshooting
    Voice wake
    Pi integration architecture
    Pi development workflow
    Android app
    Platforms
    iOS app
    Linux app
    Gateway on macOS
    Canvas
    Gateway lifecycle
    macOS dev setup
    Health checks (macOS)
    Menu bar icon
    macOS logging
    Menu bar
    Peekaboo bridge
    macOS permissions
    Remote control
    macOS signing
    Skills (macOS)
    Voice overlay
    Voice wake (macOS)
    WebChat (macOS)
    macOS IPC
    macOS app
    Windows
    Plugin internals
    Plugin architecture internals
    Building plugins
    Plugin bundles
    Codex Computer Use
    Codex harness
    Community plugins
    Plugin compatibility
    Google Meet plugin
    Plugin hooks
    Plugin manifest
    Memory LanceDB
    Memory wiki
    Message presentation
    Agent harness plugins
    Building channel plugins
    Channel turn kernel
    Plugin entry points
    Plugin SDK migration
    Plugin SDK overview
    Building provider plugins
    Plugin runtime helpers
    Plugin setup and config
    Plugin SDK subpaths
    Plugin testing
    Skill workshop plugin
    Voice call plugin
    Webhooks plugin
    Zalo personal plugin
    OpenProse
    Alibaba Model Studio
    Anthropic
    Arcee AI
    Azure Speech
    Amazon Bedrock
    Amazon Bedrock Mantle
    Chutes
    Claude Max API proxy
    Cloudflare AI gateway
    ComfyUI
    Deepgram
    Deepinfra
    DeepSeek
    ElevenLabs
    Fal
    Fireworks
    GitHub Copilot
    GLM (Zhipu)
    Google (Gemini)
    Gradium
    Groq
    Hugging Face (inference)
    Provider directory
    Inferrs
    Inworld
    Kilocode
    LiteLLM
    LM Studio
    MiniMax
    Mistral
    Model provider quickstart
    Moonshot AI
    NVIDIA
    Ollama
    OpenAI
    OpenCode
    OpenCode Go
    OpenRouter
    Perplexity
    Qianfan
    Qwen
    Runway
    SGLang
    StepFun
    Synthetic
    Tencent Cloud (TokenHub)
    Together AI
    Venice AI
    Vercel AI gateway
    vLLM
    Volcengine (Doubao)
    Vydra
    xAI
    Xiaomi MiMo
    Z.AI
    Default AGENTS.md
    Release policy
    API usage and costs
    Credits
    Device model database
    Full release validation
    Memory configuration reference
    OpenClaw App SDK API design
    Prompt caching
    Rich output protocol
    RPC adapters
    SecretRef credential surface
    Session management deep dive
    AGENTS.md template
    BOOT.md template
    BOOTSTRAP.md template
    HEARTBEAT.md template
    IDENTITY template
    SOUL.md template
    TOOLS.md template
    USER template
    Tests
    Token use and costs
    Transcript hygiene
    Onboarding reference
    Contributing to the threat model
    Threat model (MITRE ATLAS)
    Formal verification (security models)
    Network proxy
    Agent bootstrapping
    Docs directory
    Getting started
    Docs hubs
    OpenClaw lore
    Onboarding (macOS app)
    Onboarding overview
    Personal assistant setup
    Setup
    Showcase
    Onboarding (CLI)
    CLI automation
    CLI setup reference
    ACP agents
    ACP agents — setup
    Agent send
    apply_patch tool
    Brave search
    Browser (OpenClaw-managed)
    Browser control API
    Browser troubleshooting
    Browser login
    WSL2 + Windows + remote Chrome CDP troubleshooting
    BTW side questions
    ClawHub
    Code execution
    Creating skills
    Diffs
    DuckDuckGo search
    Elevated mode
    Exa search
    Exec tool
    Exec approvals
    Exec approvals — advanced
    Firecrawl
    Gemini search
    Grok search
    Image generation
    Tools and plugins
    Kimi search
    LLM task
    Lobster
    Tool-loop detection
    Media overview
    MiniMax search
    Multi-agent sandbox and tools
    Music generation
    Ollama web search
    PDF tool
    Perplexity search
    Plugins
    Reactions
    SearXNG search
    Skills
    Skills config
    Slash commands
    Sub-agents
    Tavily
    Thinking levels
    Tokenjuice
    Trajectory bundles
    Text-to-speech
    Video generation
    Web search
    Web fetch
    Linux server
    Control UI
    Dashboard
    Web
    TUI
    WebChat

    OpenAPI Specs

    openapi
    TaskFlow
    docs/openclaw
    Original Docs

    Real-time Synchronized Documentation

    Last sync: 01/05/2026 07:00:09

    Note: This content is mirrored from docs.openclaw.ai and is subject to their terms and conditions.

    OpenClaw Docs

    v2.4.0 Production

    Last synced: Today, 22:00

    Technical reference for the OpenClaw framework. Real-time synchronization with the official documentation engine.

    Use this file to discover all available pages before exploring further.

    Configuration reference

    Core config reference for

    text
    ~/.openclaw/openclaw.json
    . For a task-oriented overview, see Configuration.

    Covers the main OpenClaw config surfaces and links out when a subsystem has its own deeper reference. Channel- and plugin-owned command catalogs and deep memory/QMD knobs live on their own pages rather than on this one.

    Code truth:

    • text
      openclaw config schema
      prints the live JSON Schema used for validation and Control UI, with bundled/plugin/channel metadata merged in when available
    • text
      config.schema.lookup
      returns one path-scoped schema node for drill-down tooling
    • text
      pnpm config:docs:check
      /
      text
      pnpm config:docs:gen
      validate the config-doc baseline hash against the current schema surface

    Agent lookup path: use the

    text
    gateway
    tool action
    text
    config.schema.lookup
    for exact field-level docs and constraints before edits. Use Configuration for task-oriented guidance and this page for the broader field map, defaults, and links to subsystem references.

    Dedicated deep references:

    • Memory configuration reference for
      text
      agents.defaults.memorySearch.*
      ,
      text
      memory.qmd.*
      ,
      text
      memory.citations
      , and dreaming config under
      text
      plugins.entries.memory-core.config.dreaming
    • Slash commands for the current built-in + bundled command catalog
    • owning channel/plugin pages for channel-specific command surfaces

    Config format is JSON5 (comments + trailing commas allowed). All fields are optional — OpenClaw uses safe defaults when omitted.


    Channels

    Per-channel config keys moved to a dedicated page — see Configuration — channels for

    text
    channels.*
    , including Slack, Discord, Telegram, WhatsApp, Matrix, iMessage, and other bundled channels (auth, access control, multi-account, mention gating).

    Agent defaults, multi-agent, sessions, and messages

    Moved to a dedicated page — see Configuration — agents for:

    • text
      agents.defaults.*
      (workspace, model, thinking, heartbeat, memory, media, skills, sandbox)
    • text
      multiAgent.*
      (multi-agent routing and bindings)
    • text
      session.*
      (session lifecycle, compaction, pruning)
    • text
      messages.*
      (message delivery, TTS, markdown rendering)
    • text
      talk.*
      (Talk mode)
      • text
        talk.speechLocale
        : optional BCP 47 locale id for Talk speech recognition on iOS/macOS
      • text
        talk.silenceTimeoutMs
        : when unset, Talk keeps the platform default pause window before sending the transcript (
        text
        700 ms on macOS and Android, 900 ms on iOS
        )

    Tools and custom providers

    Tool policy, experimental toggles, provider-backed tool config, and custom provider / base-URL setup moved to a dedicated page — see Configuration — tools and custom providers.

    Models

    Provider definitions, model allowlists, and custom provider setup live in Configuration — tools and custom providers. The

    text
    models
    root also owns global model-catalog behavior.

    json5
    { models: { // Optional. Default: true. Requires a Gateway restart when changed. pricing: { enabled: false }, }, }
    • text
      models.mode
      : provider catalog behavior (
      text
      merge
      or
      text
      replace
      ).
    • text
      models.providers
      : custom provider map keyed by provider id.
    • text
      models.pricing.enabled
      : controls the background pricing bootstrap. When
      text
      false
      , Gateway startup skips OpenRouter and LiteLLM pricing-catalog fetches; configured
      text
      models.providers.*.models[].cost
      values still work for local cost estimates.

    MCP

    OpenClaw-managed MCP server definitions live under

    text
    mcp.servers
    and are consumed by embedded Pi and other runtime adapters. The
    text
    openclaw mcp list
    ,
    text
    show
    ,
    text
    set
    , and
    text
    unset
    commands manage this block without connecting to the target server during config edits.

    json5
    { mcp: { // Optional. Default: 600000 ms (10 minutes). Set 0 to disable idle eviction. sessionIdleTtlMs: 600000, servers: { docs: { command: "npx", args: ["-y", "@modelcontextprotocol/server-fetch"], }, remote: { url: "https://example.com/mcp", transport: "streamable-http", // streamable-http | sse headers: { Authorization: "Bearer ${MCP_REMOTE_TOKEN}", }, }, }, }, }
    • text
      mcp.servers
      : named stdio or remote MCP server definitions for runtimes that expose configured MCP tools. Remote entries use
      text
      transport: "streamable-http"
      or
      text
      transport: "sse"
      ;
      text
      type: "http"
      is a CLI-native alias that
      text
      openclaw mcp set
      and
      text
      openclaw doctor --fix
      normalize into the canonical
      text
      transport
      field.
    • text
      mcp.sessionIdleTtlMs
      : idle TTL for session-scoped bundled MCP runtimes. One-shot embedded runs request run-end cleanup; this TTL is the backstop for long-lived sessions and future callers.
    • Changes under
      text
      mcp.*
      hot-apply by disposing cached session MCP runtimes. The next tool discovery/use recreates them from the new config, so removed
      text
      mcp.servers
      entries are reaped immediately instead of waiting for idle TTL.

    See MCP and CLI backends for runtime behavior.

    Skills

    json5
    { skills: { allowBundled: ["gemini", "peekaboo"], load: { extraDirs: ["~/Projects/agent-scripts/skills"], }, install: { preferBrew: true, nodeManager: "npm", // npm | pnpm | yarn | bun }, entries: { "image-lab": { apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // or plaintext string env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" }, }, peekaboo: { enabled: true }, sag: { enabled: false }, }, }, }
    • text
      allowBundled
      : optional allowlist for bundled skills only (managed/workspace skills unaffected).
    • text
      load.extraDirs
      : extra shared skill roots (lowest precedence).
    • text
      install.preferBrew
      : when true, prefer Homebrew installers when
      text
      brew
      is available before falling back to other installer kinds.
    • text
      install.nodeManager
      : node installer preference for
      text
      metadata.openclaw.install
      specs (
      text
      npm
      |
      text
      pnpm
      |
      text
      yarn
      |
      text
      bun
      ).
    • text
      entries.<skillKey>.enabled: false
      disables a skill even if bundled/installed.
    • text
      entries.<skillKey>.apiKey
      : convenience for skills declaring a primary env var (plaintext string or SecretRef object).

    Plugins

    json5
    { plugins: { enabled: true, allow: ["voice-call"], deny: [], load: { paths: ["~/Projects/oss/voice-call-plugin"], }, entries: { "voice-call": { enabled: true, hooks: { allowPromptInjection: false, }, config: { provider: "twilio" }, }, }, }, }
    • Loaded from
      text
      ~/.openclaw/extensions
      ,
      text
      <workspace>/.openclaw/extensions
      , plus
      text
      plugins.load.paths
      .
    • Discovery accepts native OpenClaw plugins plus compatible Codex bundles and Claude bundles, including manifestless Claude default-layout bundles.
    • Config changes require a gateway restart.
    • text
      allow
      : optional allowlist (only listed plugins load).
      text
      deny
      wins.
    • text
      plugins.entries.<id>.apiKey
      : plugin-level API key convenience field (when supported by the plugin).
    • text
      plugins.entries.<id>.env
      : plugin-scoped env var map.
    • text
      plugins.entries.<id>.hooks.allowPromptInjection
      : when
      text
      false
      , core blocks
      text
      before_prompt_build
      and ignores prompt-mutating fields from legacy
      text
      before_agent_start
      , while preserving legacy
      text
      modelOverride
      and
      text
      providerOverride
      . Applies to native plugin hooks and supported bundle-provided hook directories.
    • text
      plugins.entries.<id>.hooks.allowConversationAccess
      : when
      text
      true
      , trusted non-bundled plugins may read raw conversation content from typed hooks such as
      text
      llm_input
      ,
      text
      llm_output
      ,
      text
      before_agent_finalize
      , and
      text
      agent_end
      .
    • text
      plugins.entries.<id>.subagent.allowModelOverride
      : explicitly trust this plugin to request per-run
      text
      provider
      and
      text
      model
      overrides for background subagent runs.
    • text
      plugins.entries.<id>.subagent.allowedModels
      : optional allowlist of canonical
      text
      provider/model
      targets for trusted subagent overrides. Use
      text
      "*"
      only when you intentionally want to allow any model.
    • text
      plugins.entries.<id>.config
      : plugin-defined config object (validated by native OpenClaw plugin schema when available).
    • Channel plugin account/runtime settings live under
      text
      channels.<id>
      and should be described by the owning plugin's manifest
      text
      channelConfigs
      metadata, not by a central OpenClaw option registry.
    • text
      plugins.entries.firecrawl.config.webFetch
      : Firecrawl web-fetch provider settings.
      • text
        apiKey
        : Firecrawl API key (accepts SecretRef). Falls back to
        text
        plugins.entries.firecrawl.config.webSearch.apiKey
        , legacy
        text
        tools.web.fetch.firecrawl.apiKey
        , or
        text
        FIRECRAWL_API_KEY
        env var.
      • text
        baseUrl
        : Firecrawl API base URL (default:
        text
        https://api.firecrawl.dev
        ).
      • text
        onlyMainContent
        : extract only the main content from pages (default:
        text
        true
        ).
      • text
        maxAgeMs
        : maximum cache age in milliseconds (default:
        text
        172800000
        / 2 days).
      • text
        timeoutSeconds
        : scrape request timeout in seconds (default:
        text
        60
        ).
    • text
      plugins.entries.xai.config.xSearch
      : xAI X Search (Grok web search) settings.
      • text
        enabled
        : enable the X Search provider.
      • text
        model
        : Grok model to use for search (e.g.
        text
        "grok-4-1-fast"
        ).
    • text
      plugins.entries.memory-core.config.dreaming
      : memory dreaming settings. See Dreaming for phases and thresholds.
      • text
        enabled
        : master dreaming switch (default
        text
        false
        ).
      • text
        frequency
        : cron cadence for each full dreaming sweep (
        text
        "0 3 * * *"
        by default).
      • text
        model
        : optional Dream Diary subagent model override. Requires
        text
        plugins.entries.memory-core.subagent.allowModelOverride: true
        ; pair with
        text
        allowedModels
        to restrict targets. Model-unavailable errors retry once with the session default model; trust or allowlist failures do not fall back silently.
      • phase policy and thresholds are implementation details (not user-facing config keys).
    • Full memory config lives in Memory configuration reference:
      • text
        agents.defaults.memorySearch.*
      • text
        memory.backend
      • text
        memory.citations
      • text
        memory.qmd.*
      • text
        plugins.entries.memory-core.config.dreaming
    • Enabled Claude bundle plugins can also contribute embedded Pi defaults from
      text
      settings.json
      ; OpenClaw applies those as sanitized agent settings, not as raw OpenClaw config patches.
    • text
      plugins.slots.memory
      : pick the active memory plugin id, or
      text
      "none"
      to disable memory plugins.
    • text
      plugins.slots.contextEngine
      : pick the active context engine plugin id; defaults to
      text
      "legacy"
      unless you install and select another engine.

    See Plugins.


    Browser

    json5
    { browser: { enabled: true, evaluateEnabled: true, defaultProfile: "user", ssrfPolicy: { // dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access // allowPrivateNetwork: true, // legacy alias // hostnameAllowlist: ["*.example.com", "example.com"], // allowedHostnames: ["localhost"], }, tabCleanup: { enabled: true, idleMinutes: 120, maxTabsPerSession: 8, sweepMinutes: 5, }, profiles: { openclaw: { cdpPort: 18800, color: "#FF4500" }, work: { cdpPort: 18801, color: "#0066CC", executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", }, user: { driver: "existing-session", attachOnly: true, color: "#00AA00" }, brave: { driver: "existing-session", attachOnly: true, userDataDir: "~/Library/Application Support/BraveSoftware/Brave-Browser", color: "#FB542B", }, remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" }, }, color: "#FF4500", // headless: false, // noSandbox: false, // extraArgs: [], // executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser", // attachOnly: false, }, }
    • text
      evaluateEnabled: false
      disables
      text
      act:evaluate
      and
      text
      wait --fn
      .
    • text
      tabCleanup
      reclaims tracked primary-agent tabs after idle time or when a session exceeds its cap. Set
      text
      idleMinutes: 0
      or
      text
      maxTabsPerSession: 0
      to disable those individual cleanup modes.
    • text
      ssrfPolicy.dangerouslyAllowPrivateNetwork
      is disabled when unset, so browser navigation stays strict by default.
    • Set
      text
      ssrfPolicy.dangerouslyAllowPrivateNetwork: true
      only when you intentionally trust private-network browser navigation.
    • In strict mode, remote CDP profile endpoints (
      text
      profiles.*.cdpUrl
      ) are subject to the same private-network blocking during reachability/discovery checks.
    • text
      ssrfPolicy.allowPrivateNetwork
      remains supported as a legacy alias.
    • In strict mode, use
      text
      ssrfPolicy.hostnameAllowlist
      and
      text
      ssrfPolicy.allowedHostnames
      for explicit exceptions.
    • Remote profiles are attach-only (start/stop/reset disabled).
    • text
      profiles.*.cdpUrl
      accepts
      text
      http://
      ,
      text
      https://
      ,
      text
      ws://
      , and
      text
      wss://
      . Use HTTP(S) when you want OpenClaw to discover
      text
      /json/version
      ; use WS(S) when your provider gives you a direct DevTools WebSocket URL.
    • text
      remoteCdpTimeoutMs
      and
      text
      remoteCdpHandshakeTimeoutMs
      apply to remote and
      text
      attachOnly
      CDP reachability plus tab-opening requests. Managed loopback profiles keep local CDP defaults.
    • If an externally managed CDP service is reachable through loopback, set that profile's
      text
      attachOnly: true
      ; otherwise OpenClaw treats the loopback port as a local managed browser profile and may report local port ownership errors.
    • text
      existing-session
      profiles use Chrome MCP instead of CDP and can attach on the selected host or through a connected browser node.
    • text
      existing-session
      profiles can set
      text
      userDataDir
      to target a specific Chromium-based browser profile such as Brave or Edge.
    • text
      existing-session
      profiles keep the current Chrome MCP route limits: snapshot/ref-driven actions instead of CSS-selector targeting, one-file upload hooks, no dialog timeout overrides, no
      text
      wait --load networkidle
      , and no
      text
      responsebody
      , PDF export, download interception, or batch actions.
    • Local managed
      text
      openclaw
      profiles auto-assign
      text
      cdpPort
      and
      text
      cdpUrl
      ; only set
      text
      cdpUrl
      explicitly for remote CDP.
    • Local managed profiles can set
      text
      executablePath
      to override the global
      text
      browser.executablePath
      for that profile. Use this to run one profile in Chrome and another in Brave.
    • Local managed profiles use
      text
      browser.localLaunchTimeoutMs
      for Chrome CDP HTTP discovery after process start and
      text
      browser.localCdpReadyTimeoutMs
      for post-launch CDP websocket readiness. Raise them on slower hosts where Chrome starts successfully but readiness checks race startup. Both values must be positive integers up to
      text
      120000
      ms; invalid config values are rejected.
    • Auto-detect order: default browser if Chromium-based → Chrome → Brave → Edge → Chromium → Chrome Canary.
    • text
      browser.executablePath
      and
      text
      browser.profiles.<name>.executablePath
      both accept
      text
      ~
      and
      text
      ~/...
      for your OS home directory before Chromium launch. Per-profile
      text
      userDataDir
      on
      text
      existing-session
      profiles is also tilde-expanded.
    • Control service: loopback only (port derived from
      text
      gateway.port
      , default
      text
      18791
      ).
    • text
      extraArgs
      appends extra launch flags to local Chromium startup (for example
      text
      --disable-gpu
      , window sizing, or debug flags).

    UI

    json5
    { ui: { seamColor: "#FF4500", assistant: { name: "OpenClaw", avatar: "CB", // emoji, short text, image URL, or data URI }, }, }
    • text
      seamColor
      : accent color for native app UI chrome (Talk Mode bubble tint, etc.).
    • text
      assistant
      : Control UI identity override. Falls back to active agent identity.

    Gateway

    json5
    { gateway: { mode: "local", // local | remote port: 18789, bind: "loopback", auth: { mode: "token", // none | token | password | trusted-proxy token: "your-token", // password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD // trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /gateway/trusted-proxy-auth allowTailscale: true, rateLimit: { maxAttempts: 10, windowMs: 60000, lockoutMs: 300000, exemptLoopback: true, }, }, tailscale: { mode: "off", // off | serve | funnel resetOnExit: false, }, controlUi: { enabled: true, basePath: "/openclaw", // root: "dist/control-ui", // embedSandbox: "scripts", // strict | scripts | trusted // allowExternalEmbedUrls: false, // dangerous: allow absolute external http(s) embed URLs // allowedOrigins: ["https://control.example.com"], // required for non-loopback Control UI // dangerouslyAllowHostHeaderOriginFallback: false, // dangerous Host-header origin fallback mode // allowInsecureAuth: false, // dangerouslyDisableDeviceAuth: false, }, remote: { url: "ws://gateway.tailnet:18789", transport: "ssh", // ssh | direct token: "your-token", // password: "your-password", }, trustedProxies: ["10.0.0.1"], // Optional. Default false. allowRealIpFallback: false, nodes: { pairing: { // Optional. Default unset/disabled. autoApproveCidrs: ["192.168.1.0/24", "fd00:1234:5678::/64"], }, allowCommands: ["canvas.navigate"], denyCommands: ["system.run"], }, tools: { // Additional /tools/invoke HTTP denies deny: ["browser"], // Remove tools from the default HTTP deny list allow: ["gateway"], }, push: { apns: { relay: { baseUrl: "https://relay.example.com", timeoutMs: 10000, }, }, }, }, }

    OpenAI-compatible endpoints

    • Chat Completions: disabled by default. Enable with
      text
      gateway.http.endpoints.chatCompletions.enabled: true
      .
    • Responses API:
      text
      gateway.http.endpoints.responses.enabled
      .
    • Responses URL-input hardening:
      • text
        gateway.http.endpoints.responses.maxUrlParts
      • text
        gateway.http.endpoints.responses.files.urlAllowlist
      • text
        gateway.http.endpoints.responses.images.urlAllowlist
        Empty allowlists are treated as unset; use
        text
        gateway.http.endpoints.responses.files.allowUrl=false
        and/or
        text
        gateway.http.endpoints.responses.images.allowUrl=false
        to disable URL fetching.
    • Optional response hardening header:
      • text
        gateway.http.securityHeaders.strictTransportSecurity
        (set only for HTTPS origins you control; see Trusted Proxy Auth)

    Multi-instance isolation

    Run multiple gateways on one host with unique ports and state dirs:

    bash
    OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \ OPENCLAW_STATE_DIR=~/.openclaw-a \ openclaw gateway --port 19001

    Convenience flags:

    text
    --dev
    (uses
    text
    ~/.openclaw-dev
    + port
    text
    19001
    ),
    text
    --profile <name>
    (uses
    text
    ~/.openclaw-<name>
    ).

    See Multiple Gateways.

    text
    gateway.tls

    json5
    { gateway: { tls: { enabled: false, autoGenerate: false, certPath: "/etc/openclaw/tls/server.crt", keyPath: "/etc/openclaw/tls/server.key", caPath: "/etc/openclaw/tls/ca-bundle.crt", }, }, }
    • text
      enabled
      : enables TLS termination at the gateway listener (HTTPS/WSS) (default:
      text
      false
      ).
    • text
      autoGenerate
      : auto-generates a local self-signed cert/key pair when explicit files are not configured; for local/dev use only.
    • text
      certPath
      : filesystem path to the TLS certificate file.
    • text
      keyPath
      : filesystem path to the TLS private key file; keep permission-restricted.
    • text
      caPath
      : optional CA bundle path for client verification or custom trust chains.

    text
    gateway.reload

    json5
    { gateway: { reload: { mode: "hybrid", // off | restart | hot | hybrid debounceMs: 500, deferralTimeoutMs: 300000, }, }, }
    • text
      mode
      : controls how config edits are applied at runtime.
      • text
        "off"
        : ignore live edits; changes require an explicit restart.
      • text
        "restart"
        : always restart the gateway process on config change.
      • text
        "hot"
        : apply changes in-process without restarting.
      • text
        "hybrid"
        (default): try hot reload first; fall back to restart if required.
    • text
      debounceMs
      : debounce window in ms before config changes are applied (non-negative integer).
    • text
      deferralTimeoutMs
      : optional maximum time in ms to wait for in-flight operations before forcing a restart. Omit it to use the default bounded wait (
      text
      300000
      ); set
      text
      0
      to wait indefinitely and log periodic still-pending warnings.

    Hooks

    json5
    { hooks: { enabled: true, token: "shared-secret", path: "/hooks", maxBodyBytes: 262144, defaultSessionKey: "hook:ingress", allowRequestSessionKey: true, allowedSessionKeyPrefixes: ["hook:", "hook:gmail:"], allowedAgentIds: ["hooks", "main"], presets: ["gmail"], transformsDir: "~/.openclaw/hooks/transforms", mappings: [ { match: { path: "gmail" }, action: "agent", agentId: "hooks", wakeMode: "now", name: "Gmail", sessionKey: "hook:gmail:{{messages[0].id}}", messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}", deliver: true, channel: "last", model: "openai/gpt-5.4-mini", }, ], }, }

    Auth:

    text
    Authorization: Bearer <token>
    or
    text
    x-openclaw-token: <token>
    . Query-string hook tokens are rejected.

    Validation and safety notes:

    • text
      hooks.enabled=true
      requires a non-empty
      text
      hooks.token
      .
    • text
      hooks.token
      must be distinct from
      text
      gateway.auth.token
      ; reusing the Gateway token is rejected.
    • text
      hooks.path
      cannot be
      text
      /
      ; use a dedicated subpath such as
      text
      /hooks
      .
    • If
      text
      hooks.allowRequestSessionKey=true
      , constrain
      text
      hooks.allowedSessionKeyPrefixes
      (for example
      text
      ["hook:"]
      ).
    • If a mapping or preset uses a templated
      text
      sessionKey
      , set
      text
      hooks.allowedSessionKeyPrefixes
      and
      text
      hooks.allowRequestSessionKey=true
      . Static mapping keys do not require that opt-in.

    Endpoints:

    • text
      POST /hooks/wake
      →
      text
      { text, mode?: "now"|"next-heartbeat" }
    • text
      POST /hooks/agent
      →
      text
      { message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }
      • text
        sessionKey
        from request payload is accepted only when
        text
        hooks.allowRequestSessionKey=true
        (default:
        text
        false
        ).
    • text
      POST /hooks/<name>
      → resolved via
      text
      hooks.mappings
      • Template-rendered mapping
        text
        sessionKey
        values are treated as externally supplied and also require
        text
        hooks.allowRequestSessionKey=true
        .

    Gmail integration

    • The built-in Gmail preset uses
      text
      sessionKey: "hook:gmail:{{messages[0].id}}"
      .
    • If you keep that per-message routing, set
      text
      hooks.allowRequestSessionKey: true
      and constrain
      text
      hooks.allowedSessionKeyPrefixes
      to match the Gmail namespace, for example
      text
      ["hook:", "hook:gmail:"]
      .
    • If you need
      text
      hooks.allowRequestSessionKey: false
      , override the preset with a static
      text
      sessionKey
      instead of the templated default.
    json5
    { hooks: { gmail: { account: "openclaw@gmail.com", topic: "projects/<project-id>/topics/gog-gmail-watch", subscription: "gog-gmail-watch-push", pushToken: "shared-push-token", hookUrl: "http://127.0.0.1:18789/hooks/gmail", includeBody: true, maxBytes: 20000, renewEveryMinutes: 720, serve: { bind: "127.0.0.1", port: 8788, path: "/" }, tailscale: { mode: "funnel", path: "/gmail-pubsub" }, model: "openrouter/meta-llama/llama-3.3-70b-instruct:free", thinking: "off", }, }, }
    • Gateway auto-starts
      text
      gog gmail watch serve
      on boot when configured. Set
      text
      OPENCLAW_SKIP_GMAIL_WATCHER=1
      to disable.
    • Don't run a separate
      text
      gog gmail watch serve
      alongside the Gateway.

    Canvas host

    json5
    { canvasHost: { root: "~/.openclaw/workspace/canvas", liveReload: true, // enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1 }, }
    • Serves agent-editable HTML/CSS/JS and A2UI over HTTP under the Gateway port:
      • text
        http://<gateway-host>:<gateway.port>/__openclaw__/canvas/
      • text
        http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
    • Local-only: keep
      text
      gateway.bind: "loopback"
      (default).
    • Non-loopback binds: canvas routes require Gateway auth (token/password/trusted-proxy), same as other Gateway HTTP surfaces.
    • Node WebViews typically don't send auth headers; after a node is paired and connected, the Gateway advertises node-scoped capability URLs for canvas/A2UI access.
    • Capability URLs are bound to the active node WS session and expire quickly. IP-based fallback is not used.
    • Injects live-reload client into served HTML.
    • Auto-creates starter
      text
      index.html
      when empty.
    • Also serves A2UI at
      text
      /__openclaw__/a2ui/
      .
    • Changes require a gateway restart.
    • Disable live reload for large directories or
      text
      EMFILE
      errors.

    Discovery

    mDNS (Bonjour)

    json5
    { discovery: { mdns: { mode: "minimal", // minimal | full | off }, }, }
    • text
      minimal
      (default): omit
      text
      cliPath
      +
      text
      sshPort
      from TXT records.
    • text
      full
      : include
      text
      cliPath
      +
      text
      sshPort
      .
    • Hostname defaults to the system hostname when it is a valid DNS label, falling back to
      text
      openclaw
      . Override with
      text
      OPENCLAW_MDNS_HOSTNAME
      .

    Wide-area (DNS-SD)

    json5
    { discovery: { wideArea: { enabled: true }, }, }

    Writes a unicast DNS-SD zone under

    text
    ~/.openclaw/dns/
    . For cross-network discovery, pair with a DNS server (CoreDNS recommended) + Tailscale split DNS.

    Setup:

    text
    openclaw dns setup --apply
    .


    Environment

    text
    env
    (inline env vars)

    json5
    { env: { OPENROUTER_API_KEY: "sk-or-...", vars: { GROQ_API_KEY: "gsk-...", }, shellEnv: { enabled: true, timeoutMs: 15000, }, }, }
    • Inline env vars are only applied if the process env is missing the key.
    • text
      .env
      files: CWD
      text
      .env
      +
      text
      ~/.openclaw/.env
      (neither overrides existing vars).
    • text
      shellEnv
      : imports missing expected keys from your login shell profile.
    • See Environment for full precedence.

    Env var substitution

    Reference env vars in any config string with

    text
    ${VAR_NAME}
    :

    json5
    { gateway: { auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" }, }, }
    • Only uppercase names matched:
      text
      [A-Z_][A-Z0-9_]*
      .
    • Missing/empty vars throw an error at config load.
    • Escape with
      text
      $${VAR}
      for a literal
      text
      ${VAR}
      .
    • Works with
      text
      $include
      .

    Secrets

    Secret refs are additive: plaintext values still work.

    text
    SecretRef

    Use one object shape:

    json5
    { source: "env" | "file" | "exec", provider: "default", id: "..." }

    Validation:

    • text
      provider
      pattern:
      text
      ^[a-z][a-z0-9_-]{0,63}$
    • text
      source: "env"
      id pattern:
      text
      ^[A-Z][A-Z0-9_]{0,127}$
    • text
      source: "file"
      id: absolute JSON pointer (for example
      text
      "/providers/openai/apiKey"
      )
    • text
      source: "exec"
      id pattern:
      text
      ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
    • text
      source: "exec"
      ids must not contain
      text
      .
      or
      text
      ..
      slash-delimited path segments (for example
      text
      a/../b
      is rejected)

    Supported credential surface

    • Canonical matrix: SecretRef Credential Surface
    • text
      secrets apply
      targets supported
      text
      openclaw.json
      credential paths.
    • text
      auth-profiles.json
      refs are included in runtime resolution and audit coverage.

    Secret providers config

    json5
    { secrets: { providers: { default: { source: "env" }, // optional explicit env provider filemain: { source: "file", path: "~/.openclaw/secrets.json", mode: "json", timeoutMs: 5000, }, vault: { source: "exec", command: "/usr/local/bin/openclaw-vault-resolver", passEnv: ["PATH", "VAULT_ADDR"], }, }, defaults: { env: "default", file: "filemain", exec: "vault", }, }, }

    Notes:

    • text
      file
      provider supports
      text
      mode: "json"
      and
      text
      mode: "singleValue"
      (
      text
      id
      must be
      text
      "value"
      in singleValue mode).
    • File and exec provider paths fail closed when Windows ACL verification is unavailable. Set
      text
      allowInsecurePath: true
      only for trusted paths that cannot be verified.
    • text
      exec
      provider requires an absolute
      text
      command
      path and uses protocol payloads on stdin/stdout.
    • By default, symlink command paths are rejected. Set
      text
      allowSymlinkCommand: true
      to allow symlink paths while validating the resolved target path.
    • If
      text
      trustedDirs
      is configured, the trusted-dir check applies to the resolved target path.
    • text
      exec
      child environment is minimal by default; pass required variables explicitly with
      text
      passEnv
      .
    • Secret refs are resolved at activation time into an in-memory snapshot, then request paths read the snapshot only.
    • Active-surface filtering applies during activation: unresolved refs on enabled surfaces fail startup/reload, while inactive surfaces are skipped with diagnostics.

    Auth storage

    json5
    { auth: { profiles: { "anthropic:default": { provider: "anthropic", mode: "api_key" }, "anthropic:work": { provider: "anthropic", mode: "api_key" }, "openai-codex:personal": { provider: "openai-codex", mode: "oauth" }, }, order: { anthropic: ["anthropic:default", "anthropic:work"], "openai-codex": ["openai-codex:personal"], }, }, }
    • Per-agent profiles are stored at
      text
      <agentDir>/auth-profiles.json
      .
    • text
      auth-profiles.json
      supports value-level refs (
      text
      keyRef
      for
      text
      api_key
      ,
      text
      tokenRef
      for
      text
      token
      ) for static credential modes.
    • Legacy flat
      text
      auth-profiles.json
      maps such as
      text
      { "provider": { "apiKey": "..." } }
      are not a runtime format;
      text
      openclaw doctor --fix
      rewrites them to canonical
      text
      provider:default
      API-key profiles with a
      text
      .legacy-flat.*.bak
      backup.
    • OAuth-mode profiles (
      text
      auth.profiles.<id>.mode = "oauth"
      ) do not support SecretRef-backed auth-profile credentials.
    • Static runtime credentials come from in-memory resolved snapshots; legacy static
      text
      auth.json
      entries are scrubbed when discovered.
    • Legacy OAuth imports from
      text
      ~/.openclaw/credentials/oauth.json
      .
    • See OAuth.
    • Secrets runtime behavior and
      text
      audit/configure/apply
      tooling: Secrets Management.

    text
    auth.cooldowns

    json5
    { auth: { cooldowns: { billingBackoffHours: 5, billingBackoffHoursByProvider: { anthropic: 3, openai: 8 }, billingMaxHours: 24, authPermanentBackoffMinutes: 10, authPermanentMaxMinutes: 60, failureWindowHours: 24, overloadedProfileRotations: 1, overloadedBackoffMs: 0, rateLimitedProfileRotations: 1, }, }, }
    • text
      billingBackoffHours
      : base backoff in hours when a profile fails due to true billing/insufficient-credit errors (default:
      text
      5
      ). Explicit billing text can still land here even on
      text
      401
      /
      text
      403
      responses, but provider-specific text matchers stay scoped to the provider that owns them (for example OpenRouter
      text
      Key limit exceeded
      ). Retryable HTTP
      text
      402
      usage-window or organization/workspace spend-limit messages stay in the
      text
      rate_limit
      path instead.
    • text
      billingBackoffHoursByProvider
      : optional per-provider overrides for billing backoff hours.
    • text
      billingMaxHours
      : cap in hours for billing backoff exponential growth (default:
      text
      24
      ).
    • text
      authPermanentBackoffMinutes
      : base backoff in minutes for high-confidence
      text
      auth_permanent
      failures (default:
      text
      10
      ).
    • text
      authPermanentMaxMinutes
      : cap in minutes for
      text
      auth_permanent
      backoff growth (default:
      text
      60
      ).
    • text
      failureWindowHours
      : rolling window in hours used for backoff counters (default:
      text
      24
      ).
    • text
      overloadedProfileRotations
      : maximum same-provider auth-profile rotations for overloaded errors before switching to model fallback (default:
      text
      1
      ). Provider-busy shapes such as
      text
      ModelNotReadyException
      land here.
    • text
      overloadedBackoffMs
      : fixed delay before retrying an overloaded provider/profile rotation (default:
      text
      0
      ).
    • text
      rateLimitedProfileRotations
      : maximum same-provider auth-profile rotations for rate-limit errors before switching to model fallback (default:
      text
      1
      ). That rate-limit bucket includes provider-shaped text such as
      text
      Too many concurrent requests
      ,
      text
      ThrottlingException
      ,
      text
      concurrency limit reached
      ,
      text
      workers_ai ... quota limit exceeded
      , and
      text
      resource exhausted
      .

    Logging

    json5
    { logging: { level: "info", file: "/tmp/openclaw/openclaw.log", consoleLevel: "info", consoleStyle: "pretty", // pretty | compact | json redactSensitive: "tools", // off | tools redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"], }, }
    • Default log file:
      text
      /tmp/openclaw/openclaw-YYYY-MM-DD.log
      .
    • Set
      text
      logging.file
      for a stable path.
    • text
      consoleLevel
      bumps to
      text
      debug
      when
      text
      --verbose
      .
    • text
      maxFileBytes
      : maximum active log file size in bytes before rotation (positive integer; default:
      text
      104857600
      = 100 MB). OpenClaw keeps up to five numbered archives beside the active file.
    • text
      redactSensitive
      /
      text
      redactPatterns
      : best-effort masking for console output, file logs, OTLP log records, and persisted session transcript text.
      text
      redactSensitive: "off"
      only disables this general log/transcript policy; UI/tool/diagnostic safety surfaces still redact secrets before emission.

    Diagnostics

    json5
    { diagnostics: { enabled: true, flags: ["telegram.*"], stuckSessionWarnMs: 30000, otel: { enabled: false, endpoint: "https://otel-collector.example.com:4318", tracesEndpoint: "https://traces.example.com/v1/traces", metricsEndpoint: "https://metrics.example.com/v1/metrics", logsEndpoint: "https://logs.example.com/v1/logs", protocol: "http/protobuf", // http/protobuf | grpc headers: { "x-tenant-id": "my-org" }, serviceName: "openclaw-gateway", traces: true, metrics: true, logs: false, sampleRate: 1.0, flushIntervalMs: 5000, captureContent: { enabled: false, inputMessages: false, outputMessages: false, toolInputs: false, toolOutputs: false, systemPrompt: false, }, }, cacheTrace: { enabled: false, filePath: "~/.openclaw/logs/cache-trace.jsonl", includeMessages: true, includePrompt: true, includeSystem: true, }, }, }
    • text
      enabled
      : master toggle for instrumentation output (default:
      text
      true
      ).
    • text
      flags
      : array of flag strings enabling targeted log output (supports wildcards like
      text
      "telegram.*"
      or
      text
      "*"
      ).
    • text
      stuckSessionWarnMs
      : age threshold in ms for emitting stuck-session warnings while a session remains in processing state.
    • text
      otel.enabled
      : enables the OpenTelemetry export pipeline (default:
      text
      false
      ). For the full configuration, signal catalog, and privacy model, see OpenTelemetry export.
    • text
      otel.endpoint
      : collector URL for OTel export.
    • text
      otel.tracesEndpoint
      /
      text
      otel.metricsEndpoint
      /
      text
      otel.logsEndpoint
      : optional signal-specific OTLP endpoints. When set, they override
      text
      otel.endpoint
      for that signal only.
    • text
      otel.protocol
      :
      text
      "http/protobuf"
      (default) or
      text
      "grpc"
      .
    • text
      otel.headers
      : extra HTTP/gRPC metadata headers sent with OTel export requests.
    • text
      otel.serviceName
      : service name for resource attributes.
    • text
      otel.traces
      /
      text
      otel.metrics
      /
      text
      otel.logs
      : enable trace, metrics, or log export.
    • text
      otel.sampleRate
      : trace sampling rate
      text
      0
      –
      text
      1
      .
    • text
      otel.flushIntervalMs
      : periodic telemetry flush interval in ms.
    • text
      otel.captureContent
      : opt-in raw content capture for OTEL span attributes. Defaults to off. Boolean
      text
      true
      captures non-system message/tool content; the object form lets you enable
      text
      inputMessages
      ,
      text
      outputMessages
      ,
      text
      toolInputs
      ,
      text
      toolOutputs
      , and
      text
      systemPrompt
      explicitly.
    • text
      OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental
      : environment toggle for latest experimental GenAI span provider attributes. By default spans keep the legacy
      text
      gen_ai.system
      attribute for compatibility; GenAI metrics use bounded semantic attributes.
    • text
      OPENCLAW_OTEL_PRELOADED=1
      : environment toggle for hosts that already registered a global OpenTelemetry SDK. OpenClaw then skips plugin-owned SDK startup/shutdown while keeping diagnostic listeners active.
    • text
      OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
      ,
      text
      OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
      , and
      text
      OTEL_EXPORTER_OTLP_LOGS_ENDPOINT
      : signal-specific endpoint env vars used when the matching config key is unset.
    • text
      cacheTrace.enabled
      : log cache trace snapshots for embedded runs (default:
      text
      false
      ).
    • text
      cacheTrace.filePath
      : output path for cache trace JSONL (default:
      text
      $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl
      ).
    • text
      cacheTrace.includeMessages
      /
      text
      includePrompt
      /
      text
      includeSystem
      : control what is included in cache trace output (all default:
      text
      true
      ).

    Update

    json5
    { update: { channel: "stable", // stable | beta | dev checkOnStart: true, auto: { enabled: false, stableDelayHours: 6, stableJitterHours: 12, betaCheckIntervalHours: 1, }, }, }
    • text
      channel
      : release channel for npm/git installs —
      text
      "stable"
      ,
      text
      "beta"
      , or
      text
      "dev"
      .
    • text
      checkOnStart
      : check for npm updates when the gateway starts (default:
      text
      true
      ).
    • text
      auto.enabled
      : enable background auto-update for package installs (default:
      text
      false
      ).
    • text
      auto.stableDelayHours
      : minimum delay in hours before stable-channel auto-apply (default:
      text
      6
      ; max:
      text
      168
      ).
    • text
      auto.stableJitterHours
      : extra stable-channel rollout spread window in hours (default:
      text
      12
      ; max:
      text
      168
      ).
    • text
      auto.betaCheckIntervalHours
      : how often beta-channel checks run in hours (default:
      text
      1
      ; max:
      text
      24
      ).

    ACP

    json5
    { acp: { enabled: true, dispatch: { enabled: true }, backend: "acpx", defaultAgent: "main", allowedAgents: ["main", "ops"], maxConcurrentSessions: 10, stream: { coalesceIdleMs: 50, maxChunkChars: 1000, repeatSuppression: true, deliveryMode: "live", // live | final_only hiddenBoundarySeparator: "paragraph", // none | space | newline | paragraph maxOutputChars: 50000, maxSessionUpdateChars: 500, }, runtime: { ttlMinutes: 30, }, }, }
    • text
      enabled
      : global ACP feature gate (default:
      text
      true
      ; set
      text
      false
      to hide ACP dispatch and spawn affordances).
    • text
      dispatch.enabled
      : independent gate for ACP session turn dispatch (default:
      text
      true
      ). Set
      text
      false
      to keep ACP commands available while blocking execution.
    • text
      backend
      : default ACP runtime backend id (must match a registered ACP runtime plugin). If
      text
      plugins.allow
      is set, include the backend plugin id (for example
      text
      acpx
      ) or the bundled default plugin will not load.
    • text
      defaultAgent
      : fallback ACP target agent id when spawns do not specify an explicit target.
    • text
      allowedAgents
      : allowlist of agent ids permitted for ACP runtime sessions; empty means no additional restriction.
    • text
      maxConcurrentSessions
      : maximum concurrently active ACP sessions.
    • text
      stream.coalesceIdleMs
      : idle flush window in ms for streamed text.
    • text
      stream.maxChunkChars
      : maximum chunk size before splitting streamed block projection.
    • text
      stream.repeatSuppression
      : suppress repeated status/tool lines per turn (default:
      text
      true
      ).
    • text
      stream.deliveryMode
      :
      text
      "live"
      streams incrementally;
      text
      "final_only"
      buffers until turn terminal events.
    • text
      stream.hiddenBoundarySeparator
      : separator before visible text after hidden tool events (default:
      text
      "paragraph"
      ).
    • text
      stream.maxOutputChars
      : maximum assistant output characters projected per ACP turn.
    • text
      stream.maxSessionUpdateChars
      : maximum characters for projected ACP status/update lines.
    • text
      stream.tagVisibility
      : record of tag names to boolean visibility overrides for streamed events.
    • text
      runtime.ttlMinutes
      : idle TTL in minutes for ACP session workers before eligible cleanup.
    • text
      runtime.installCommand
      : optional install command to run when bootstrapping an ACP runtime environment.

    CLI

    json5
    { cli: { banner: { taglineMode: "off", // random | default | off }, }, }
    • text
      cli.banner.taglineMode
      controls banner tagline style:
      • text
        "random"
        (default): rotating funny/seasonal taglines.
      • text
        "default"
        : fixed neutral tagline (
        text
        All your chats, one OpenClaw.
        ).
      • text
        "off"
        : no tagline text (banner title/version still shown).
    • To hide the entire banner (not just taglines), set env
      text
      OPENCLAW_HIDE_BANNER=1
      .

    Wizard

    Metadata written by CLI guided setup flows (

    text
    onboard
    ,
    text
    configure
    ,
    text
    doctor
    ):

    json5
    { wizard: { lastRunAt: "2026-01-01T00:00:00.000Z", lastRunVersion: "2026.1.4", lastRunCommit: "abc1234", lastRunCommand: "configure", lastRunMode: "local", }, }

    Identity

    See

    text
    agents.list
    identity fields under Agent defaults.


    Bridge (legacy, removed)

    Current builds no longer include the TCP bridge. Nodes connect over the Gateway WebSocket.

    text
    bridge.*
    keys are no longer part of the config schema (validation fails until removed;
    text
    openclaw doctor --fix
    can strip unknown keys).


    Cron

    json5
    { cron: { enabled: true, maxConcurrentRuns: 2, // cron dispatch + isolated cron agent-turn execution webhook: "https://example.invalid/legacy", // deprecated fallback for stored notify:true jobs webhookToken: "replace-with-dedicated-token", // optional bearer token for outbound webhook auth sessionRetention: "24h", // duration string or false runLog: { maxBytes: "2mb", // default 2_000_000 bytes keepLines: 2000, // default 2000 }, }, }
    • text
      sessionRetention
      : how long to keep completed isolated cron run sessions before pruning from
      text
      sessions.json
      . Also controls cleanup of archived deleted cron transcripts. Default:
      text
      24h
      ; set
      text
      false
      to disable.
    • text
      runLog.maxBytes
      : max size per run log file (
      text
      cron/runs/<jobId>.jsonl
      ) before pruning. Default:
      text
      2_000_000
      bytes.
    • text
      runLog.keepLines
      : newest lines retained when run-log pruning is triggered. Default:
      text
      2000
      .
    • text
      webhookToken
      : bearer token used for cron webhook POST delivery (
      text
      delivery.mode = "webhook"
      ), if omitted no auth header is sent.
    • text
      webhook
      : deprecated legacy fallback webhook URL (http/https) used only for stored jobs that still have
      text
      notify: true
      .

    text
    cron.retry

    json5
    { cron: { retry: { maxAttempts: 3, backoffMs: [30000, 60000, 300000], retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"], }, }, }
    • text
      maxAttempts
      : maximum retries for one-shot jobs on transient errors (default:
      text
      3
      ; range:
      text
      0
      –
      text
      10
      ).
    • text
      backoffMs
      : array of backoff delays in ms for each retry attempt (default:
      text
      [30000, 60000, 300000]
      ; 1–10 entries).
    • text
      retryOn
      : error types that trigger retries —
      text
      "rate_limit"
      ,
      text
      "overloaded"
      ,
      text
      "network"
      ,
      text
      "timeout"
      ,
      text
      "server_error"
      . Omit to retry all transient types.

    Applies only to one-shot cron jobs. Recurring jobs use separate failure handling.

    text
    cron.failureAlert

    json5
    { cron: { failureAlert: { enabled: false, after: 3, cooldownMs: 3600000, includeSkipped: false, mode: "announce", accountId: "main", }, }, }
    • text
      enabled
      : enable failure alerts for cron jobs (default:
      text
      false
      ).
    • text
      after
      : consecutive failures before an alert fires (positive integer, min:
      text
      1
      ).
    • text
      cooldownMs
      : minimum milliseconds between repeated alerts for the same job (non-negative integer).
    • text
      includeSkipped
      : count consecutive skipped runs toward the alert threshold (default:
      text
      false
      ). Skipped runs are tracked separately and do not affect execution-error backoff.
    • text
      mode
      : delivery mode —
      text
      "announce"
      sends via a channel message;
      text
      "webhook"
      posts to the configured webhook.
    • text
      accountId
      : optional account or channel id to scope alert delivery.

    text
    cron.failureDestination

    json5
    { cron: { failureDestination: { mode: "announce", channel: "last", to: "channel:C1234567890", accountId: "main", }, }, }
    • Default destination for cron failure notifications across all jobs.
    • text
      mode
      :
      text
      "announce"
      or
      text
      "webhook"
      ; defaults to
      text
      "announce"
      when enough target data exists.
    • text
      channel
      : channel override for announce delivery.
      text
      "last"
      reuses the last known delivery channel.
    • text
      to
      : explicit announce target or webhook URL. Required for webhook mode.
    • text
      accountId
      : optional account override for delivery.
    • Per-job
      text
      delivery.failureDestination
      overrides this global default.
    • When neither global nor per-job failure destination is set, jobs that already deliver via
      text
      announce
      fall back to that primary announce target on failure.
    • text
      delivery.failureDestination
      is only supported for
      text
      sessionTarget="isolated"
      jobs unless the job's primary
      text
      delivery.mode
      is
      text
      "webhook"
      .

    See Cron Jobs. Isolated cron executions are tracked as background tasks.


    Media model template variables

    Template placeholders expanded in

    text
    tools.media.models[].args
    :

    VariableDescription
    text
    {{Body}}
    Full inbound message body
    text
    {{RawBody}}
    Raw body (no history/sender wrappers)
    text
    {{BodyStripped}}
    Body with group mentions stripped
    text
    {{From}}
    Sender identifier
    text
    {{To}}
    Destination identifier
    text
    {{MessageSid}}
    Channel message id
    text
    {{SessionId}}
    Current session UUID
    text
    {{IsNewSession}}
    text
    "true"
    when new session created
    text
    {{MediaUrl}}
    Inbound media pseudo-URL
    text
    {{MediaPath}}
    Local media path
    text
    {{MediaType}}
    Media type (image/audio/document/…)
    text
    {{Transcript}}
    Audio transcript
    text
    {{Prompt}}
    Resolved media prompt for CLI entries
    text
    {{MaxChars}}
    Resolved max output chars for CLI entries
    text
    {{ChatType}}
    text
    "direct"
    or
    text
    "group"
    text
    {{GroupSubject}}
    Group subject (best effort)
    text
    {{GroupMembers}}
    Group members preview (best effort)
    text
    {{SenderName}}
    Sender display name (best effort)
    text
    {{SenderE164}}
    Sender phone number (best effort)
    text
    {{Provider}}
    Provider hint (whatsapp, telegram, discord, etc.)

    Config includes (
    text
    $include
    )

    Split config into multiple files:

    json5
    // ~/.openclaw/openclaw.json { gateway: { port: 18789 }, agents: { $include: "./agents.json5" }, broadcast: { $include: ["./clients/mueller.json5", "./clients/schmidt.json5"], }, }

    Merge behavior:

    • Single file: replaces the containing object.
    • Array of files: deep-merged in order (later overrides earlier).
    • Sibling keys: merged after includes (override included values).
    • Nested includes: up to 10 levels deep.
    • Paths: resolved relative to the including file, but must stay inside the top-level config directory (
      text
      dirname
      of
      text
      openclaw.json
      ). Absolute/
      text
      ../
      forms are allowed only when they still resolve inside that boundary.
    • OpenClaw-owned writes that change only one top-level section backed by a single-file include write through to that included file. For example,
      text
      plugins install
      updates
      text
      plugins: { $include: "./plugins.json5" }
      in
      text
      plugins.json5
      and leaves
      text
      openclaw.json
      intact.
    • Root includes, include arrays, and includes with sibling overrides are read-only for OpenClaw-owned writes; those writes fail closed instead of flattening the config.
    • Errors: clear messages for missing files, parse errors, and circular includes.

    Related: Configuration · Configuration Examples · Doctor

    Related

    • Configuration
    • Configuration examples

    © 2024 TaskFlow Mirror

    Powered by TaskFlow Sync Engine