- Structured
mediaUrl/mediaUrlsfields for attachment delivery. [[audio_as_voice]]for audio presentation hints.[[reply_to_current]]/[[reply_to:<id>]]for reply metadata.[embed ...]for Control UI rich rendering.
[[...]] tags are delivery metadata. [embed ...] is the separate web-only rich-render path; it is not a media alias.
Media attachments
Remote attachments must be publichttps: URLs. http:, loopback, link-local, private, and internal hostnames are rejected as attachment directives; server-side media fetchers apply their own network guards on top.
Local attachments accept absolute paths, workspace-relative paths, or home-relative ~/ paths. They still pass the agent file-read policy and media type checks before delivery.
Plain Markdown image syntax () stays text by default. Channels that want Markdown images treated as media replies opt in at their outbound adapter; Telegram does this so  becomes a media attachment.
When block streaming is enabled, media must ride on structured payload fields. If the same media URL appears in a streamed block and again in the final assistant payload, OpenClaw delivers it once and strips the duplicate from the final payload.
[embed ...]
[embed ...] is the only agent-facing rich-render syntax for the Control UI. Self-closing example:
[view ...]is no longer valid for new output.- Embed shortcodes render only in the assistant message surface.
- Only URL-backed embeds render; use
ref="..."orurl="...". - Block-form inline HTML embed shortcodes do not render.
- The web UI strips the shortcode from visible text and renders the embed inline.
Stored rendering shape
The normalized/stored assistant content block is a structuredcanvas item:
present_view is not recognized; stored/rendered rich blocks always use this canvas shape.