| name | dotcanvas |
| description | Author and edit a Grida `.canvas` board — a `.canvas.json` manifest plus document files (references, generated images, notes) placed on an infinite canvas. Use when working on a `.canvas` bundle or arranging visuals/design work spatially. For a linear deck/presentation, use the `slides` skill instead. |
A .canvas is a Grida design board — a directory bundle, not a single
file. You work it like any other files: with read_file / write_file /
edit_file (no special canvas tool). It is the durable, spatial home for a
piece of work: reference images, generated outputs, and notes, arranged on an
infinite canvas. Prefer a .canvas board for freeform visual/design work; for
a linear deck / presentation / pitch / slideshow, use the slides skill.
Structure
- The bundle is a folder whose name ends in
.canvas (e.g. poster.canvas/).
.canvas.json (the manifest) holds the STRUCTURE: which documents are on the
board, their placement, order, and the editor mode.
- Each document's CONTENT is a separate file (or a URL) referenced by its
src.
- Manifest shape (only
src is required per document):
{
"editor": "board",
"documents": [
{
"src": "https://…/ref.jpg",
"id": "ref1",
"layout": { "x": 0, "y": 0, "w": 480, "h": 320 }
},
{
"src": "outputs/hero.png",
"id": "hero",
"layout": { "x": 520, "y": 0, "w": 768, "h": 512 }
}
]
}
editor: "board" = freeform infinite canvas (placement via layout).
editor: "slides" = linear deck (order) — see the slides skill.
layout is { x, y, w, h, z? } in world space (z = paint order, optional).
A document with no layout is unplaced — the host positions it; set a
layout to place it deliberately.
Working pattern
- To start, make the bundle folder first — a NEW directory whose name ends
in
.canvas (e.g. poster.canvas/); a plain folder, or files loose in the
workspace root, is NOT a board and won't open. Then write_file its
.canvas.json and each document file INSIDE that folder. To add to an existing
board, read_file .canvas.json first (preserve version/$schema/editor
and any unknown fields), then write the FULL updated manifest back.
- A document's
src may be a URL (a pointable reference — a picked library
image, used as-is, no download) OR a file path inside the bundle. Both are
first-class placed documents.
- To place a generated image (or any produced file) on the board:
materialize it into the bundle, then reference it. Copy it from your
scratch dir into the bundle with the shell — e.g.
cp <scratch>/image-….png <board>.canvas/outputs/hero.png — then add a
document whose src is that bundle-relative path. (A src can point at any
file the host can read, but a file inside the bundle is the durable, portable
choice.)
- To move / resize / reorder, edit the
layout (and document order) in the
manifest. The human can also drag pins directly — re-read .canvas.json
before editing so you don't clobber their changes (last write per file wins).