Create visual canvases with automatic layout, color-coding, and smart node positioning.
When to Use This Skill
Activate when you need to:
- Create visual summaries of weekly reading
- Build knowledge maps connecting related topics
- Design project timelines or mind maps
- Organize scattered notes into visual structure
Core Principle: Automatic Layout
Let the layout be automatic, focus on the content
The core of Canvas is node placement and connections. Instead of manually calculating coordinates, use automatic layouts per pattern.
Edit Workflow: Draft & Atomic Replace (CRITICAL)
Do not overwrite the canvas file directly multiple times.
While Obsidian has the canvas tab open, if you modify the .canvas file externally, Obsidian may overwrite the disk again with its own in-memory (often minimal) state, and your work results may be lost.
Recommended workflow
- Finish editing in a temporary file:
<원본>.canvas.draftWrite all nodes, edges, and containers at once to - Validation: Check JSON validity, node coordinate overlap, and edge ID matching
- Atomic Replace:
mv draft → 원본Replace with a single file system event - Check results:
wc -lVerify file size with (minimal state = suspect empty canvas)
Patterns to avoid
- Consecutive Write calls to the same
.canvasfile (race condition) - Partial edit with Edit, then next Edit before Obsidian sync
- Immediately after writing, call
obsidian://open(sync conflict possible during writing) - Repeatedly asking the user to "refresh Obsidian"
Atomic Replace example
# 1. 임시 파일에 완전한 캔버스 작성
Write file: AI/Canvas/foo.canvas.draft (전체 내용)
# 2. 한 번에 교체
mv "AI/Canvas/foo.canvas.draft" "AI/Canvas/foo.canvas"
# 3. 결과 검증
wc -l "AI/Canvas/foo.canvas" # 정상 = 노드 수에 비례한 줄 수
# 비정상 = 6-9줄 (minimal 상태)
Even small edits rewrite the whole thing
Even if partial edits are needed, rewrite the entire canvas JSON to a temporary file and atomic replace. The pattern of editing only one node with the Edit tool can cause sync conflicts.
Canvas File Structure
{
"nodes": [
{
"id": "unique-id",
"type": "text" | "file" | "link" | "group",
"text": "content or file path",
"x": 0, "y": 0,
"width": 250, "height": 60,
"color": "1-6"
}
],
"edges": [
{
"id": "edge-id",
"fromNode": "node-id",
"fromSide": "top|bottom|left|right",
"toNode": "node-id",
"toSide": "top|bottom|left|right",
"color": "1-6"
}
]
}
Layout Patterns
1. Radial Layout
Radial placement by category from a central node
Topic1
|
Topic4 - CENTER - Topic2
|
Topic3
Use case: Weekly reading, topic overview Spacing: 400-600px from center
2. Grid Layout
Place in vertical columns by category
Category1 Category2 Category3
Item1 Item1 Item1
Item2 Item2 Item2
Item3 Item3 Item3
Use case: Comparative analysis, multi-column organization Spacing: X: 400px, Y: 100px between items
3. Timeline Layout
Horizontal flow in chronological order
Event1 → Event2 → Event3 → Event4
Use case: Project milestones, historical events Spacing: 300px horizontal
4. Hierarchical Layout
Expand top→bottom in a tree structure
Root
/ \
Child1 Child2
/ \ / \
A B C D
Use case: Concept breakdown, org charts Spacing: Y: 200px per level
5. Side-by-side Comparison
Place related items horizontally for comparison at a glance
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 항목1 │ │ 항목2 │ │ 항목3 │
│ (350px) │ │ (350px) │ │ (350px) │
└─────────┘ └─────────┘ └─────────┘
Use case: Option comparison, summary cards, listing related concepts Node width: 300-350px (narrow) X spacing: 40px between nodes X position calculation (centered at x=0):
- 2 nodes: x = -195, 195
- 3 nodes: x = -390, 0, 390
- Formula: first node x = -(total width/2) + (node width/2)
6. Two-Column Comparison
Place two contrasting viewpoints/options on both sides
LEFT COLUMN RIGHT COLUMN
┌─────────┐ ┌─────────┐
│ Header │ │ Header │
├─────────┤ ├─────────┤
│ Item 1 │ │ Item 1 │
│ Item 2 │ │ Item 2 │
│ Item 3 │ │ Item 3 │
└────┬────┘ └────┬────┘
└───────┬───────────┘
┌─────┴─────┐
│ Common │
│ Ground │
└───────────┘
Use case: A vs B comparison, pros and cons, Before/After, viewpoint contrast Column width: 500-550px each X spacing: 750px between column centers (left: -375, right: 375) Center elements: x = 0 (connect both sides)
Color Scheme
| Color | ID | Use Case |
|---|---|---|
| Red | 1 | AI & Tech |
| Orange | 2 | Work & Projects |
| Yellow | 3 | Current Events |
| Green | 4 | PKM & Learning |
| Purple | 5 | Personal & Meta |
| Blue | 6 | Education & Career |
Node Types & Sizes
Text Node
- Default: 250x60 (single line)
- Quote: 280x60 (wider for readability)
- Multi-line: 250x(60 + 20*lines)
File Node
- Link to note: 280x90 (includes title + summary)
- Path format: Use wiki links in text field
Group Node
- Category header: 200x50
- Container: Auto-size based on children
Width Adaptation (adjust content when width changes)
When node width shrinks due to a layout change:
| Width change | Content adjustment |
|---|---|
| 550px → 350px | Reduce table columns, split long sentences |
| 350px → 300px | Only 2-3 bullets, remove examples |
| 300px → 250px | Title + one-line summary only |
Abbreviation priority (what to remove first):
- Additional explanations, parenthetical content
- Examples, references
- Table rows (keep only the essentials)
- Number of bullet points
Auto-Layout Algorithm
Step 1: Categorize Nodes
Group nodes by topic/category using tags or manual grouping.
Step 2: Calculate Positions
Based on layout pattern:
- Radial: Divide 360° by category count
- Grid: Calculate column width, row height
- Timeline: Distribute evenly on X-axis
- Hierarchy: BFS traversal, level-by-level
Step 3: Avoid Overlaps
- Minimum spacing: 50px
- Check bounding boxes
- Adjust if collision detected
Step 4: Create Edges
- Connect center to categories (radial)
- Connect sequential items (timeline)
- Connect parent-child (hierarchy)
Example Templates
Weekly Reading Canvas
{
"nodes": [
{
"id": "center",
"type": "text",
"text": "# Weekly Reading\n## Dec 20-27, 2025",
"x": 0, "y": 0,
"width": 200, "height": 80,
"color": "5"
},
{
"id": "group-ai",
"type": "text",
"text": "## AI & Learning",
"x": -380, "y": -200,
"width": 180, "height": 50,
"color": "1"
}
],
"edges": [
{
"id": "edge-center-ai",
"fromNode": "center",
"fromSide": "left",
"toNode": "group-ai",
"toSide": "right",
"color": "1"
}
]
}
Project Timeline Canvas
{
"nodes": [
{
"id": "phase1",
"type": "text",
"text": "**Phase 1**\nResearch",
"x": 0, "y": 0,
"width": 200, "height": 80,
"color": "1"
},
{
"id": "phase2",
"type": "text",
"text": "**Phase 2**\nDevelopment",
"x": 300, "y": 0,
"width": 200, "height": 80,
"color": "2"
}
],
"edges": [
{
"id": "edge-1-2",
"fromNode": "phase1",
"fromSide": "right",
"toNode": "phase2",
"toSide": "left"
}
]
}
Best Practices
Content First, Layout Second
- List all items to include
- Group by category/theme
- Choose layout pattern
- Generate coordinates
- Add edges last
Keep It Scannable
- Max 20 nodes per canvas
- 4-6 categories ideal
- Clear visual hierarchy
- Consistent spacing
Link to Notes
- Use wiki link format:
[[Note Title]] - Include section links:
[[Note#Section]] - Add emoji for visual cues
Iterate Layout
- Start with template
- Adjust spacing if crowded
- Test in Obsidian preview
- Refine edge routing
Part Headers for Long Documents
Separate sections with Part headers for long canvases
When to use:
- 15 or more nodes
- Logically distinct stages/sections exist
Part header format:
{"id":"part1","type":"text","text":"# 📋 Part 1: [섹션명]","x":-275,"y":[y],"width":550,"height":60,"color":"[색상]"}
Color distinction between Parts:
- Assign a different color to each Part
- Nodes within a Part use the same color family
- Improved visual navigation
Overlap Prevention
When updating the canvas, always overlap must be checked. Overlap harms readability and makes node selection difficult.
Overlap calculation formula
Check whether two nodes overlap:
Node A: (x1, y1, width1, height1)
Node B: (x2, y2, width2, height2)
오버랩 조건 (둘 다 만족 시 오버랩):
- X축: x1 < x2 + width2 AND x1 + width1 > x2
- Y축: y1 < y2 + height2 AND y1 + height1 > y2
Calculating the appropriate spacing
Formula for maintaining spacing between nodes:
다음 노드 Y = 현재 노드 Y + 현재 노드 Height + Gap(30-50px)
예시:
- Node A: y=500, height=180 → Node A 하단 = 680
- Node B 시작: y = 680 + 40(gap) = 720
Recommended node height criteria
| Content type | Recommended height |
|---|---|
| Single-line title | 60-80px |
| 2-3 lines of text | 100-120px |
| Medium description (4-6 lines) | 140-180px |
| Long description (7-10 lines) | 200-260px |
| Includes a table | 250-350px |
Checklist when modifying the canvas
- Before modification: Identify the Y coordinate + Height of the current nodes
- When adding a node: Adjust the Y values of all nodes below the insertion position
- When changing Height: Recalculate the Y values of all nodes after the relevant node
- After modification: Check for overlap for every pair of adjacent nodes
Spacing by layout pattern
| Layout | X spacing | Y spacing |
|---|---|---|
| Radial | 400-600px | N/A |
| Grid | 350-450px | 40-60px |
| Timeline | 280-350px | N/A |
| Hierarchical | N/A | 150-250px |
| Two-Column | 500-700px | 40-60px |
Automatic overlap correction procedure
1. 모든 노드를 Y 좌표 기준 정렬
2. 각 노드에 대해:
a. 이전 노드의 하단(y + height)과 현재 노드의 상단(y) 비교
b. 겹치면: 현재 노드 y = 이전 노드 하단 + 40px
c. 이후 모든 노드 y 값을 동일 delta만큼 이동
3. 센터 정렬이 필요한 노드는 x 값도 조정
Quality Checklist
Before finalizing canvas:
- All nodes have unique IDs
- No overlapping nodes (run overlap check formula above)
- Minimum 30-50px spacing between adjacent nodes
- Colors follow scheme (AI=1, PKM=4, etc.)
- Center node clearly visible
- Edges don't cross unnecessarily
- Wiki links are valid
- Canvas renders in Obsidian without errors
Common Use Cases
1. Weekly Reading Summary
- Layout: Radial
- Categories: AI, PKM, Current Events, Education
- Nodes: Article links with quotes
- Output:
AI/Canvas/YYYY-MM-DD Weekly Reading.canvas
2. Project Planning
- Layout: Timeline or Hierarchical
- Nodes: Milestones, tasks, deliverables
- Colors: By status or phase
- Output:
Projects/[Name]/Planning.canvas
3. Concept Map
- Layout: Hierarchical
- Nodes: Main concept + subconcepts
- Edges: Parent-child relationships
- Output:
Topics/[Category]/[Concept].canvas
4. Meeting Network
- Layout: Radial
- Center: Person or topic
- Nodes: Related meetings/people
- Output:
AI/Canvas/[Topic] Network.canvas
Tools & Functions
generate_radial_layout(center, categories, items_per_category)
Returns node positions in radial pattern.
generate_grid_layout(columns, items)
Returns node positions in grid.
create_edge(from_id, to_id, color)
Returns edge object with auto-routing.
validate_canvas(canvas_json)
Checks for overlaps, invalid IDs, broken links.
Error Handling
Common Issues
- Overlapping nodes: Increase spacing or use different layout
- Broken wiki links: Validate file exists before linking
- Edge routing: Simplify connections, avoid crossing
Debugging
- Use Obsidian developer console (Cmd+Opt+I)
- Check JSON syntax
- Verify all node IDs exist in edges
Next Steps: Run example canvas generation to test layout algorithms.