.fyi
SkillsMCPPluginsSubagents

Browse by category

DevOps & CI/CD SkillsProductivity & Workflow SkillsOther SkillsProduct & Project Management SkillsDocumentation & Knowledge SkillsCode Review & Refactor SkillsBackend & APIs SkillsAgent Meta & Communication SkillsResearch SkillsSecurity SkillsUX UI & Design SkillsTesting & QA SkillsSee all →

Every Claude Code skill, MCP server, plugin and subagent in one directory. Searchable, comparable, and one command from installed. Live stats from GitHub, npm and PyPI.

We're on Product HuntYour agent's app storeCheck it out →
Agent SkillsMCP ServersPluginsSubagentsCoding Agents
CollectionsOfficial publishersGlossaryFAQBlogSearchSavedFeedback
PrivacyTermsllms.txtSitemap

made with ♥ · © 2026 aaaa.fyi

Independent project · real data from public registries

…/obsidian-skills/json-canvas
home/skills/kepano/obsidian-skills/json-canvas
kepano avatar

json-canvas

bykepano· 5 skills

Installs

50k

Stars

43k

Forks

3.1k

Category

Productivity & Workflow

View on GitHub

TL;DR

Create and edit JSON Canvas files (.canvas) with nodes, edges, groups, and connections. Use when working with .canvas files, creating visual canvases, mind maps, flowcharts, or when the user mentions Canvas files in Obsidian.

How to install json-canvas?

kepano/obsidian-skills/json-canvas
$npx -y skills add kepano/obsidian-skills --skill json-canvas

Installs into the current project.

›Prefer a prompt? Paste this to your agent

Use this skill

Run `npx skills use "https://github.com/kepano/obsidian-skills" --skill "kepano/obsidian-skills/json-canvas"` and follow the generated skill instructions now. Read its complete output, redirecting it to a temporary file first if necessary. Resolve relative paths from the supporting-files directory it provides.

Use the whole pack

Use the skills in "https://github.com/kepano/obsidian-skills" that are relevant to the current task. Run `npx skills add "https://github.com/kepano/obsidian-skills"` and select the relevant skills, then follow their instructions.

Files · 1

