Install
openclaw skills install agent-render-linkingCreate zero-retention agent-render.com links for markdown, code, diffs, CSV, or JSON artifacts. Use when an agent needs to share a nicely rendered artifact i...
openclaw skills install agent-render-linkingCreate browser links for artifacts rendered by agent-render.com.
Agent Render is:
agent-render.comSource repository:
https://github.com/baanish/agent-renderKeep the artifact content in the URL fragment, not in normal query params.
Use this fragment shape:
#agent-render=v1.<codec>.<payload> (plain | lz | deflate)
#agent-render=v1.arx.<dictVersion>.<payload> (arx)
Supported codecs:
plain: base64url-encoded JSON envelopelz: lz-string compressed JSON encoded for URL-safe transportdeflate: deflate-compressed UTF-8 JSON bytes encoded as base64urlarx: domain-dictionary substitution + brotli (quality 11) + base76/base1k/baseBMP encoding (~70% smaller than deflate with baseBMP). Fetch the shared dictionary from https://agent-render.com/arx-dictionary.json to apply substitutions locally before brotli compression. Three encoding tiers: baseBMP (~62k safe BMP code points, ~15.92 bits/char, best density), base1k (1774 Unicode code points U+00A1–U+07FF), and base76 (ASCII fallback). The encoder tries all three and picks the shortest.p: 1) may be used automatically to shorten transport keysPrefer:
arx -> deflate -> lz -> plain unless explicitly overriddenUse this JSON envelope:
{
"v": 1,
"codec": "plain",
"title": "Artifact bundle title",
"activeArtifactId": "artifact-1",
"artifacts": [
{
"id": "artifact-1",
"kind": "markdown",
"title": "Weekly report",
"filename": "weekly-report.md",
"content": "# Report"
}
]
}
{
"id": "report",
"kind": "markdown",
"title": "Weekly report",
"filename": "weekly-report.md",
"content": "# Report\n\n- Item one"
}
{
"id": "code",
"kind": "code",
"title": "viewer-shell.tsx",
"filename": "viewer-shell.tsx",
"language": "tsx",
"content": "export function ViewerShell() {\n return <main />;\n}"
}
Prefer a real unified git patch in patch.
{
"id": "patch",
"kind": "diff",
"title": "viewer-shell.tsx diff",
"filename": "viewer-shell.patch",
"patch": "diff --git a/viewer-shell.tsx b/viewer-shell.tsx\n--- a/viewer-shell.tsx\n+++ b/viewer-shell.tsx\n@@ -1 +1 @@\n-old\n+new\n",
"view": "split"
}
Use view: "unified" or view: "split".
A single patch string may contain multiple diff --git sections.
{
"id": "metrics",
"kind": "csv",
"title": "Metrics snapshot",
"filename": "metrics.csv",
"content": "name,value\nrequests,42"
}
{
"id": "manifest",
"kind": "json",
"title": "Manifest",
"filename": "manifest.json",
"content": "{\n \"ready\": true\n}"
}
Use multiple artifacts when the user should switch between related views.
Example cases:
Set activeArtifactId to the artifact that should open first.
Construct the final URL as:
https://agent-render.com/#agent-render=v1.<codec>.<payload> (plain | lz | deflate)
https://agent-render.com/#agent-render=v1.arx.<dictVersion>.<payload> (arx)
For plain:
v1.plain.For lz:
lz-string URL-safe encodingv1.lz.For deflate:
v1.deflate.The arx codec uses a substitution dictionary to replace common patterns with short byte sequences before brotli compression. The dictionary is served as a static JSON file:
https://agent-render.com/arx-dictionary.jsonhttps://agent-render.com/arx-dictionary.json.br (brotli, ~929 bytes)The dictionary contains two arrays:
singleByteSlots: up to 25 patterns mapped to single control bytes (highest compression value)extendedSlots: additional patterns mapped to two-byte sequences (0x00 prefix + index)To use the dictionary for local arx encoding:
https://agent-render.com/arx-dictionary.jsonv1.arx.<dictVersion>. to form the fragment payload (use the same dictionary version used for substitution)The dictionary includes JSON envelope boilerplate patterns (like ","kind":"Markdown","content":"), JSON-escaped Markdown syntax, programming keywords, and common English words. The viewer loads the same dictionary on startup to reverse substitutions during decode.
If the dictionary fetch fails, fall back to deflate codec.
Respect these limits:
If a link is getting too large:
arx first, then deflate, then lz, then plainWhen the caller provides a strict budget (for example 1,500 chars):
arx/deflate/lz/plain, packed and non-packed)Do not silently truncate content to force fit.
Use platform-specific link text only on surfaces that support it cleanly.
Prefer standard Markdown links:
[Short summary](https://agent-render.com/#agent-render=...)
Examples:
[Weekly report](https://agent-render.com/#agent-render=...)[Config diff](https://agent-render.com/#agent-render=...)[CSV snapshot](https://agent-render.com/#agent-render=...)Prefer HTML links because OpenClaw Telegram outbound text uses parse_mode: "HTML".
<a href="https://agent-render.com/#agent-render=...">Short summary</a>
Prefer Slack mrkdwn link syntax:
<https://agent-render.com/#agent-render=...|Short summary>
For WhatsApp, Signal, iMessage, Google Chat, IRC, LINE, and any other surface without reliable inline link-text formatting, do not force Markdown-style links.
Use:
If a provider later exposes a reliable native linked-text format, use that provider-specific syntax instead of generic Markdown.
When sharing a link:
patch for diffs