Skip to content
Guides

OpenClaw Matrix rich messages and approvals

Structured reply controls with text fallbacks, approval metadata on ordinary events, quiet-preview push rules, and reaction-driven exec approvals

4 min read

Matrix has no native buttons, so OpenClaw attaches structure to ordinary events and lets each client decide what to show. Reply controls, approval prompts and quiet previews all follow the same pattern: readable text for every client, structured content for clients that know the OpenClaw keys. Here are the reply controls, the approval metadata, the push-rule note, and the exec-approval configuration.

Reply controls

  • Buttons and selection lists in agent replies include readable fallback text and structured content under the OpenClaw presentation key; stock clients show the text, aware clients can render the controls, and a reply that contains only controls still produces a room message.
  • For replies with several attachments the first event carries the controls, streamed replies retain them in the finalised edit, and when a table or chart cannot be rendered natively an authored text fallback is preserved.
  • Native approval prompts are normal room messages with OpenClaw-specific content under the approval key, carrying the structured approval id, kind, state, decisions and exec or plugin details for aware clients while stock clients render the body.
  • When a prompt is too long for one event, OpenClaw chunks the visible text and attaches the approval content to the first chunk only, and allow and deny reactions bind to that first event so long prompts keep the same approval target as short ones.
Only resolved approvers can approve or deny.

Quiet previews

The quiet streaming mode notifies recipients only once a block or turn is finalised, which on Matrix depends on a per-user push rule matching the finalised preview marker; the docs keep the full self-hosted recipe on a separate push-rules page, and without it a quiet preview is simply a message that arrives without a notification.

Exec approvals

  • Matrix can act as a native approval client, configured globally or per account: an enabled flag that auto-enables when at least one approver resolves and is only off when set false, an approvers list of Matrix user ids falling back to the DM allow-from list, a target of DM, the default, channel for the originating room or DM, or both, and optional agent and session filters.
  • Exec approvals authorise through the approvers list with the DM allowlist as fallback, while plugin approvals authorise through the DM allowlist only; both kinds share the reaction shortcuts on the primary approval message, a check mark to allow once, a cross to deny, and an infinity sign to allow always when the effective exec policy permits it, plus fallback approve commands with allow-once, allow-always and deny decisions.
  • Channel delivery for exec approvals includes the command text, so channel or both belong only in trusted rooms; everyone who is not a resolved approver is ignored.

OpenClaw on Matrix is the channel post this deepens, and OpenClaw exec approvals the shared exec-approval flow these reactions front.

The same idea on Discord

Discord gets real buttons and modals where Matrix gets structured keys and reactions, but the approval contract underneath is one and the same. OpenClaw Discord components and approvals is the Discord side, and OpenClaw streaming and chunking the block and turn boundaries the quiet mode notifies on.

On Diali

Matrix is on Diali’s connectable list, alongside WhatsApp, Telegram, Discord, Slack, Mattermost, SMS and voice: the homeserver account and the room allowlist are yours, the Gateway is ours. Hosted OpenClaw on Diali is the assistant and Diali security describes the boundary an approval protects on the channels that are connected.

  • Text for every client, structure for the ones that know.
  • Long prompts keep their approval on the first chunk.
  • Check, cross, infinity: once, deny, always.
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.