Skip to content
Guides

OpenClaw Discord message behaviour

The runtime model and session keys, forwarded snapshots and untrusted metadata, unconfirmed sends, join introductions and their channel choice, reply tags with the batched mode, suppressed link embeds, the opt-in streaming modes and the quiet progress draft, ack reactions and their scope, and outbound mention aliases

7 min read

A Discord bot's behaviour is mostly about what it does around a message: how it acknowledges, whether it threads a reply, whether a link unfurls, whether the draft edits itself while the agent works. OpenClaw makes each of those a setting with a deliberate default. Here is the runtime model, the introduction and reply rules, the streaming modes, and the two small features people ask for most: ack reactions and mention aliases.

Runtime model

  • The gateway owns the Discord connection, reply routing is deterministic with Discord inbound replying back to Discord, bot replies and thread-bound persona replies share Markdown formatting including CommonMark bold and configured table conversion, and both delivery paths reapply caller-supplied character limits after formatting and mention expansion.
  • Forwarded message snapshots reach the agent with their caption but are never treated as a typed command, since command classification uses only the sender's own text; guild and channel metadata enters the model prompt as untrusted context rather than a visible reply prefix, and if a model copies that envelope back OpenClaw strips it from outbound replies and from future replay context.
  • With the default main DM scope direct chats share the agent's main session, guild channels are isolated session keys per channel, group DMs are ignored by default, native slash commands run in isolated command sessions per user while carrying the target session key of the routed conversation, and text-only cron or heartbeat announcements collapse to the final answer sent once while media and component payloads stay multi-message.
  • A send response without a Discord message ID stays unconfirmed: queued delivery records the missing identity for recovery instead of reporting success or immediately sending a duplicate, and the health command with its verbose flag shows the delivery warnings.
Reply routing is deterministic: Discord inbound replies back to Discord.

Introductions, replies, embeds, streaming

When the bot joins an allowed server it posts one room-specific introduction, preferring the server's system channel when it can view and send there and otherwise the first text channel with both permissions, and sending nothing if no channel qualifies; the introduction uses the channel name and topic plus recent messages when available, still works from metadata alone when Read Message History is missing, applies only to newly joined servers, never runs in DMs, and is disabled with the join-intro key or per account. Reply tags target the current message or a specific ID, and the reply mode is off by default, honouring explicit tags only, with first attaching the native reply reference to the first outbound message of the turn, all to every message, and batched only when the inbound event was a debounced batch of several messages, which suits bursty chats; message IDs are surfaced in context so agents can target them, and chunked persona receipts keep the reply target chosen per chunk. Discord generates rich link embeds for URLs, and OpenClaw suppresses them on outbound messages by default so agent-sent URLs stay plain links unless the suppress-embeds key is set to false at the channel, per account or per message, while explicit embed payloads are never suppressed by that setting. Preview streaming is off by default and opts in with partial, block or progress: partial edits one preview message as tokens arrive, block emits draft-sized chunks tuned by the preview chunk settings and clamped to the chunk limit, with an explicit preview mode overriding an inherited block-streaming default and an explicit block flag overriding the preview, and progress keeps one editable status draft until final delivery, quiet by default with the latest preamble as a headline, streamed commentary and reasoning, plan steps, and any approval request or failed command, where ordinary tool calls add no rows; media, error and explicit-reply finals cancel pending edits, the progress tool-progress flag adds the rolling tool log, the commentary flag opts raw commentary into the draft, the line-character budget shortens prose on word boundaries while keeping useful command and path suffixes, the command-text setting shows the tool label or the raw command, the legacy stream-mode key is rewritten by the doctor fix, and streaming is text-only with media falling back to normal delivery.

Acknowledgements and mentions

  • Status reactions keep the acknowledgement stable throughout the work, adding no per-tool emoji, inactivity warning or success flash, while actual failures keep the error reaction lifecycle.
  • The ack reaction resolves from the account, then the channel, then the global setting, then the agent identity emoji with the eyes as the last fallback, accepts Unicode or custom emoji names, is disabled with an empty string, and follows the global scope: all for DMs and groups including ambient events, direct for DMs only, group-all for every group message except ambient events, group-mentions, the default, for mentioned groups and never DMs, and off; DMs and quiet room events get a reaction only when the scope is all.
  • Mention aliases give agents deterministic outbound mentions for known users: keys are handles without the at sign and values are Discord user IDs, settable at the channel and per account, while unknown handles, everyone, here and mentions inside Markdown code spans are left unchanged.

OpenClaw on Discord is the channel post this behaviour belongs to, and OpenClaw Discord components and approvals the rich surfaces that ride on the same delivery path.

Quiet by default

Suppressed embeds, no streaming and a mention-only acknowledgement scope are three defaults that keep a bot from feeling loud in a shared server, and each one is a single key away when a private server wants the opposite. OpenClaw reactions covers the reaction model the acknowledgement uses, and OpenClaw Slack message behaviour the same behaviour on Slack, where progress cards are the default instead.

On Diali

Discord is one of the channels Diali connects from the dashboard, with the runtime config generated and replaced at each release, so the reply, embed and streaming keys here describe what a hosted agent does in your server rather than a file you maintain. Discord on Diali is the channel on Diali and Hosted OpenClaw on Diali the assistant behind it.

  • Replies go back to Discord; forwarded text is never a command.
  • Embeds suppressed, streaming off, batched replies for bursty chats.
  • Mention aliases map handles to IDs; code spans are left alone.
Get started

Stop reading about it, build one

Set up an agent, pick a channel, and have it working inside the app you already keep open.