| name | obsidian-canvas |
| description | Create and manage Obsidian Canvas files with automatic layout generation. Use when creating visual knowledge maps, weekly reading summaries, or project timelines. |
| allowed-tools | Read, Write, Edit, Glob, Grep |
| license | MIT |
Obsidian Canvas Skill
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
레이아웃은 자동으로, 콘텐츠에 집중하라
Canvas의 핵심은 노드 배치와 연결. 수동으로 좌표 계산하는 대신, 패턴별 자동 레이아웃 사용.
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 (방사형)
중심 노드에서 카테고리별로 방사형 배치
Topic1
|
Topic4 - CENTER - Topic2
|
Topic3
Use case: Weekly reading, topic overview Spacing: 400-600px from center
2. Grid Layout (그리드)
카테고리별 세로 열로 배치
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 (타임라인)
시간순 가로 흐름
Event1 → Event2 → Event3 → Event4
Use case: Project milestones, historical events Spacing: 300px horizontal
4. Hierarchical Layout (계층형)
트리 구조로 위→아래 확장
Root
/ \
Child1 Child2
/ \ / \
A B C D
Use case: Concept breakdown, org charts Spacing: Y: 200px per level
5. Side-by-side Comparison (가로 비교)
관련 항목들을 가로로 배치하여 한눈에 비교
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 항목1 │ │ 항목2 │ │ 항목3 │
│ (350px) │ │ (350px) │ │ (350px) │
└─────────┘ └─────────┘ └─────────┘
Use case: 옵션 비교, 요약 카드, 관련 개념 나열 Node width: 300-350px (좁게) X spacing: 40px between nodes X position calculation (centered at x=0):
- 2 nodes: x = -195, 195
- 3 nodes: x = -390, 0, 390
- 계산식: 첫 노드 x = -(총너비/2) + (노드너비/2)
6. Two-Column Comparison (2열 비교)
대조되는 두 관점/옵션을 양쪽에 배치
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 비교, 찬반, Before/After, 관점 대조 Column width: 500-550px each X spacing: 750px between column centers (left: -375, right: 375) Center elements: x = 0 (양쪽 연결)
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 (폭 변경 시 콘텐츠 조정)
레이아웃 변경으로 노드 폭이 줄어들 때:
| 폭 변경 | 콘텐츠 조정 |
|---|---|
| 550px → 350px | 테이블 열 축소, 긴 문장 분리 |
| 350px → 300px | 불릿 2-3개만, 예시 제거 |
| 300px → 250px | 제목 + 한 줄 요약만 |
축약 우선순위 (먼저 제거할 것):
- 부연 설명, 괄호 내용
- 예시, 참조
- 테이블 행 (핵심만 유지)
- 불릿 포인트 수
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
긴 캔버스는 Part 헤더로 섹션 구분
언제 사용:
- 노드 수 15개 이상
- 논리적으로 구분되는 단계/섹션 존재
Part 헤더 형식:
{"id":"part1","type":"text","text":"# 📋 Part 1: [섹션명]","x":-275,"y":[y],"width":550,"height":60,"color":"[색상]"}
Part 간 색상 구분:
- 각 Part에 다른 색상 할당
- Part 내 노드들은 동일 색상 계열 사용
- 시각적 네비게이션 향상
Overlap Prevention (오버랩 방지)
캔버스 업데이트 시 항상 오버랩을 체크해야 한다. 오버랩은 가독성을 해치고 노드 선택을 어렵게 만든다.
오버랩 계산 공식
두 노드가 겹치는지 확인:
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
적정 간격 계산
노드 간 간격을 유지하기 위한 공식:
다음 노드 Y = 현재 노드 Y + 현재 노드 Height + Gap(30-50px)
예시:
- Node A: y=500, height=180 → Node A 하단 = 680
- Node B 시작: y = 680 + 40(gap) = 720
노드 높이 권장 기준
| 콘텐츠 유형 | 권장 높이 |
|---|---|
| 한 줄 제목 | 60-80px |
| 2-3줄 텍스트 | 100-120px |
| 중간 설명 (4-6줄) | 140-180px |
| 긴 설명 (7-10줄) | 200-260px |
| 테이블 포함 | 250-350px |
캔버스 수정 시 체크리스트
- 수정 전: 현재 노드들의 Y 좌표 + Height 파악
- 노드 추가 시: 삽입 위치 기준 하단 모든 노드 Y값 조정
- Height 변경 시: 해당 노드 이후 모든 노드 Y값 재계산
- 수정 후: 모든 인접 노드 쌍에 대해 오버랩 검사
레이아웃 패턴별 간격
| 레이아웃 | X 간격 | Y 간격 |
|---|---|---|
| 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 |
자동 오버랩 수정 절차
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.