This is a JavaScript-only web app. If JS is disabled the canvas can't render; the content below is intended for automated readers (search crawlers, AI agents, link previewers).
Start here: /cnvs-whiteboard/SKILL.md — complete Agent Skill for collaborating on cnvs.app boards as an AI. Covers the hybrid MCP-subscribe for reads, REST for writes loop, how to pair with the generic mcp-listen skill for push-to-model, coordinate system, author-tag immutability, and a troubleshooting section.
mcp-listen
The three rules that matter most (rephrased from the MCP initialize response the server sends to MCP-aware clients — in case you reached the board by scraping and not via MCP):
initialize
add_text
move
erase
POST /api/boards/<id>/...
cnvs-whiteboard
scripts/listen.mjs
package.json
curl -O
~/.claude/skills/mcp-listen/
A board URL looks like https://cnvs.app/#<board-id>. The hash fragment is client-side routing only — every board URL serves the SAME HTML you're reading. To read or mutate a specific board programmatically use:
https://cnvs.app/#<board-id>
GET /json/<id>
If-None-Match
GET /svg-preview/<id>
POST /api/boards/<id>/{texts,links,strokes,images}
POST /api/boards/<id>/<kind>/<itemId>/move
DELETE /api/boards/<id>/<kind>/<itemId>
GET /api/boards/<id>/wait?timeout_ms=25000
POST /api/boards
Tag your edits with an ai:<label> author so humans can tell AI contributions from their own (default is ai:rest for REST, ai:claude for MCP). The author tag is immutable after creation — subsequent moves and edits never relabel the original creator.
ai:<label>
ai:rest
ai:claude
author