briangtn/claude-gfm-render

Claude Code mod,可直接在 Claude 的回覆中呈現 GitHub Flavored Markdown──包括警示、工作清單、刪除線與 Mermaid 圖表,並支援終端機、桌面、VS Code 與行動版介面。
briangtn/claude-gfm-render

claude-gfm-render 是一個 Claude Code 函式掛鉤 mod,會在 AssistantMessage 上掛接 ui.render,將終端機原本會顯示為純文字的 GFM 語法繪製出來。它可以呈現警示(> [!NOTE] [!TIP] [!IMPORTANT] [!WARNING] [!CAUTION])、工作清單(- [ ] / - [x])、刪除線(~~text~~),以及 Mermaid 流程圖、循序圖、狀態圖、類別圖、ER 圖和 xychart 圖。在終端機中,圖表會透過內建的 84 KB ASCII 繪圖器轉換成 Unicode 藝術圖;在桌面、VS Code 與行動版上,則由 node 執行的 renderer/svg.mjs 轉換成符合主題的 SVG。程式碼圍欄與行內程式碼絕不會被重寫,ctrl+o 仍會顯示原始訊息。它也提供 GFM.md,由 SessionStart hook 加入 Claude 的上下文,讓 Claude 自己撰寫 GFM;可以透過 promptHint 選項停用這項行為。這個 mod 建置並測試於 Claude Code 2.1.286 與 2.1.287,採用 MIT 授權條款,不需要建置步驟。可透過 git clone 加上 claude --plugin-dir 安裝,也可以將 CLAUDE_CODE_PLUGIN_DIRS 加入 ~/.claude/settings.json。
請先查看作者 README,確認 marketplace 與外掛名稱;指令可能隨儲存庫結構而變動。
claude plugin marketplace add briangtn/claude-gfm-render claude plugin install gfm-render
Alerts, task lists, strikethrough and Mermaid diagrams, drawn inside Claude Code's replies.
Install · Before / after · What it handles · How it works
</div>Claude writes GitHub Flavored Markdown all day: > [!WARNING] callouts, - [ ] checklists, ```mermaid diagrams. The terminal shows them as raw text. This mod draws them, without touching the message itself (ctrl+o still shows the original).
git clone https://github.com/briangtn/claude-gfm-render.git ~/perso/claude-gfm-render
claude --plugin-dir ~/perso/claude-gfm-render
To load it in every session, terminal and desktop app alike, add it to ~/.claude/settings.json:
{
"env": {
"CLAUDE_CODE_PLUGIN_DIRS": "~/perso/claude-gfm-render"
}
}
[!NOTE] Mods (function hooks) are an early-access API of Claude Code and may change between releases. Built and tested on Claude Code 2.1.286 and 2.1.287. No build step: the mod is plain files, and the folder is watched, so an edit reloads it in the running session.
Drawing GFM is half the job: Claude also has to write it. The mod ships GFM.md, a short note on what the transcript can draw (alerts, task lists, strikethrough, the Mermaid types that render), which a SessionStart hook adds to Claude's context at startup, after /clear and after a compaction. No CLAUDE.md to edit.
To turn it off and keep only the rendering, in ~/.claude/settings.json:
{
"pluginConfigs": {
"gfm-render": { "options": { "promptHint": false } }
}
}
Real claude sessions (100 columns, captured with tmux); before is the same reply without the mod.
Alerts get a little more room, captured in the Claude desktop app (dark theme):
<img src="docs/screenshots/desktop-alerts-dark.png" alt="Alerts in the Claude desktop app">Mermaid becomes a real SVG that follows the light or dark scheme. Below, the mod's own output rendered by Chrome (not a capture of the app):
<picture> <source media="(prefers-color-scheme: dark)" srcset="docs/screenshots/desktop-flow-dark.png"> <img alt="Flowchart SVG" src="docs/screenshots/desktop-flow-light.png"> </picture> <details> <summary><b>Sequence diagram, light and dark</b></summary> <br>| Light | Dark |
| ------------------------------------------------------------------- | ----------------------------------------------------------------- |
|
|
|
| | Markdown | Terminal | Desktop · VS Code · mobile |
| :---: | ----------------------------------------------------------------------------------------- | :-------------: | :------------------------: |
| 💬 | Alerts > [!NOTE] [!TIP] [!IMPORTANT] [!WARNING] [!CAUTION], any markdown inside | ✅ colored box | ✅ colored box |
| ☑️ | Task lists - [ ] / - [x] (also *, +, 1.) | ✅ ☐ / ☑ | ➖ native |
| ~~S~~ | Strikethrough ~~text~~ | ✅ | ➖ native |
| 🔀 | Mermaid flowchart / graph | ✅ Unicode art | ✅ SVG |
| 🧭 | Mermaid sequence, state, class, ER, xychart | ✅ Unicode art | ✅ SVG |
| 🔒 | Code fences and inline code | never rewritten | never rewritten |
| 📝 | Everything else (headings, tables, links, emphasis…) | native | native |
| Case | What you get |
| ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| Mermaid gantt, pie, mindmap, gitGraph, journey, timeline, quadrantChart, sankey, C4… | the code block, as written |
| Mermaid with a syntax error, or wider than the terminal even with tighter spacing | the code block |
| Mermaid on desktop without node on the session's PATH | the Unicode art in a code block |
| Single-line Mermaid (graph TD; A-->B) | may fail to parse: write one statement per line |
| An alert nested in a list item or in another blockquote (> > [!NOTE]) | a plain blockquote |
| A reply still streaming in | the native rendering until the alert or the closing ``` arrives |
| A single reply block over 10,000 characters | the native rendering of that block |
| Footnotes, emoji shortcodes, #123 / @user autolinks, $math$, raw HTML | left to the native renderer |
| Your own messages and tool output | untouched: only Claude's replies are drawn |
Known glitch: in the terminal, an edge label leaving a {decision} node can show a stray ├ (beautiful-mermaid's ASCII layout, visible in the flowchart above).
The mod hooks ui.render on AssistantMessage: every text block of a reply goes through it, gets split into markdown, alert and Mermaid segments, and comes back as a tree the surface draws. A block with nothing to draw goes to the native renderer untouched.
graph LR
A[Reply block] --> B{GFM inside?}
B -->|no| N[Native renderer]
B -->|alert| C[Colored box]
B -->|mermaid| D{Surface}
D -->|terminal| E[Unicode art, in process]
D -->|desktop| F[SVG via node]
Mermaid is rendered by beautiful-mermaid, split in two because a hooks module may not import a file over 1 MiB and has no eval, while the ELK layout engine the SVG needs weighs 1.6 MB:
hooks/vendor/mermaid-ascii.js, the ASCII renderer alone (84 KB), imported by the mod.renderer/svg.mjs run by node, once per diagram, then cached.npm test # claude plugin test .
npm run validate # claude plugin validate .
npm run build:vendor # rebuild both Mermaid bundles with bun
| File | Role |
| -------------------- | ----------------------------------------------------------------------------------------- |
| hooks/register.tsx | the ui.render hook and the SVG process call |
| hooks/gfm.ts | splits a reply into blocks; task-list and strikethrough rewrites |
| hooks/mermaid.ts | Unicode art sized to the terminal, SVG theming |
| hooks/gfm.test.tsx | tests, run on every surface |
| renderer/svg.mjs | Mermaid on stdin, SVG on stdout |
| GFM.md | what Claude is told it can write, loaded by the SessionStart hook in hooks/hooks.json |
Issues and PRs welcome, especially screenshots from other terminals and the desktop app's light theme.
MIT. Vendored bundles keep their own licenses: beautiful-mermaid (MIT) and elkjs (EPL-2.0), in renderer/.