Web Artifacts Builder
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
Shows HTML content such as games, dashboards, visualizations and demos on a connected Brigade node's canvas, using a local canvas host server and a node bridge.
$ npx skills add spinabot/brigade --skill canvas -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install spinabot/brigade canvas --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/spinabot/brigade.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/canvas .claude/skills/canvas && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "canvas" agent skill from https://github.com/spinabot/brigade/tree/main/skills/canvas into .claude/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/spinabot/brigade/tree/main/skills/canvasType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add spinabot/brigade --skill canvas -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install spinabot/brigade canvas --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spinabot/brigade.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/canvas .agents/skills/canvas && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "canvas" agent skill from https://github.com/spinabot/brigade/tree/main/skills/canvas into .agents/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add spinabot/brigade --skill canvas -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install spinabot/brigade canvas --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spinabot/brigade.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/canvas .cursor/skills/canvas && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "canvas" agent skill from https://github.com/spinabot/brigade/tree/main/skills/canvas into .cursor/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/spinabot/brigade.git --path skills/canvas--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add spinabot/brigade --skill canvas -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install spinabot/brigade canvas --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spinabot/brigade.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/canvas .gemini/skills/canvas && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "canvas" agent skill from https://github.com/spinabot/brigade/tree/main/skills/canvas into .gemini/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install spinabot/brigade canvasInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add spinabot/brigade --skill canvas -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/spinabot/brigade.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/canvas .github/skills/canvas && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "canvas" agent skill from https://github.com/spinabot/brigade/tree/main/skills/canvas into .github/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add spinabot/brigade --skill canvas -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install spinabot/brigade canvas --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spinabot/brigade.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/canvas .opencode/skills/canvas && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "canvas" agent skill from https://github.com/spinabot/brigade/tree/main/skills/canvas into .opencode/skills/canvas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "canvas", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
canvasShows HTML content such as games, dashboards, visualizations and demos on a connected Brigade node's canvas, using a local canvas host server and a node bridge.
With the canvas tool, the agent presents web content on the canvas view of connected Brigade nodes (the Mac app, iOS and Android). A canvas host server serves static HTML, CSS and JavaScript from the configured root directory, a node bridge passes canvas URLs to the nodes, and the node apps render the page in a WebView. The actions are present, hide, navigate, eval for running JavaScript, and snapshot for a screenshot.
Network binding matters. The host binds according to the gateway.bind setting (loopback, lan, tailnet or auto), and when it is bound to a Tailscale interface the nodes receive the Tailscale hostname, which is why localhost URLs fail. Settings live in the Brigade config file, and live reload, on by default, watches the root directory and injects a WebSocket client so connected canvases refresh when files change.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4c2a18f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqcurlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
peters-mac-studio-1.sheep-coho.ts.netFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Canvas Display loads about 1.4k tokens when it runs. Until then it costs about 56 tokens; SKILL.md has 452 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from spinabot/brigade at commit 4c2a18f, republished under its MIT licence (© spinabot). 452 words, ~1,425 tokens.
.claude/skills/canvas/SKILL.md (or your agent's skills folder).Display HTML content on connected Brigade nodes (Mac app, iOS, Android).
The canvas tool lets you present web content on any connected node's canvas view. Great for:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐
│ Canvas Host │────▶│ Node Bridge │────▶│ Node App │
│ (HTTP Server) │ │ (TCP Server) │ │ (Mac/iOS/ │
│ Port 18793 │ │ Port 18790 │ │ Android) │
└─────────────────┘ └──────────────────┘ └─────────────┘canvasHost.root directoryThe canvas host server binds based on gateway.bind setting:
| Bind Mode | Server Binds To | Canvas URL Uses |
|---|---|---|
loopback | 127.0.0.1 | localhost (local only) |
lan | LAN interface | LAN IP address |
tailnet | Tailscale interface | Tailscale hostname |
auto | Best available | Tailscale > LAN > loopback |
Key insight: The canvasHostHostForBridge is derived from bridgeHost. When bound to Tailscale, nodes receive URLs like:
http://<tailscale-hostname>:18793/__brigade__/canvas/<file>.htmlThis is why localhost URLs don't work - the node receives the Tailscale hostname from the bridge!
| Action | Description |
|---|---|
present | Show canvas with optional target URL |
hide | Hide the canvas |
navigate | Navigate to a new URL |
eval | Execute JavaScript in the canvas |
snapshot | Capture screenshot of canvas |
In the active Brigade config file ($BRIGADE_CONFIG_PATH, default ~/.brigade/brigade.json):
{
"canvasHost": {
"enabled": true,
"port": 18793,
"root": "/Users/you/brigade/canvas",
"liveReload": true
},
"gateway": {
"bind": "auto"
}
}When liveReload: true (default), the canvas host:
Great for development!
Place files in the canvas root directory (default ~/brigade/canvas/):
cat > ~/brigade/canvas/my-game.html << 'HTML'
<!DOCTYPE html>
<html>
<head><title>My Game</title></head>
<body>
<h1>Hello Canvas!</h1>
</body>
</html>
HTMLCheck how your gateway is bound:
CONFIG_PATH="${BRIGADE_CONFIG_PATH:-${BRIGADE_STATE_DIR:-$HOME/.brigade}/brigade.json}"
cat "$CONFIG_PATH" | jq '.gateway.bind'Then construct the URL:
http://127.0.0.1:18793/__brigade__/canvas/<file>.htmlhttp://<hostname>:18793/__brigade__/canvas/<file>.htmlFind your Tailscale hostname:
tailscale status --json | jq -r '.Self.DNSName' | sed 's/\.$//'brigade nodes listLook for Mac/iOS/Android nodes with canvas capability.
canvas action:present node:<node-id> target:<full-url>Example:
canvas action:present node:mac-63599bc4-b54d-4392-9048-b97abd58343a target:http://peters-mac-studio-1.sheep-coho.ts.net:18793/__brigade__/canvas/snake.htmlcanvas action:navigate node:<node-id> url:<new-url>
canvas action:snapshot node:<node-id>
canvas action:hide node:<node-id>Cause: URL mismatch between server bind and node expectation.
Debug steps:
CONFIG_PATH="${BRIGADE_CONFIG_PATH:-${BRIGADE_STATE_DIR:-$HOME/.brigade}/brigade.json}"; cat "$CONFIG_PATH" | jq '.gateway.bind'lsof -i :18793curl http://<hostname>:18793/__brigade__/canvas/<file>.htmlSolution: Use the full hostname matching your bind mode, not localhost.
Always specify node:<node-id> parameter.
Node is offline. Use brigade nodes list to find online nodes.
If live reload isn't working:
liveReload: true in configThe canvas host serves from /__brigade__/canvas/ prefix:
http://<host>:18793/__brigade__/canvas/index.html → ~/brigade/canvas/index.html
http://<host>:18793/__brigade__/canvas/games/snake.html → ~/brigade/canvas/games/snake.htmlThe /__brigade__/canvas/ prefix is defined by CANVAS_HOST_PATH constant.
hide it or navigate away© spinabot, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/canvas of spinabot/brigade.
Open the folder on GitHubat commit 4c2a18f
Canvas Display next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Canvas Display this skillspinabot/brigade | 11k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Web Artifacts Builderanthropics/skills | 180k | 41 repos | ~769 | Automated safety check: Pass | Apache-2.0 | |
| LobeHub Interactive Prototypelobehub/lobehub | 83k | — | ~1.6k | Automated safety check: Pass | Custom licence | |
| Paperclip Pagepaperclipai/paperclip | 99k | — | ~1k | Automated safety check: Pass | MIT | |
| Openkb Deck NeonVectifyAI/OpenKB | 4.7k | 1 repos | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| Artifact Designerlatitude-dev/latitude-llm | 4.7k | — | ~1.1k | Automated safety check: Pass | MIT |
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
lobehub/lobehub
Builds single-file interactive HTML prototypes rendered with the real LobeHub UI components and written as production-style React, so they can later be split into files.
paperclipai/paperclip
Publish static HTML pages and asset folders to the Paperclip S3/CloudFront page host.
VectifyAI/OpenKB
A skill your agent uses when the user asks the openkb chat to make a deck / slide presentation / PPT / slides / 演示稿 / 幻灯片 from their compiled KB content AND wants a dark, high-tech, neon / glow /…
latitude-dev/latitude-llm
Create, validate, preview, and publish self-contained HTML artifacts.
webhtv/webhtv
Build, review, debug, reverse-engineer data sources for, and package FongMi/WebHome custom homepage single-file HTML.
spinabot/brigade
Creates and edits Word documents along four paths of rising capability, from a quick tool to the docx library, an OOXML round-trip and pandoc, then verifies the file.
spinabot/brigade
Writes HTML compositions with a GSAP timeline that the render_video tool turns into deterministic MP4 videos from data, text or layouts.
spinabot/brigade
Diagnoses why a Brigade companion app can't pair or connect, by first identifying the real node-to-gateway route and then fixing auth.
spinabot/brigade
Connects an OAuth 2.0 account such as Gmail with the built-in oauth_authorize tool: an authorization link, automatic code capture and sealed token storage.
spinabot/brigade
Creates and edits PDFs in Brigade through four paths: a quick content tool, an edit tool for forms and merging, a pdf-lib script for full control, and HTML-to-PDF for styled layouts.
spinabot/brigade
Explains how a skill folder should be laid out and bundled as a tar archive for sharing, with a checklist covering name, description and eligibility keys.
Categories
Shows HTML content such as games, dashboards, visualizations and demos on a connected Brigade node's canvas, using a local canvas host server and a node bridge. With the canvas tool, the agent presents web content on the canvas view of connected Brigade nodes (the Mac app, iOS and Android). A canvas host server serves static HTML, CSS and JavaScript from the configured root directory, a node bridge passes canvas URLs to the nodes, and the node apps render the page in a WebView.
Canvas Display fits situations like: showing a generated HTML dashboard or visualization on a connected device screen; presenting an interactive demo or small game on a node's canvas; debugging why a canvas URL does not load on a phone using Tailscale or LAN.
Run `npx skills add spinabot/brigade --skill canvas -a claude-code`. Or copy the skill folder (skills/canvas in spinabot/brigade) into .claude/skills/canvas in your project. Claude Code loads it when a task matches its description.
Run `npx skills add spinabot/brigade --skill canvas -a codex`. Or copy the skill folder (skills/canvas in spinabot/brigade) into .agents/skills/canvas in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add spinabot/brigade --skill canvas -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/canvas, .gemini/skills/canvas, .github/skills/canvas and .opencode/skills/canvas in your project.
Going by SKILL.md and its folder, Canvas Display needs the command-line tools its instructions call (jq and curl). Our summary lists: A Brigade setup with a connected node app on Mac, iOS or Android.
SKILL.md names 1 domain. In commands or code: peters-mac-studio-1.sheep-coho.ts.net; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Canvas Display is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.4k tokens (SKILL.md is roughly 5.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Canvas Display: Web Artifacts Builder (anthropics/skills, 180k stars), LobeHub Interactive Prototype (lobehub/lobehub, 83k stars), Paperclip Page (paperclipai/paperclip, 99k stars) and Openkb Deck Neon (VectifyAI/OpenKB, 4.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
spinabot (a GitHub organization) maintains it in spinabot/brigade, which has 11,284 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 3, 2026.
Source: spinabot/brigade on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.