View on GitHub
SKILL.md
1# JSON Canvas Skill
2 
3## File Structure
4 
5A canvas file (`.canvas`) contains two top-level arrays following the [JSON Canvas Spec 1.0](https://jsoncanvas.org/spec/1.0/):
6 
7```json
8{
9 "nodes": [],
10 "edges": []
11}
12```
13 
14- `nodes` (optional): Array of node objects
15- `edges` (optional): Array of edge objects connecting nodes
16 
17## Common Workflows
18 
19### 1. Create a New Canvas
20 
211. Create a `.canvas` file with the base structure `{"nodes": [], "edges": []}`
222. Generate unique 16-character hex IDs for each node (e.g., `"6f0ad84f44ce9c17"`)
233. Add nodes with required fields: `id`, `type`, `x`, `y`, `width`, `height`
244. Add edges referencing valid node IDs via `fromNode` and `toNode`
255. **Validate**: Parse the JSON to confirm it is valid. Verify all `fromNode`/`toNode` values exist in the nodes array
26 
27### 2. Add a Node to an Existing Canvas
28 
291. Read and parse the existing `.canvas` file
302. Generate a unique ID that does not collide with existing node or edge IDs
313. Choose position (`x`, `y`) that avoids overlapping existing nodes (leave 50-100px spacing)
324. Append the new node object to the `nodes` array
335. Optionally add edges connecting the new node to existing nodes
346. **Validate**: Confirm all IDs are unique and all edge references resolve to existing nodes
35 
36### 3. Connect Two Nodes
37 
381. Identify the source and target node IDs
392. Generate a unique edge ID
403. Set `fromNode` and `toNode` to the source and target IDs
414. Optionally set `fromSide`/`toSide` (top, right, bottom, left) for anchor points
425. Optionally set `label` for descriptive text on the edge
436. Append the edge to the `edges` array
447. **Validate**: Confirm both `fromNode` and `toNode` reference existing node IDs
45 
46### 4. Edit an Existing Canvas
47 
481. Read and parse the `.canvas` file as JSON
492. Locate the target node or edge by `id`
503. Modify the desired attributes (text, position, color, etc.)
514. Write the updated JSON back to the file
525. **Validate**: Re-check all ID uniqueness and edge reference integrity after editing
53 
54## Nodes
55 
56Nodes are objects placed on the canvas. Array order determines z-index: first node = bottom layer, last node = top layer.
57 
58### Generic Node Attributes
59 
60| Attribute | Required | Type | Description |
61|-----------|----------|------|-------------|
62| `id` | Yes | string | Unique 16-char hex identifier |
63| `type` | Yes | string | `text`, `file`, `link`, or `group` |
64| `x` | Yes | integer | X position in pixels |
65| `y` | Yes | integer | Y position in pixels |
66| `width` | Yes | integer | Width in pixels |
67| `height` | Yes | integer | Height in pixels |
68| `color` | No | canvasColor | Preset `"1"`-`"6"` or hex (e.g., `"#FF0000"`) |
69 
70### Text Nodes
71 
72| Attribute | Required | Type | Description |
73|-----------|----------|------|-------------|
74| `text` | Yes | string | Plain text with Markdown syntax |
75 
76```json
77{
78 "id": "6f0ad84f44ce9c17",
79 "type": "text",
80 "x": 0,
81 "y": 0,
82 "width": 400,
83 "height": 200,
84 "text": "# Hello World\n\nThis is **Markdown** content."
85}
86```
87 
88**Newline pitfall**: Use `\n` for line breaks in JSON strings. Do **not** use the literal `\\n` -- Obsidian renders that as the characters `\` and `n`.
89 
90### File Nodes
91 
92| Attribute | Required | Type | Description |
93|-----------|----------|------|-------------|
94| `file` | Yes | string | Path to file within the system |
95| `subpath` | No | string | Link to heading or block (starts with `#`) |
96 
97```json
98{
99 "id": "a1b2c3d4e5f67890",
100 "type": "file",
101 "x": 500,
102 "y": 0,
103 "width": 400,
104 "height": 300,
105 "file": "Attachments/diagram.png"
106}
107```
108 
109### Link Nodes
110 
111| Attribute | Required | Type | Description |
112|-----------|----------|------|-------------|
113| `url` | Yes | string | External URL |
114 
115```json
116{
117 "id": "c3d4e5f678901234",
118 "type": "link",
119 "x": 1000,
120 "y": 0,
121 "width": 400,
122 "height": 200,
123 "url": "https://obsidian.md"
124}
125```
126 
127### Group Nodes
128 
129Groups are visual containers for organizing other nodes. Position child nodes inside the group's bounds.
130 
131| Attribute | Required | Type | Description |
132|-----------|----------|------|-------------|
133| `label` | No | string | Text label for the group |
134| `background` | No | string | Path to background image |
135| `backgroundStyle` | No | string | `cover`, `ratio`, or `repeat` |
136 
137```json
138{
139 "id": "d4e5f6789012345a",
140 "type": "group",
141 "x": -50,
142 "y": -50,
143 "width": 1000,
144 "height": 600,
145 "label": "Project Overview",
146 "color": "4"
147}
148```
149 
150## Edges
151 
152Edges connect nodes via `fromNode` and `toNode` IDs.
153 
154| Attribute | Required | Type | Default | Description |
155|-----------|----------|------|---------|-------------|
156| `id` | Yes | string | - | Unique identifier |
157| `fromNode` | Yes | string | - | Source node ID |
158| `fromSide` | No | string | - | `top`, `right`, `bottom`, or `left` |
159| `fromEnd` | No | string | `none` | `none` or `arrow` |
160| `toNode` | Yes | string | - | Target node ID |
161| `toSide` | No | string | - | `top`, `right`, `bottom`, or `left` |
162| `toEnd` | No | string | `arrow` | `none` or `arrow` |
163| `color` | No | canvasColor | - | Line color |
164| `label` | No | string | - | Text label |
165 
166```json
167{
168 "id": "0123456789abcdef",
169 "fromNode": "6f0ad84f44ce9c17",
170 "fromSide": "right",
171 "toNode": "a1b2c3d4e5f67890",
172 "toSide": "left",
173 "toEnd": "arrow",
174 "label": "leads to"
175}
176```
177 
178## Colors
179 
180The `canvasColor` type accepts either a hex string or a preset number:
181 
182| Preset | Color |
183|--------|-------|
184| `"1"` | Red |
185| `"2"` | Orange |
186| `"3"` | Yellow |
187| `"4"` | Green |
188| `"5"` | Cyan |
189| `"6"` | Purple |
190 
191Preset color values are intentionally undefined -- applications use their own brand colors.
192 
193## ID Generation
194 
195Generate 16-character lowercase hexadecimal strings (64-bit random value):
196 
197```
198"6f0ad84f44ce9c17"
199"a3b2c1d0e9f8a7b6"
200```
201 
202## Layout Guidelines
203 
204- Coordinates can be negative (canvas extends infinitely)
205- `x` increases right, `y` increases down; position is the top-left corner
206- Space nodes 50-100px apart; leave 20-50px padding inside groups
207- Align to grid (multiples of 10 or 20) for cleaner layouts
208 
209| Node Type | Suggested Width | Suggested Height |
210|-----------|-----------------|------------------|
211| Small text | 200-300 | 80-150 |
212| Medium text | 300-450 | 150-300 |
213| Large text | 400-600 | 300-500 |
214| File preview | 300-500 | 200-400 |
215| Link preview | 250-400 | 100-200 |
216 
217## Validation Checklist
218 
219After creating or editing a canvas file, verify:
220 
2211. All `id` values are unique across both nodes and edges
2222. Every `fromNode` and `toNode` references an existing node ID
2233. Required fields are present for each node type (`text` for text nodes, `file` for file nodes, `url` for link nodes)
2244. `type` is one of: `text`, `file`, `link`, `group`
2255. `fromSide`/`toSide` values are one of: `top`, `right`, `bottom`, `left`
2266. `fromEnd`/`toEnd` values are one of: `none`, `arrow`
2277. Color presets are `"1"` through `"6"` or valid hex (e.g., `"#FF0000"`)
2288. JSON is valid and parseable
229 
230If validation fails, check for duplicate IDs, dangling edge references, or malformed JSON strings (especially unescaped newlines in text content).
231 
232## Complete Examples
233 
234See [references/EXAMPLES.md](references/EXAMPLES.md) for full canvas examples including mind maps, project boards, research canvases, and flowcharts.
235 
236## References
237 
238- [JSON Canvas Spec 1.0](https://jsoncanvas.org/spec/1.0/)
239- [JSON Canvas GitHub](https://github.com/obsidianmd/jsoncanvas)

Security

Passed

  • Gen Agent Trust Hubpass
  • Socketpass
  • Snykpass
  • Runlayerpass
  • ZeroLeakspass

Preview

kepano/obsidian-skillskepano/obsidian-skills

$ npx -y skills add kepano/obsidian-skills --skill json-canvas

▸ installing to .claude/skills…

✓ json-canvas ready

Repokepano/obsidian-skills
TypeSkills
CategoryProductivity & Workflow
ForDeveloper
UpdatedJun 2026
License—
First seenJul 26, 2026

Tags

Skill

Related

6 picks
Type
  1. juliusbrussee avatarcavemanUltra-compressed communication mode. Cuts output tokens 65% (measured) by speaking like caveman while keeping full technical accuracy.SkillsJul 2026391k93k
  2. larksuite avatarlark-im飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件(支持大文件分片下载)、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive…SkillsJul 2026390k16k
  3. larksuite avatarlark-calendar飞书日历:管理日历日程和会议室。查看/搜索日程、创建/更新日程、管理参会人、查询忙闲和推荐时段、预定会议室。当用户需要查看日程安排、创建/修改会议、查询/预定会议室时使用。不负责:查询过去的视频会议记录(走 lark-vc)、待办任务(走 lark-task)。SkillsJul 2026388k16k
  4. larksuite avatarlark-contact飞书 / Lark 通讯录:按姓名 / 邮箱解析成 open_id,或按 open_id 反查姓名 / 部门 / 邮箱 / 联系方式 / 个人状态 / 签名。当用户提到某人姓名要下一步发消息 / 排日程,或拿到 open_id 想查具体信息时使用。不负责部门树遍历、按部门列员工、组织架构图,这类需求走原生…SkillsJul 2026387k16k
  5. larksuite avatarlark-workflow-meeting-summary会议纪要整理工作流:汇总指定时间范围内的会议纪要并生成结构化报告。当用户需要整理会议纪要、生成会议周报、回顾一段时间内的会议内容时使用。SkillsJul 2026386k16k
  6. larksuite avatarlark-workflow-standup-report日程待办摘要:编排 calendar +agenda 和 task +get-my-tasks,生成指定日期的日程与未完成任务摘要。适用于了解今天/明天/本周的安排。SkillsJul 2026386k16k