Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Display and control HTML content on connected Mac, iOS, or Android nodes via a web-based canvas with live reload and remote actions.
Display and control HTML content on connected Mac, iOS, or Android nodes via a web-based canvas with live reload and remote actions.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Display HTML content on connected OpenClaw nodes (Mac app, iOS, Android).
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
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ 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.root directory Node Bridge: Communicates canvas URLs to connected nodes Node Apps: Render the content in a WebView
The canvas host server binds based on gateway.bind setting: Bind ModeServer Binds ToCanvas URL Usesloopback127.0.0.1localhost (local only)lanLAN interfaceLAN IP addresstailnetTailscale interfaceTailscale hostnameautoBest availableTailscale > LAN > loopback Key insight: The canvasHostHostForBridge is derived from bridgeHost. When bound to Tailscale, nodes receive URLs like: http://<tailscale-hostname>:18793/__openclaw__/canvas/<file>.html This is why localhost URLs don't work - the node receives the Tailscale hostname from the bridge!
ActionDescriptionpresentShow canvas with optional target URLhideHide the canvasnavigateNavigate to a new URLevalExecute JavaScript in the canvassnapshotCapture screenshot of canvas
In ~/.openclaw/openclaw.json: { "canvasHost": { "enabled": true, "port": 18793, "root": "/Users/you/clawd/canvas", "liveReload": true }, "gateway": { "bind": "auto" } }
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!
Place files in the canvas root directory (default ~/clawd/canvas/): cat > ~/clawd/canvas/my-game.html << 'HTML' <!DOCTYPE html> <html> <head><title>My Game</title></head> <body> <h1>Hello Canvas!</h1> </body> </html> HTML
Check how your gateway is bound: cat ~/.openclaw/openclaw.json | jq '.gateway.bind' Then construct the URL: loopback: http://127.0.0.1:18793/__openclaw__/canvas/<file>.html lan/tailnet/auto: http://<hostname>:18793/__openclaw__/canvas/<file>.html Find your Tailscale hostname: tailscale status --json | jq -r '.Self.DNSName' | sed 's/\.$//'
openclaw nodes list Look 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/__openclaw__/canvas/snake.html
canvas 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: Check server bind: cat ~/.openclaw/openclaw.json | jq '.gateway.bind' Check what port canvas is on: lsof -i :18793 Test URL directly: curl http://<hostname>:18793/__openclaw__/canvas/<file>.html Solution: Use the full hostname matching your bind mode, not localhost.
Always specify node:<node-id> parameter.
Node is offline. Use openclaw nodes list to find online nodes.
If live reload isn't working: Check liveReload: true in config Ensure file is in the canvas root directory Check for watcher errors in logs
The canvas host serves from /__openclaw__/canvas/ prefix: http://<host>:18793/__openclaw__/canvas/index.html โ ~/clawd/canvas/index.html http://<host>:18793/__openclaw__/canvas/games/snake.html โ ~/clawd/canvas/games/snake.html The /__openclaw__/canvas/ prefix is defined by CANVAS_HOST_PATH constant.
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 hide it or navigate away Live reload makes development fast - just save and it updates! A2UI JSON push is WIP - use HTML files for now
Messaging, meetings, inboxes, CRM, and teammate communication surfaces.
Largest current source with strong distribution and engagement signals.