channels.* keys for the community chat channels: Discord, Matrix, and IRC.
Discord
- Token:
channels.discord.token, withDISCORD_BOT_TOKENas fallback for the default account. channels.discord.joinIntrodefaults totrue. When the bot joins an allowed server, it posts one introduction in the system channel when permitted, or the first text channel where it can view and send messages. Recent messages are included only when the bot can read message history. Set this option tofalseto disable introductions, or usechannels.discord.accounts.<accountId>.joinIntrofor an account-specific override. Up to 100 recent messages are read when permitted, once per server; see group join introductions. Introductions never run in direct messages.- Direct outbound calls that provide an explicit Discord
tokenuse that token for the call; account policy settings still come from the selected account in the active runtime snapshot. - Optional
channels.discord.defaultAccountoverrides default account selection when it matches a configured account id. - Use
user:<id>(DM) orchannel:<id>(guild channel) for delivery targets; bare numeric IDs are rejected. actions.reactionscontrolsreact,reactions, andemoji-list; emoji discovery defaults to the current server unlessguildIdis provided.- Guild slugs are lowercase with spaces replaced by
-; channel keys use the slugged name (no#). Prefer guild IDs. - Bot-authored messages are ignored by default.
allowBots: trueenables them; useallowBots: "mentions"to only accept bot messages that mention the bot (own messages still filtered). - Channels that support bot-authored inbound messages can use shared bot loop protection. Set
channels.defaults.botLoopProtectionfor baseline pair budgets, then override the channel or account only when one surface needs different limits. channels.discord.guilds.<id>.ignoreOtherMentions(and channel overrides) drops messages addressed to another identity but not the bot. This covers explicit user/role mentions (excluding @everyone/@here) and replies to another non-webhook bot; an explicit mention of the current bot still wins.channels.discord.mentionAliasesmaps stable outbound@handletext to Discord user IDs before sending, so known teammates can be mentioned deterministically even when the transient directory cache is empty. Per-account overrides live underchannels.discord.accounts.<accountId>.mentionAliases.maxLinesPerMessage(default17) splits tall messages even when under 2000 chars.channels.discord.suppressEmbedsdefaults totrue, so outbound URLs do not expand into Discord link previews unless disabled. Explicitembedspayloads still send normally; per-message tool calls can override withsuppressEmbeds.channels.discord.threadBindingscontrols Discord thread-bound routing:enabled: Discord override for thread-bound session spawning, delivery, and routing; manage bindings with/session unbind,/agents,/session idle, and/session max-ageidleHours: Discord override for inactivity auto-unbind in hours (0disables)maxAgeHours: Discord override for hard max age in hours (0disables)spawnSessions: switch forsessions_spawn({ thread: true })and ACP thread-spawn auto thread creation/binding (default:true)defaultSpawnContext: native subagent context for thread-bound spawns ("fork"by default)
- Top-level
bindings[]entries withtype: "acp"configure persistent ACP bindings for channels and threads (use channel/thread id inmatch.peer.id). Field semantics are shared in ACP Agents. channels.discord.agentComponents.ttlMscontrols how long sent Discord component callbacks remain registered. Default1800000(30 minutes), maximum86400000(24 hours). Per-account overrides live underchannels.discord.accounts.<accountId>.agentComponents.ttlMs. Prefer the shortest TTL that fits the workflow.channels.discord.voiceenables Discord voice channel conversations and optional auto-join + LLM + TTS overrides. Text-only Discord configs leave voice off by default; setchannels.discord.voice.enabled=trueto opt in.channels.discord.voice.autoJoin[].whenOccupiedkeeps an auto-managed voice channel disconnected until a human is present, then leaves when the last human departs. It defaults tofalse; bots do not count as occupants, and manual or ad-hoc voice sessions are not managed by this policy.channels.discord.voice.modeloptionally overrides the LLM model used for Discord voice channel responses.channels.discord.voice.daveEncryption(defaulttrue) andchannels.discord.voice.decryptionFailureTolerance(default24) pass through to@discordjs/voiceDAVE options.channels.discord.voice.connectTimeoutMscontrols the initial@discordjs/voiceReady wait for/vc joinand auto-join attempts (default30000).channels.discord.voice.reconnectGraceMscontrols how long a disconnected voice session may take to enter reconnect signalling before OpenClaw destroys it (default15000).- Discord voice playback is not interrupted by another user’s speaking-start event. To avoid feedback loops, OpenClaw ignores new voice capture while TTS is playing.
- OpenClaw additionally attempts voice receive recovery by leaving/rejoining a voice session after repeated decrypt failures.
channels.discord.streamingis the canonical stream mode key. Discord preview streaming defaults tooff; setstreaming.mode: "progress"to opt into one edited tool/work progress message, or choosepartialorblockfor answer previews. Legacy flat keys (streamMode,chunkMode,blockStreaming,draftChunk,blockStreamingCoalesce) are no longer read at runtime; runopenclaw doctor --fixto migrate persisted config.channels.discord.autoPresencemaps runtime availability to bot presence (healthy => online, degraded => idle, exhausted => dnd) and allows optional status text overrides.channels.discord.guilds.<id>.presenceEventsroutes human availability arrivals into one configured Discord channel as agent system events. Eligible members must be able to viewchannelId; public threads inherit parent visibility, while private threads additionally require membership or Manage Threads.userscan further narrow that audience. It seeds current online members from completeGUILD_CREATEsnapshots, routes observed offline-to-online transitions, and treats a first later online signal for an unseen member as newly available without asserting whether they came online or joined after the snapshot. Guilds above Discord’s 75,000-member snapshot limit require an explicit offline update first. Throttling knobs:reconnectSuppressSeconds(quiet window after a new Gateway session while guild presence state is rebuilt, default 300,0disables) andburstLimit/burstWindowSeconds(per-guild successfully queued event rate limit, default 8 events per 60s sliding window). Resumed sessions do not start the reconnect suppression window. The existing per-user re-greet cooldown remains eight hours. It requireschannels.discord.intents.presence=true, the privileged Presence Intent in Discord’s Developer Portal, and an enabled agent heartbeat.channels.discord.intents.messageContentdefaults totrue. Set it tofalseonly for mention-only operation when Discord cannot grant the privileged Message Content intent; DMs and explicit bot mentions still carry message content, while other guild messages do not. KeeprequireMention: trueon every configured guild channel in this mode.channels.discord.dangerouslyAllowNameMatchingre-enables mutable name/tag matching (break-glass compatibility mode).channels.discord.execApprovals: Discord-native exec approval delivery and approver authorization.enabled:true,false, or"auto". Unset orfalsedisables native delivery. Settrueor"auto"to activate it when approvers resolve fromapproversorcommands.ownerAllowFrom.approvers: Discord user IDs allowed to approve exec requests. Falls back tocommands.ownerAllowFromwhen omitted.agentFilter: optional agent ID allowlist. Omit to forward approvals for all agents.sessionFilter: optional session key patterns (substring or regex).target: where to send approval prompts."dm"(default) sends to approver DMs,"channel"sends to the originating channel,"both"sends to both. When target includes"channel", buttons are only usable by resolved approvers.cleanupAfterResolve: whentrue, deletes approval DMs after approval, denial, or timeout.
off (none), own (bot’s messages, default), all (all messages), allowlist (from guilds.<id>.users on all messages).
Matrix
Matrix is plugin-backed and configured underchannels.matrix.
- Token auth uses
accessToken; password auth usesuserId+password. channels.matrix.proxyroutes Matrix HTTP traffic through an explicit HTTP(S) proxy. Named accounts can override it withchannels.matrix.accounts.<id>.proxy.channels.matrix.network.dangerouslyAllowPrivateNetworkallows private/internal homeservers.proxyand this network opt-in are independent controls.channels.matrix.defaultAccountselects the preferred account in multi-account setups.channels.matrix.autoJoindefaults to"off", so invited rooms and fresh DM-style invites are ignored until you setautoJoin: "allowlist"withautoJoinAllowlistorautoJoin: "always".channels.matrix.joinIntrodefaults totrue. When the bot actually joins an allowed group room, it posts one introduction using the room name, topic, and up to 100 readable recent messages. A failed history read leaves a metadata-only introduction. Set this option tofalseto disable introductions, or usechannels.matrix.accounts.<accountId>.joinIntrofor an account-specific override. Introductions happen once per room; unaccepted invites, startup room snapshots, membership updates that leave the bot joined, and direct rooms do not trigger them. See group join introductions.channels.matrix.execApprovals: Matrix-native exec approval delivery and approver authorization.enabled:true,false, or"auto"(default). In auto mode, exec approvals activate when approvers can be resolved fromapproversorcommands.ownerAllowFrom.approvers: Matrix user IDs (e.g.@owner:example.org) allowed to approve exec requests.agentFilter: optional agent ID allowlist. Omit to forward approvals for all agents.sessionFilter: optional session key patterns (substring or regex).target: where to send approval prompts."dm"(default),"channel"(originating room), or"both".- Per-account overrides:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopecontrols how Matrix DMs group into sessions:per-user(default) shares by routed peer, whileper-roomisolates each DM room.- Matrix status probes and live directory lookups use the same proxy policy as runtime traffic.
- Full Matrix configuration, targeting rules, and setup examples are documented in Matrix.
IRC
IRC is plugin-backed and configured underchannels.irc.
- Core key paths covered here:
channels.irc,channels.irc.dmPolicy,channels.irc.configWrites,channels.irc.nickserv.*. - Optional
channels.irc.defaultAccountoverrides default account selection when it matches a configured account id. - Full IRC channel configuration (host/port/TLS/channels/allowlists/mention gating) is documented in IRC.