Agent skill
canvas-populate
Add content to existing Obsidian Canvas files. Supports all node types: images (with auto aspect ratio detection), text cards, PDFs, wiki notes, web links, Mermaid diagrams, SVGs, GIFs, AI-generated images via banana. Also adds zones (groups), edges between nodes, and imports recent banana images. Triggers on: canvas add, add to canvas, put on canvas, canvas zone, canvas connect, canvas from banana, add image to canvas, add text to canvas.
Install this agent skill to your Project
npx add-skill https://github.com/AgriciDaniel/claude-canvas/tree/main/skills/canvas-populate
SKILL.md
canvas-populate: Add Content to Canvases
Read ../canvas/references/canvas-spec.md for the full JSON format before any edit.
Read ../canvas/references/performance-guide.md for node limits and constraints.
General Workflow
For every add operation:
- Read the target canvas JSON. Parse
nodesandedgesarrays. - Collect existing IDs to prevent collisions.
- Generate a new ID:
[type]-[slug]-[unix-timestamp]. - Calculate position using the auto-positioning algorithm (see canvas orchestrator).
- Spacing check: Verify the calculated position has at least 80px horizontal and 60px vertical gap from ALL existing content nodes. If not, shift the position until spacing is clear.
- Append the new node to the
nodesarray (after any groups — z-index ordering). - Validate: Run
python3 scripts/canvas_validate.py <path>— check for overlaps and node count. - Write the updated canvas JSON.
- Report: "Added [description] to [zone] zone at position ([x], [y])."
Node Operations
add image (/canvas add image [path or url])
Resolve the image:
- If URL (starts with
http): download withcurl -sL [url] -o [media_dir]/[filename]. Derive filename from URL path, or useimg-[timestamp].jpgif unclear. - If local path outside canvas dir:
cp [path] [media_dir]/ - If already canvas-relative: use as-is.
Detect aspect ratio:
python3 -c "from PIL import Image; img=Image.open('[path]'); print(img.width, img.height)"
# or fallback
identify -format '%w %h' [path]
Map to the sizing table in ../canvas/references/canvas-spec.md (7 ratios + PDF + fallback).
Create file node with calculated dimensions. Position using auto-layout.
add text (/canvas add text [content])
{
"id": "text-[slug]-[timestamp]",
"type": "text",
"text": "[content]",
"x": 0, "y": 0,
"width": 300, "height": 120
}
For multi-line content, estimate height: count newlines, multiply by 24, add 40px padding. Minimum 120px.
add pdf (/canvas add pdf [path])
Copy to [media_dir]/ if outside canvas dir. Fixed size: width=400, height=520.
add note (/canvas add note [wiki-page])
- Search for a file matching the page name (case-insensitive, partial match).
- Use
"type": "file"with vault-relative path. Not"type": "link"— that's for URLs only. - Default size: width=300, height=100.
add link (/canvas add link [url])
{
"id": "link-[slug]-[timestamp]",
"type": "link",
"url": "[url]",
"x": 0, "y": 0,
"width": 400, "height": 120
}
Obsidian fetches Open Graph preview automatically.
add mermaid (/canvas add mermaid [code])
Mermaid renders natively in Obsidian text nodes. Wrap in a fenced code block:
{
"id": "text-mermaid-[timestamp]",
"type": "text",
"text": "```mermaid\n[code]\n```",
"x": 0, "y": 0,
"width": 500, "height": 400,
"color": "5"
}
Wider text nodes work better for Mermaid (min 400px wide, 300px tall).
add svg (/canvas add svg [description or path])
- If path: copy SVG to media dir, add as file node. Width=400, height based on viewBox aspect ratio.
- If description: delegate to
/svgskill to generate, then add the output file. - SVGs render as
<img>— no interactivity. Must haveviewBoxattribute.
add gif (/canvas add gif [description or path])
- If path: copy GIF to media dir, add as file node.
- If description: delegate to
/claude-gif-generateskill, then add the output. - Performance limit: max 3 GIFs per canvas, max 480px width. Warn if exceeded.
add banana (/canvas add banana [prompt])
- Check if banana skill is available. If not: "Install the banana skill for AI image generation."
- Delegate to banana skill with the prompt.
- Wait for image generation.
- Add the generated image as a file node (detect aspect ratio, auto-size).
- Log the path to
.recent-images.txtin the canvas directory.
Zone Operations
zone (/canvas zone [name] [color])
- Read canvas JSON.
- Find max_y of all existing nodes. Use
-80if canvas is empty (consistent with starter canvas layout where title is at y=-300 and default zone at y=-140):pythonif not canvas_nodes: max_y = -80 else: max_y = max(n["y"] + n.get("height", 0) for n in canvas_nodes) + 60 - Create group node:
{
"id": "zone-[slug]-[timestamp]",
"type": "group",
"label": "[name]",
"x": -400,
"y": "[max_y]",
"width": 1000,
"height": 400,
"color": "[color or '4']"
}
Valid colors: "1"=red "2"=orange "3"=yellow "4"=green "5"=cyan "6"=purple
- Insert the group node BEFORE content nodes in the array (z-index: groups render behind).
- Write and report.
Edge Operations
connect (/canvas connect [from] [to] [label])
- Read canvas JSON.
- Find
fromandtonodes by ID, label text, or partial match. - If ambiguous, list matches and ask the user to clarify.
- Create edge:
{
"id": "e-[from-slug]-[to-slug]-[timestamp]",
"fromNode": "[from-id]",
"toNode": "[to-id]",
"toEnd": "arrow"
}
- Omit
fromSide/toSidefor auto-routing (better results). - Add optional
labelif provided. - Write and report.
Banana Import
from banana (/canvas from banana)
- Check
[canvas_dir]/.recent-images.txtfor recently logged image paths. - If not found or empty: search for images modified in the last 10 minutes:
bash
find [media_dir] -name "*.png" -o -name "*.jpg" -newer /tmp/ten-min-ago - If still none: show the 5 most recently modified images.
- Present list: "Found N recent images. Add to canvas? Which zone?"
- On confirmation: add each using the add image logic.
Media Directory
- Vault mode:
_attachments/images/canvas/ - Standalone mode:
.canvases/assets/ - Create if it doesn't exist.
- All file node paths must be relative to the vault/project root.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
canvas-create
Create new Obsidian Canvas files — blank with a starter structure, or from one of 12 template archetypes (presentation, flowchart, mind-map, gallery, dashboard, storyboard, knowledge-graph, mood-board, timeline, comparison, kanban, project-brief). Handles directory creation, slug generation, and starter zone setup. Triggers on: canvas create, create canvas, new canvas, canvas new, start canvas.
canvas
AI-orchestrated visual production for Obsidian Canvas. Create presentations, flowcharts, mood boards, knowledge graphs, galleries, storyboards, timelines, dashboards, and more with intelligent layout and AI-generated content. Claude acts as Creative Director — dispatching sub-agents for image generation, SVG diagrams, GIF creation, and spatial layout. Supports 12 template archetypes, 6 layout algorithms, and Advanced Canvas presentation mode. Triggers on: /canvas, create canvas, build canvas, make a presentation, visual board, mood board, flowchart canvas, storyboard, canvas from template, lay out canvas, export canvas, canvas layout, canvas generate, add to canvas, put this on the canvas, open canvas, canvas present, canvas template.
canvas-template
Browse and instantiate 12 canvas template archetypes: presentation, flowchart, mind-map, gallery, dashboard, storyboard, knowledge-graph, mood-board, timeline, comparison, kanban, project-brief. Each template generates a ready-to-use canvas with proper layout, zones, and placeholder content. Triggers on: canvas template, canvas template list, browse templates, canvas from template, use template, show archetypes.
canvas-export
Export Obsidian Canvas files to PNG, SVG, or PDF formats. Uses the Advanced Canvas plugin's built-in export when Obsidian is running, or falls back to Playwright browser-based screenshot capture. Supports single canvas export, presentation slide-per-page PDF export, and batch export. Triggers on: canvas export, export canvas, canvas to png, canvas to pdf, canvas to svg, save canvas as image, screenshot canvas, export presentation.
canvas-generate
AI-orchestrated full canvas generation. Given a description, detects the best archetype, generates content and visuals, instantiates a template, applies layout, and produces a complete canvas. The flagship command. Dispatches canvas-media and canvas-composer agents for parallel asset generation. Triggers on: canvas generate, generate canvas, create a visual board, build me a canvas, make a canvas about, canvas from description, auto-generate canvas, full canvas generation.
canvas-present
Build presentation-mode canvases for the Advanced Canvas plugin. Creates slide-deck canvases with 1200x675 group nodes connected by edges for arrow-key navigation. Supports title slides, content slides with images, full-text slides, and optional script annotation columns for video planning. Triggers on: canvas present, create presentation, build slide deck, canvas slides, make a presentation, presentation canvas, present from notes, slide deck canvas, canvas presentation.
Didn't find tool you were looking for?