Create and manage Obsidian Canvas files with automatic layout generation. Use when creating visual knowledge maps, weekly reading summaries, or project timelines.
Scanned 6/11/2026
Install via CLI
openskills install jykim/claude-obsidian-skills---
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
```json
{
"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 | 제목 + 한 줄 요약만 |
**축약 우선순위** (먼저 제거할 것):
1. 부연 설명, 괄호 내용
2. 예시, 참조
3. 테이블 행 (핵심만 유지)
4. 불릿 포인트 수
## 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
```json
{
"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
```json
{
"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
1. List all items to include
2. Group by category/theme
3. Choose layout pattern
4. Generate coordinates
5. 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 헤더 형식**:
```json
{"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 |
### 캔버스 수정 시 체크리스트
1. **수정 전**: 현재 노드들의 Y 좌표 + Height 파악
2. **노드 추가 시**: 삽입 위치 기준 하단 모든 노드 Y값 조정
3. **Height 변경 시**: 해당 노드 이후 모든 노드 Y값 재계산
4. **수정 후**: 모든 인접 노드 쌍에 대해 오버랩 검사
### 레이아웃 패턴별 간격
| 레이아웃 | 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.
No comments yet. Be the first to comment!