llm-canvas
v0.1.4
Published
An LLM-native local workspace for substantial coding-agent output — agents write structured HTML sections into a project-scoped browser workspace instead of dumping into the chat transcript.
Maintainers
Readme
Canvas
Canvas is an agent skill that gives coding agents a place to put their long-form output other than the chat transcript. Sessions can stay local or be published at an unguessable public URL backed entirely by Cloudflare.
When an agent produces something substantial — codebase research, an architecture explainer, an implementation plan, a comparison of options — it normally dumps hundreds of lines of markdown into the chat. The Canvas skill teaches the agent to route that output into a local browser workspace instead: it writes one HTML file per section, and a live workspace renders them.
What's in this repo
skills/canvas-workspace/— the skill itself: the instructions an agent reads to decide when and how to use Canvas. This is the product.bin/,server/,workspace/— thellm-canvasCLI and the daemon that watches section files and serves the browser workspace. The skill drives these;bun run buildbundles them into the skill so it can be installed standalone.
How it works
The contract is the filesystem. There is no API for the agent to learn:
- The agent writes section files to
.canvas/sessions/<slug>/sections/<id>.html. - The
llm-canvasdaemon watches that folder and serves a browser workspace. - When a file is written or edited, the affected section hot-reloads — no page refresh.
Because sessions are just plain HTML files under .canvas/ in your repo, they
are readable, editable, and committable in any editor. The styled workspace view
needs the daemon running; the files themselves do not.
It is also bidirectional: agents can emit choice and form widgets, users answer them in the browser, and the agent reads the responses back later.
Install
Canvas ships as an npm package that bundles a prebuilt CLI binary for your platform. You do not need Bun installed — the binary embeds its own runtime.
npm i -g llm-canvas
llm-canvas install-skill # symlinks the skill into ~/.claude/skills/canvas-workspace
llm-canvas doctor # verify the setup
llm-canvas login # sign in with GitHub and approve this machinemacOS only — first-run Gatekeeper warning. The binary is not yet Apple-signed, so the first run is blocked by Gatekeeper. Clear the quarantine flag once and you are done:
xattr -dr com.apple.quarantine "$(which llm-canvas)"
Once installed, the agent starts the daemon itself when a session needs it — you do not run it by hand.
From source (contributors)
If you want to hack on Canvas, you'll need Bun:
bun install
bun bin/llm-canvas.ts doctor # run the CLI without installing it
bun run build # produce per-platform binaries under packages/CLI commands
| Command | What it does |
| ----------------------------- | ------------------------------------------------------------- |
| llm-canvas start | Start the daemon for the current project |
| llm-canvas status | Report whether a healthy daemon is serving the current project|
| llm-canvas doctor | Check the environment is set up correctly |
| llm-canvas inbox | Read user feedback left in the workspace |
| llm-canvas login [URL] | Authorize this machine through a browser |
| llm-canvas whoami | Show the active Canvas account |
| llm-canvas logout | Revoke this machine's Canvas session |
| llm-canvas publish --slug S | Upload a session and its assets; print its public URL |
| llm-canvas install-skill | Symlink the canvas-workspace skill into ~/.claude/skills |
| llm-canvas uninstall-skill | Remove the symlink (only if it still points at this install) |
An MCP adapter is planned but not yet implemented. For now the integration is the file-write contract plus the shipped skill.
Public Canvas
Put images and other files in .canvas/sessions/<slug>/assets/ and reference
them from a section as ../assets/<name>. Publish with:
llm-canvas publish --slug <slug>The command uploads HTML and assets to the private llm-canvas R2 bucket and
prints the public share URL. Re-running it updates the same URL. Each canvas is
owned by the GitHub account that approved the CLI login; other signed-in users
cannot update it. The hosted app is https://llm-canvas.our.workers.dev;
bearer credentials stay in the local Canvas config and are never embedded in
published files.
