Canvas Skill
Skill38 starsChanged 5 months agoMITView on GitHub
Present interactive HTML, visualizations, dashboards, and generated interfaces on connected Cybara nodes.
In this repository76 other files it gives its agents.
- AGENTS.mdAGENTS.md
- templates/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- 1passwordSkill
- adversarial-ux-testSkill
- api-debugSkill
- apple-notesSkill
- apple-remindersSkill
- authorized-web-pentestSkill
- bear-notesSkill
- birdSkill
- blogwatcherSkill
- blucliSkill
- bluebubblesSkill
- camsnapSkill
- clawdhubSkill
- cloudflare-temporary-deploySkill
- code-reviewSkill
- code-wikiSkill
- coding-agentSkill
- comfyuiSkill
- diagram-makerSkill
- discordSkill
- docker-managementSkill
- domain-intelSkill
- eightctlSkill
- excalidrawSkill
- fal.aiSkill
- fastmcpSkill
- food-orderSkill
- geminiSkill
- gifgrepSkill
- githubSkill
- gogSkill
- goplacesSkill
- himalayaSkill
- imsgSkill
- local-placesSkill
- mactopSkill
- manim-videoSkill
- mcporterSkill
- model-usageSkill
- nano-banana-proSkill
- nano-pdfSkill
- notionSkill
- obsidianSkill
- openai-image-genSkill
- openai-whisper-apiSkill
- openai-whisperSkill
- openhueSkill
- oracleSkill
- ordercliSkill
- oss-forensicsSkill
- peekabooSkill
- phoneSkill
- planSkill
- sagSkill
- session-logsSkill
- sherpa-onnx-ttsSkill
- skill-creatorSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
15 rules. About 0 are common, 6 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 81
When liveReload: true (default), the canvas host:
- Very specific: line 92
Place files in the canvas root directory (default ~/cybara/canvas/):
- Distinctive: line 108
Check how your gateway is bound:
- Very specific: line 128
Look for Mac/iOS/Android nodes with canvas capability.
- Very specific: line 156
Check server bind: cat ~/.cybara/config.json | jq '.gateway.bind'
- Very specific: line 157
Check what port canvas is on: lsof -i :18793
- Very specific: line 158
Test URL directly: curl http://<hostname>:18793/__cybara__/canvas/<file>.html
- Distinctive: line 160
Solution: Use the full hostname matching your bind mode, not localhost.
- Very specific: line 164
Always specify node:<node-id> parameter.
- Distinctive: line 172
If live reload isn't working:
- Very specific: line 173
Check liveReload: true in config
- Distinctive: line 174
Ensure file is in the canvas root directory
- Distinctive: line 175
Check for watcher errors in logs
- Distinctive: line 190
Keep HTML self-contained (inline CSS/JS) for best results
- Very specific: line 191
Use the default index.html as a test page (has bridge diagnostics)
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Canvas Skill
Display HTML content on connected Cybara nodes (Mac app, iOS, Android).
Overview
The canvas tool lets you present web content on any connected node's canvas view. Great for:
- Displaying games, visualizations, dashboards
- Showing generated HTML content
- Interactive demos
How It Works
Architecture
┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐
│ Canvas Host │────▶│ Node Bridge │────▶│ Node App │
│ (HTTP Server) │ │ (TCP Server) │ │ (Mac/iOS/ │
│ Port 18793 │ │ Port 18790 │ │ Android) │
└─────────────────┘ └──────────────────┘ └─────────────┘- Canvas Host Server: Serves static HTML/CSS/JS files from
canvasHost.rootdirectory - Node Bridge: Communicates canvas URLs to connected nodes
- Node Apps: Render the content in a WebView
Tailscale Integration
The 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/__cybara__/canvas/<file>.htmlThis is why localhost URLs don't work - the node receives the Tailscale hostname from the bridge!
Actions
| 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 |
Configuration
In ~/.cybara/config.json:
{
"canvasHost": {
"enabled": true,
"port": 18793,
"root": "~/cybara/canvas",
"liveReload": true
},
"gateway": {
"bind": "auto"
}
}Live Reload
When liveReload: true (default), the canvas host:
- Watches the root directory for changes (via chokidar)
- Injects a WebSocket client into HTML files
- Automatically reloads connected canvases when files change
Great for development!
Workflow
1. Create HTML content
Place files in the canvas root directory (default ~/cybara/canvas/):
cat > ~/cybara/canvas/my-game.html << 'HTML'
<!DOCTYPE html>
<html>
<head><title>My Game</title></head>
<body>
<h1>Hello Canvas!</h1>
</body>
</html>
HTML2. Find your canvas host URL
Check how your gateway is bound:
cat ~/.cybara/config.json | jq '.gateway.bind'Then construct the URL:
- loopback:
http://127.0.0.1:18793/__cybara__/canvas/<file>.html - lan/tailnet/auto:
http://<hostname>:18793/__cybara__/canvas/<file>.html
Find your Tailscale hostname:
tailscale status --json | jq -r '.Self.DNSName' | sed 's/\.$//'3. Find connected nodes
cybara nodes listLook for Mac/iOS/Android nodes with canvas capability.
4. Present content
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/__cybara__/canvas/snake.html5. Navigate, snapshot, or hide
canvas action:navigate node:<node-id> url:<new-url>
canvas action:snapshot node:<node-id>
canvas action:hide node:<node-id>Debugging
White screen / content not loading
Cause: URL mismatch between server bind and node expectation.
Debug steps:
- Check server bind:
cat ~/.cybara/config.json | jq '.gateway.bind' - Check what port canvas is on:
lsof -i :18793 - Test URL directly:
curl http://<hostname>:18793/__cybara__/canvas/<file>.html
Solution: Use the full hostname matching your bind mode, not localhost.
"node required" error
Always specify node:<node-id> parameter.
"node not connected" error
Node is offline. Use cybara nodes list to find online nodes.
Content not updating
If live reload isn't working:
- Check
liveReload: truein config - Ensure file is in the canvas root directory
- Check for watcher errors in logs
URL Path Structure
The canvas host serves from /__cybara__/canvas/ prefix:
http://<host>:18793/__cybara__/canvas/index.html → ~/cybara/canvas/index.html
http://<host>:18793/__cybara__/canvas/games/snake.html → ~/cybara/canvas/games/snake.htmlThe /__cybara__/canvas/ prefix is defined by CANVAS_HOST_PATH constant.
Tips
- Keep HTML self-contained (inline CSS/JS) for best results
- Use the default index.html as a test page (has bridge diagnostics)
- The canvas persists until you
hideit or navigate away - Live reload makes development fast - just save and it updates!
- A2UI JSON push is WIP - use HTML files for now
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

