Streaming previews
Matrix reply streaming is opt-in.streaming.mode controls how OpenClaw delivers the in-flight assistant reply; streaming.block.enabled controls whether each completed block is kept as its own Matrix message.
{ mode, chunkMode, block, preview, progress }:
progress.label: custom label,"auto"/unset to pick a configured or built-in label, orfalseto hide it.progress.labels: candidates used only whenlabelis"auto"or unset.progress.maxLines: max rolling progress lines kept in the draft; older lines are trimmed past this.progress.maxLineChars: max characters per compact progress line before truncation.progress.toolProgress: whentrue, live tool/progress activity appears in the draft. The defaultfalsekeeps the draft to its headline, commentary, plan milestones, and approval or failure lines.
streaming.block.enabled (default false) is independent of streaming.mode:
Notes:
- If a preview grows past Matrix’s per-event size limit, OpenClaw stops preview streaming and falls back to final-only delivery.
- Media replies always send attachments normally. If a visible preview cannot be reused safely, OpenClaw keeps it until the complete replacement is confirmed and then redacts it. If replacement delivery fails, is partial, or produces no visible event, the preview remains visible.
- Tool-progress preview updates are on by default when preview streaming is active. Set
streaming.preview.toolProgress: falseto keep preview edits for answer text but leave tool progress on the normal delivery path. - Preview edits cost extra Matrix API calls. Leave
streaming.mode: "off"for the most conservative rate-limit profile. - Legacy scalar/boolean
streamingvalues and the flatblockStreaming/chunkModekeys are rewritten to this nested shape byopenclaw doctor --fix.
Voice messages
Inbound Matrix voice notes are transcribed before the room mention gate, so a voice note saying the bot name can trigger the agent in arequireMention: true room, and the agent gets the transcript instead of only an audio attachment placeholder.
Matrix uses the shared audio media provider under tools.media.audio, such as OpenAI gpt-4o-mini-transcribe. See Media tools overview for provider setup and limits.
m.audioevents andm.fileevents with anaudio/*MIME type are eligible.- In encrypted rooms, OpenClaw decrypts the attachment through the existing Matrix media path before transcription.
- The transcript is marked machine-generated and untrusted in the agent prompt.
- The attachment is marked as already transcribed so downstream media tools do not transcribe it again.
- Set
tools.media.audio.enabled: falseto disable audio transcription globally.
Reactions
Matrix supports outbound reactions, inbound reaction notifications, and ack reactions. Outbound reaction tooling is gated bychannels.matrix.actions.reactions:
reactadds a reaction to a Matrix event.reactionslists the current reaction summary for a Matrix event.emoji-listdiscovers custom emoji from the current conversation’s room packs and your personal pack.emoji=""removes the bot’s own reactions on that event.remove: trueremoves only the specified emoji reaction from the bot.
emoji-list reads MSC2545 im.ponies.room_emotes packs from the authorized current room and im.ponies.user_emotes account data. It returns up to 100 sorted entries such as { "name": "party", "identifier": "party", "url": "mxc://example.org/party" }; sticker-only entries are excluded. Pass identifier to react: it is the plain shortcode stored directly as the Matrix reaction’s m.relates_to.key, not the mxc:// media URL. Custom-reaction rendering depends on the Matrix client, so url is included separately for clients or agents that need the image.
Resolution order (first defined value wins):
reactionNotifications: "own" forwards added m.reaction events when they target bot-authored Matrix messages; "off" disables reaction system events. Reaction removals are not synthesized into system events - Matrix surfaces those as redactions, not as standalone m.reaction removals.