一键导入
Display HTML content on connected OpenClaw nodes (Mac app, iOS, Android).
npx skills add https://github.com/faberlens/hardened-skills --skill canvas-hardened复制此命令并粘贴到 Claude Code 中以安装该技能
Display HTML content on connected OpenClaw nodes (Mac app, iOS, Android).
npx skills add https://github.com/faberlens/hardened-skills --skill canvas-hardened复制此命令并粘贴到 Claude Code 中以安装该技能
Persistent memory system for AI agents — remember facts, learn from experience, and track entities across sessions.
Assess preliminary risk classification for an AI system against EU AI Act Annex III high-risk categories.
Daily revenue tracking and summarization system.
Automated web task execution service.
Manage Google Calendar events using `gcalcli`. Create, list, and delete calendar events from the CLI.
Query Burp Suite via MCP to extract security findings and proxy data.
| name | canvas-hardened |
| description | Display HTML content on connected OpenClaw nodes (Mac app, iOS, Android). |
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:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐
│ 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/__moltbot__/canvas/<file>.html
This 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 ~/.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:
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:
http://127.0.0.1:18793/__moltbot__/canvas/<file>.htmlhttp://<hostname>:18793/__moltbot__/canvas/<file>.htmlFind 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/__moltbot__/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:
cat ~/.openclaw/openclaw.json | jq '.gateway.bind'lsof -i :18793curl http://<hostname>:18793/__moltbot__/canvas/<file>.htmlSolution: 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:
liveReload: true in configThe canvas host serves from /__moltbot__/canvas/ prefix:
http://<host>:18793/__moltbot__/canvas/index.html → ~/clawd/canvas/index.html
http://<host>:18793/__moltbot__/canvas/games/snake.html → ~/clawd/canvas/games/snake.html
The /__moltbot__/canvas/ prefix is defined by CANVAS_HOST_PATH constant.
hide it or navigate awayConfirm with the user before changing gateway.bind from loopback to lan, tailnet, or auto — this exposes the canvas host HTTP server to the network, allowing other machines to access served content.
Use canvas action:snapshot only for task-relevant verification and never transmit captured screenshots to external services — screenshots of node displays may contain sensitive content and bulk capture without consent constitutes surveillance.
Never pipe output from config reads, network queries (tailscale status), or port scans (lsof) to network-transmitting commands — diagnostic output contains network topology and service details that must not leave the local machine.
Never create HTML that impersonates login pages, OAuth flows, or payment interfaces of legitimate services — presenting credential-harvesting content to connected nodes is a phishing attack against the device user.