Create and manage Obsidian Canvas files with automatic layout generation. Use when creating visual knowledge maps, weekly reading summaries, or project timelines.
Create visual canvases with automatic layout, color-coding, and smart node positioning.
Activate when you need to:
๋ ์ด์์์ ์๋์ผ๋ก, ์ฝํ ์ธ ์ ์ง์คํ๋ผ
Canvas์ ํต์ฌ์ ๋ ธ๋ ๋ฐฐ์น์ ์ฐ๊ฒฐ. ์๋์ผ๋ก ์ขํ ๊ณ์ฐํ๋ ๋์ , ํจํด๋ณ ์๋ ๋ ์ด์์ ์ฌ์ฉ.
์บ๋ฒ์ค ํ์ผ์ ์ง์ ์ฌ๋ฌ ๋ฒ ๋ฎ์ด์ฐ์ง ๋ง๋ผ.
Obsidian์ด ์บ๋ฒ์ค ํญ์ ์ด์ด๋ ์ํ์์ ์ธ๋ถ์์ .canvas ํ์ผ์ ์์ ํ๋ฉด, Obsidian์ด ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ์ (์ข
์ข
minimalํ) ์ํ๋ก ๋์คํฌ๋ฅผ ๋ค์ ๋ฎ์ด์จ ์์
๊ฒฐ๊ณผ๊ฐ ์ฌ๋ผ์ง ์ ์๋ค.
<์๋ณธ>.canvas.draft์ ๋ชจ๋ ๋
ธ๋ยท์ฃ์งยท์ปจํ
์ด๋๋ฅผ ํ ๋ฒ์ ์์ฑmv draft โ ์๋ณธ ํ ๋ฒ์ ํ์ผ ์์คํ
์ด๋ฒคํธ๋ก ๊ต์ฒดwc -l๋ก ํ์ผ ํฌ๊ธฐ ๊ฒ์ฆ (minimal ์ํ = ๋น ์บ๋ฒ์ค ์์ฌ).canvas ํ์ผ์ ์ฐ์์ ์ผ๋ก Write ํธ์ถ (race condition)obsidian://open ํธ์ถ (์์ฑ ์ค sync ์ถฉ๋ ๊ฐ๋ฅ)# 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 ์ํ)
๋ถ๋ถ ์์ ์ด ํ์ํด๋ ์ ์ฒด ์บ๋ฒ์ค JSON์ ์์ ํ์ผ์ ๋ค์ ์ฐ๊ณ atomic replace. Edit ๋๊ตฌ๋ก ํ ๋ ธ๋๋ง ์์ ํ๋ ํจํด์ sync ์ถฉ๋์ ์ผ์ผํฌ ์ ์๋ค.
{
"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"
}
]
}
์ค์ฌ ๋ ธ๋์์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋ฐฉ์ฌํ ๋ฐฐ์น
Topic1
|
Topic4 - CENTER - Topic2
|
Topic3
Use case: Weekly reading, topic overview Spacing: 400-600px from center
์นดํ ๊ณ ๋ฆฌ๋ณ ์ธ๋ก ์ด๋ก ๋ฐฐ์น
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
์๊ฐ์ ๊ฐ๋ก ํ๋ฆ
Event1 โ Event2 โ Event3 โ Event4
Use case: Project milestones, historical events Spacing: 300px horizontal
ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์โ์๋ ํ์ฅ
Root
/ \
Child1 Child2
/ \ / \
A B C D
Use case: Concept breakdown, org charts Spacing: Y: 200px per level
๊ด๋ จ ํญ๋ชฉ๋ค์ ๊ฐ๋ก๋ก ๋ฐฐ์นํ์ฌ ํ๋์ ๋น๊ต
โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ
โ ํญ๋ชฉ1 โ โ ํญ๋ชฉ2 โ โ ํญ๋ชฉ3 โ
โ (350px) โ โ (350px) โ โ (350px) โ
โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ
Use case: ์ต์ ๋น๊ต, ์์ฝ ์นด๋, ๊ด๋ จ ๊ฐ๋ ๋์ด Node width: 300-350px (์ข๊ฒ) X spacing: 40px between nodes X position calculation (centered at x=0):
๋์กฐ๋๋ ๋ ๊ด์ /์ต์ ์ ์์ชฝ์ ๋ฐฐ์น
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 | 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 |
๋ ์ด์์ ๋ณ๊ฒฝ์ผ๋ก ๋ ธ๋ ํญ์ด ์ค์ด๋ค ๋:
| ํญ ๋ณ๊ฒฝ | ์ฝํ ์ธ ์กฐ์ |
|---|---|
| 550px โ 350px | ํ ์ด๋ธ ์ด ์ถ์, ๊ธด ๋ฌธ์ฅ ๋ถ๋ฆฌ |
| 350px โ 300px | ๋ถ๋ฆฟ 2-3๊ฐ๋ง, ์์ ์ ๊ฑฐ |
| 300px โ 250px | ์ ๋ชฉ + ํ ์ค ์์ฝ๋ง |
์ถ์ฝ ์ฐ์ ์์ (๋จผ์ ์ ๊ฑฐํ ๊ฒ):
Group nodes by topic/category using tags or manual grouping.
Based on layout pattern:
{
"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"
}
]
}
{
"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"
}
]
}
[[Note Title]][[Note#Section]]๊ธด ์บ๋ฒ์ค๋ Part ํค๋๋ก ์น์ ๊ตฌ๋ถ
์ธ์ ์ฌ์ฉ:
Part ํค๋ ํ์:
{"id":"part1","type":"text","text":"# ๐ Part 1: [์น์
๋ช
]","x":-275,"y":[y],"width":550,"height":60,"color":"[์์]"}
Part ๊ฐ ์์ ๊ตฌ๋ถ:
์บ๋ฒ์ค ์ ๋ฐ์ดํธ ์ ํญ์ ์ค๋ฒ๋ฉ์ ์ฒดํฌํด์ผ ํ๋ค. ์ค๋ฒ๋ฉ์ ๊ฐ๋ ์ฑ์ ํด์น๊ณ ๋ ธ๋ ์ ํ์ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
๋ ๋ ธ๋๊ฐ ๊ฒน์น๋์ง ํ์ธ:
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 |
| ๋ ์ด์์ | 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 ๊ฐ๋ ์กฐ์
Before finalizing canvas:
AI/Canvas/YYYY-MM-DD Weekly Reading.canvasProjects/[Name]/Planning.canvasTopics/[Category]/[Concept].canvasAI/Canvas/[Topic] Network.canvasReturns node positions in radial pattern.
Returns node positions in grid.
Returns edge object with auto-routing.
Checks for overlaps, invalid IDs, broken links.
Next Steps: Run example canvas generation to test layout algorithms.