obsidian-canvas-create
SKILL.md
Obsidian Canvas Create
When To Activate
Do NOT trigger for:
- Mermaid diagrams in markdown (those go in notes, not canvas)
- Editing existing canvas files (read and modify directly)
- Simple lists that don't need spatial layout
Instructions
Step 1: Understand the Intent
| Intent | Canvas Type | Layout |
|---|---|---|
| Organise ideas | Mind map | Radial from centre |
| Track tasks | Kanban board | Columns left to right |
| Show a process | Flowchart | Top to bottom |
| Gather research | Research canvas | Clusters with links |
| Project overview | Project board | Grouped sections |
| Compare options | Decision canvas | Side by side |
Ask if not obvious: "What kind of layout — mind map, kanban, flowchart, or something else?"
Step 2: Gather Content
- Text nodes: Ideas, descriptions, notes to write directly on the canvas
- File nodes: Existing vault notes to reference (
[[Note Name]]) - Link nodes: External URLs
- Groups: Categories or clusters to visually group nodes
# If referencing vault notes, verify they exist
find "$VAULT_PATH" -name "note-name.md" 2>/dev/null
Step 3: Generate the Canvas JSON
{
"nodes": [],
"edges": []
}
Node types:
Text node (content written directly on canvas):
{
"id": "a1b2c3d4e5f6a7b8",
"type": "text",
"x": 0,
"y": 0,
"width": 250,
"height": 120,
"text": "# Heading\n\nContent here with **markdown**"
}
File node (reference to a vault note):
{
"id": "b2c3d4e5f6a7b8c9",
"type": "file",
"x": 300,
"y": 0,
"width": 250,
"height": 120,
"file": "Notes/note-name.md"
}
Link node (external URL):
{
"id": "c3d4e5f6a7b8c9d0",
"type": "link",
"x": 600,
"y": 0,
"width": 250,
"height": 120,
"url": "https://example.com"
}
Group node (visual container):
{
"id": "d4e5f6a7b8c9d0e1",
"type": "group",
"x": -20,
"y": -40,
"width": 580,
"height": 200,
"label": "Group Name"
}
Edges (connections between nodes):
{
"id": "e5f6a7b8c9d0e1f2",
"fromNode": "a1b2c3d4e5f6a7b8",
"toNode": "b2c3d4e5f6a7b8c9",
"fromSide": "right",
"toSide": "left",
"label": "leads to"
}
ID generation: 16 lowercase hex characters. Use random generation:
import secrets
node_id = secrets.token_hex(8) # "a1b2c3d4e5f6a7b8"
Color options:
- Preset:
"1"(red),"2"(orange),"3"(yellow),"4"(green),"5"(cyan),"6"(purple) - Hex:
"#FF0000"
Step 4: Layout the Nodes
Mind map (radial):
[Topic A]
|
[Topic B] - [Centre] - [Topic C]
|
[Topic D]
- Centre node at (0, 0)
- Branches radiate: right (400, 0), left (-400, 0), top (0, -250), bottom (0, 250)
- Sub-branches offset further (+400/+250 from parent)
Kanban (columns):
| Todo (x:0) | In Progress (x:300) | Done (x:600) |
| Task 1 | Task 3 | Task 5 |
| Task 2 | Task 4 | Task 6 |
- Group columns: width 280, spacing 300
- Cards inside: width 240, height 80, y-offset 60 between cards
- First card y offset: 40 below group top
Flowchart (vertical):
[Start] y: 0
|
[Step 1] y: 200
|
/ \
[Yes] [No] y: 400
- Nodes centred on x: 0, spacing y: 200
- Branches: left x: -200, right x: 200
- Edges with fromSide: "bottom", toSide: "top"
Research canvas (clusters):
[Source Group] [Notes Group] [Synthesis Group]
[Source 1] [Note 1] [Summary]
[Source 2] [Note 2]
[Source 3]
- Groups spaced 400 apart horizontally
- Nodes inside groups spaced 140 apart vertically
Recommended node sizes:
- Standard text/file: 250 x 120
- Small card: 200 x 80
- Large note: 400 x 250
- Group padding: 20px on each side, 40px top (for label)
Step 5: Write the File
Write the JSON with proper formatting (2-space indent).
Verify:
# Validate JSON
python3 -c "import json; json.load(open('$CANVAS_PATH'))" && echo "Valid JSON"
Confirm:
Canvas created: canvas-name.canvas
Nodes: X text, Y file, Z link
Edges: N connections
Layout: [mind map / kanban / flowchart / research]
Open in Obsidian to view.
Output Format
## Canvas Created
**File:** canvas-name.canvas
**Type:** [mind map / kanban / flowchart / research]
**Nodes:** X (Y text, Z file, W link)
**Edges:** N connections
**Groups:** G groups
Open in Obsidian to view and rearrange.
NEVER
- Generate invalid JSON (always validate)
- Use newline characters literally in text fields (use
\n) - Create nodes with overlapping positions
- Skip the layout step (random positions look terrible)
- Use IDs shorter than 16 hex chars
- Reference vault files that don't exist without noting it
- Create canvases with a single node (just use a note)
ALWAYS
- Generate valid 16-char hex IDs for every node and edge
- Use consistent spacing in layout
- Validate the JSON before confirming
- Use groups to organise related nodes
- Add edge labels where the relationship isn't obvious
- Tell the user to open in Obsidian to view (canvas is visual)
Example
User: "Create a kanban board for my current project tasks"
{
"nodes": [
{
"id": "g001000000000001",
"type": "group",
"x": 0, "y": 0,
"width": 280, "height": 400,
"label": "Todo",
"color": "1"
},
{
"id": "g002000000000002",
"type": "group",
"x": 300, "y": 0,
"width": 280, "height": 400,
"label": "In Progress",
"color": "3"
},
{
"id": "g003000000000003",
"type": "group",
"x": 600, "y": 0,
"width": 280, "height": 400,
"label": "Done",
"color": "4"
},
{
"id": "n001000000000004",
"type": "text",
"x": 20, "y": 50,
"width": 240, "height": 80,
"text": "# Set up rate limiting\n\nImplement token bucket on API gateway"
},
{
"id": "n002000000000005",
"type": "text",
"x": 20, "y": 150,
"width": 240, "height": 80,
"text": "# Write integration tests\n\nCover all payment flows"
},
{
"id": "n003000000000006",
"type": "text",
"x": 320, "y": 50,
"width": 240, "height": 80,
"text": "# API design doc\n\nDocument endpoint contracts"
},
{
"id": "n004000000000007",
"type": "text",
"x": 620, "y": 50,
"width": 240, "height": 80,
"text": "# Auth middleware\n\nJWT validation complete"
}
],
"edges": []
}
Canvas created: project-kanban.canvas
Nodes: 4 task cards in 3 groups
Layout: Kanban (Todo → In Progress → Done)
Open in Obsidian to drag tasks between columns.
Weekly Installs
1
Repository
elliotjlt/claud…-potionsGitHub Stars
51
First Seen
6 days ago
Security Audits
Installed on
zencoder1
amp1
cline1
openclaw1
opencode1
cursor1