Agent Render Linking
/install agent-render-linking
Agent Render Linking
Create browser links for artifacts rendered by agent-render.com.
Project context
Agent Render is:
- open source
- publicly hosted on Cloudflare Pages at
agent-render.com - self-hostable for people who want their own deployment
- meant to provide a zero-retention browser viewer for agent-shared artifacts
Source repository:
https://github.com/baanish/agent-render
Core rule
Keep the artifact content in the URL fragment, not in normal query params.
Use this fragment shape:
#agent-render=v1.\x3Ccodec>.\x3Cpayload> (plain | lz | deflate)
#agent-render=v1.arx.\x3CdictVersion>.\x3Cpayload> (arx)
Supported codecs:
plain: base64url-encoded JSON envelopelz:lz-stringcompressed 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 fromhttps://agent-render.com/arx-dictionary.jsonto 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.- packed wire mode (
p: 1) may be used automatically to shorten transport keys
Prefer:
- shortest valid fragment for the target surface
- codec priority
arx -> deflate -> lz -> plainunless explicitly overridden - packed wire mode when available
Envelope shape
Use 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"
}
]
}
Supported artifact kinds
Markdown
{
"id": "report",
"kind": "markdown",
"title": "Weekly report",
"filename": "weekly-report.md",
"content": "# Report\
\
- Item one"
}
Code
{
"id": "code",
"kind": "code",
"title": "viewer-shell.tsx",
"filename": "viewer-shell.tsx",
"language": "tsx",
"content": "export function ViewerShell() {\
return \x3Cmain />;\
}"
}
Diff
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\
--- a/viewer-shell.tsx\
+++ b/viewer-shell.tsx\
@@ -1 +1 @@\
-old\
+new\
",
"view": "split"
}
Use view: "unified" or view: "split".
A single patch string may contain multiple diff --git sections.
CSV
{
"id": "metrics",
"kind": "csv",
"title": "Metrics snapshot",
"filename": "metrics.csv",
"content": "name,value\
requests,42"
}
JSON
{
"id": "manifest",
"kind": "json",
"title": "Manifest",
"filename": "manifest.json",
"content": "{\
\"ready\": true\
}"
}
Multi-artifact bundles
Use multiple artifacts when the user should switch between related views.
Example cases:
- summary markdown + patch diff
- report markdown + raw CSV
- config JSON + related code file
Set activeArtifactId to the artifact that should open first.
Link construction
Construct the final URL as:
https://agent-render.com/#agent-render=v1.\x3Ccodec>.\x3Cpayload> (plain | lz | deflate)
https://agent-render.com/#agent-render=v1.arx.\x3CdictVersion>.\x3Cpayload> (arx)
For plain:
- Serialize the envelope as compact JSON
- Base64url-encode it
- Append it after
v1.plain.
For lz:
- Serialize the envelope as compact JSON
- Compress with
lz-stringURL-safe encoding - Append it after
v1.lz.
For deflate:
- Serialize the envelope as compact JSON (or packed wire form)
- Encode JSON to UTF-8 bytes
- Deflate the bytes
- Base64url-encode the compressed bytes
- Append it after
v1.deflate.
Shared arx dictionary
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:
- Endpoint:
https://agent-render.com/arx-dictionary.json - Pre-compressed:
https://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:
- Fetch
https://agent-render.com/arx-dictionary.json - Apply substitutions in order: for each entry, replace all occurrences of the pattern in the serialized JSON envelope with its corresponding control byte(s)
- Brotli-compress the substituted bytes at quality 11
- Encode the compressed bytes using baseBMP (preferred, smallest), base1k (mid-tier), or base76 (ASCII fallback)
- BaseBMP uses ~62k safe BMP code points (U+00A1–U+FFEF, skipping surrogates, combining marks, zero-width chars). Prefix the encoded string with U+FFF0 marker. ~15.92 bits/char
- Base1k uses 1774 Unicode code points (U+00A1–U+07FF, skipping combining diacriticals and soft hyphen). ~10.79 bits/char
- Base76 uses 77 ASCII fragment-safe characters — use this if the target surface cannot handle Unicode in URL fragments. ~6.27 bits/char
- Try all three and pick the shortest
- Prepend
v1.arx.\x3CdictVersion>.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.
Practical limits
Respect these limits:
- target fragment budget: about 8,000 characters
- target decoded payload budget: about 200,000 characters
- strict Discord practical budget for linked text workflows: about 1,500 characters
If a link is getting too large:
- try
arxfirst, thendeflate, thenlz, thenplain - allow packed wire mode
- trim unnecessary prose or metadata
- prefer a focused artifact over a bloated one
- return a structured failure when the payload cannot fit the requested budget
Agent budget mode
When the caller provides a strict budget (for example 1,500 chars):
- encode using all available candidates (
arx/deflate/lz/plain, packed and non-packed) - choose the shortest fragment that is within budget
- if no candidate fits, return the shortest fragment plus a clear budget failure explanation
Do not silently truncate content to force fit.
Formatting links in chat
Use platform-specific link text only on surfaces that support it cleanly.
Discord
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=...)
Telegram
Prefer HTML links because OpenClaw Telegram outbound text uses parse_mode: "HTML".
\x3Ca href="https://agent-render.com/#agent-render=...">Short summary\x3C/a>
Slack
Prefer Slack mrkdwn link syntax:
\x3Chttps://agent-render.com/#agent-render=...|Short summary>
All other OpenClaw chat surfaces
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:
- a short summary line first
- then the raw URL on its own line
If a provider later exposes a reliable native linked-text format, use that provider-specific syntax instead of generic Markdown.
Output style
When sharing a link:
- keep the summary short
- make the artifact title human-readable
- use filenames when they help the viewer
- do not narrate the transport details unless the user asks
Good defaults
- Prefer one strong artifact over many weak ones
- Prefer
patchfor diffs - Prefer readable titles
- Prefer Markdown link text when supported
- Prefer shortest-by-measurement instead of human guesses
- Use budget-aware encoding for Discord-like constraints
Avoid
- Do not put raw artifact content in normal query params
- Do not upload artifact content to a server for this workflow
- Do not dump giant noisy bundles when a focused artifact is enough
- Do not invent unsupported fields unless the renderer has added them
- Do not handcraft packed envelopes manually if helper utilities are available; construct logical envelopes and let transport logic pack automatically
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install agent-render-linking - 安装完成后,直接呼叫该 Skill 的名称或使用
/agent-render-linking触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Agent Render Linking 是什么?
Create 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... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 334 次。
如何安装 Agent Render Linking?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install agent-render-linking」即可一键安装,无需额外配置。
Agent Render Linking 是免费的吗?
是的,Agent Render Linking 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
Agent Render Linking 支持哪些平台?
Agent Render Linking 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Agent Render Linking?
由 Aanish Bhirud(@baanish)开发并维护,当前版本 v1.2.0。