Default
Hand-drawn outlines, Excalifont, no fill.
An agent draws on a live canvas, then screenshots its own work and fixes what it sees.
A skill, a CLI and an MCP server over one Excalidraw canvas. I read the skill and cheatsheet, ran the test suite, and drove every local CLI command against a private server. Pairing describe with screenshot is what makes this skill powerful.
Agents drawing architecture or flow diagrams users will edit by hand.
An editable .excalidraw (or Obsidian .md) file, plus PNG or SVG.
From SKILL.md.
Pick an interface. Three interfaces drive the same live canvas. Pick the first one that applies:
Plan. Plan your coordinate grid — map out tiers and x-positions before writing JSON.
Check every batch. After each add / apply / batch_create_elements, take a screenshot and check:
Say it out loud. If you find any issue: stop, fix it, re-screenshot, then continue.
No browser for checks. Screenshots and image exports render headless inside the canvas server, so you never need a browser tab to check your own work.
Descriptions are quoted from the cheatsheet. I ran each on a private port, except the two that publish or replace files.
Renders from the earlier review, plus three from this run. Click to enlarge.
Hand-drawn outlines, Excalifont, no fill.
Cleaner, but the lettering is still Excalifont and the arrows still sketch.
The 4-node load-balancer example from SKILL.md L148–159, as given.
Same with a blue fill and no fillStyle: the sketchy hachure pattern.
Solid pastels, roughness 0, helvetica requested; screenshot --dark for the pair.
The styled scene exported to .excalidraw and rendered with render (no server). Labels come out in Helvetica here.
"VPC" label bound to the zone rectangle lands in the middle, under the arrow.
Free-standing text at the top of the zone.
render on REST-shaped JSON (label/start/end) without the server: labels appear, arrows are not routed and sit at 0,0.
The README demo: agent drawing on the live canvas.
Finished demo diagram.
Headless screenshot from the canvas server, 8 elements.
Same scene with --dark.
render on the exported .excalidraw, no server.
Grouped as in the cheatsheet; parameters are shown as listed there.
Run on a copy in /tmp with nice and timeout; the server ran on port 3917 and I stopped it by its own pid.
| Run | Result | Note |
|---|---|---|
| npm test (6 suites) | pass | stdio wire 5/5, local bind, 25 render checks, state, durable state, share URL. |
| CLI session | 16 commands | All behaved as documented. |
| mermaid with no tab | exit 4 | As documented. |
| export to a missing directory | exit 1 | ENOENT; no mkdir. |
Screenshots render in the server with Excalidraw’s own renderer; the agent never needs a browser to see its work.
0 ok, 1 error, 2 usage, 3 canvas unreachable, 4 browser needed. Destructive clear needs --yes (exit 2 otherwise).
stop checks /health identity and only signals its own server.
A path inside a missing folder fails with ENOENT.
Conversion runs in the frontend, so headless agents cannot use it.
add and snapshot report 8 elements; export reports 12, because bound label text becomes separate elements. SKILL.md’s duplicate-text section covers the related auto-sync issue.
share sends an encrypted scene to excalidraw.com unless self-hosted URLs are set. I did not run it.
One canvas, three interfaces. MCP, CLI and REST map 1:1.
Text plus pixels. describe for ids, screenshot for quality.
A written checklist. Seven checks after every batch.
Name the anti-patterns. Zone labels, cross-zone arrows and label spam, each with a fix.
Each quote is compared with its source file at build time; the build fails on any mismatch.