JSON Canvas
Steph Ango (Obsidian)CommunityCreated by Steph Ango (Obsidian)
- Skill
- Tool integration
- Documents and content
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to generating and modifying .canvas files, which are JSON-based documents used for visual layouts, mind maps, and flowcharts. It covers the technical requirements for defining nodes (text, files, links, groups) and edges, ensuring that all files adhere to the JSON Canvas 1.0 specification. The skill includes guidelines for ID generation, layout positioning, and validation to ensure the resulting files are correctly formatted for use in compatible applications.
What it does
- Generates valid JSON structures for .canvas files
- Defines nodes including text, file references, external links, and organizational groups
- Creates edges to connect nodes with customizable anchor points and labels
- Provides validation steps to ensure ID uniqueness and reference integrity
- Offers layout guidance for node positioning and sizing
- Supports modification of existing canvas files by parsing and updating JSON attributes
When to use it
- When you need to programmatically create or update visual diagrams
- When working with Obsidian canvas files
- When building mind maps or flowcharts using JSON
- When you need to organize multiple files or links into a single visual workspace
Advantages
- Ensures adherence to the official JSON Canvas 1.0 specification
- Provides a clear checklist for validating file integrity
- Simplifies the process of managing complex node and edge relationships
- Standardizes the creation of visual layouts through defined attributes
Usage examples
- “Create a new canvas with a central text node and two connected supporting nodes.”
- Generates a JSON object containing three text nodes and two edges connecting the central node to the others.
- “Add a new group node labeled 'Project Tasks' to my existing canvas.”
- Appends a group node object to the existing nodes array with specified dimensions and label.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/kepano/json-canvas/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip json-canvas.zip -d .agents/skills
Documentation by Steph Ango (Obsidian)
JSON Canvas Skill
File Structure
A canvas file (.canvas) contains two top-level arrays following the JSON Canvas Spec 1.0:
{
"nodes": [],
"edges": []
}nodes(optional): Array of node objectsedges(optional): Array of edge objects connecting nodes
Common Workflows
1. Create a New Canvas
Create a
.canvasfile with the base structure{"nodes": [], "edges": []}Generate unique 16-character hex IDs for each node (e.g.,
"6f0ad84f44ce9c17")Add nodes with required fields:
id,type,x,y,width,heightAdd edges referencing valid node IDs via
fromNodeandtoNodeValidate: Parse the JSON to confirm it is valid. Verify all
fromNode/toNodevalues exist in the nodes array
2. Add a Node to an Existing Canvas
Read and parse the existing
.canvasfileGenerate a unique ID that does not collide with existing node or edge IDs
Choose position (
x,y) that avoids overlapping existing nodes (leave 50-100px spacing)Append the new node object to the
nodesarrayOptionally add edges connecting the new node to existing nodes
Validate: Confirm all IDs are unique and all edge references resolve to existing nodes
3. Connect Two Nodes
Identify the source and target node IDs
Generate a unique edge ID
Set
fromNodeandtoNodeto the source and target IDsOptionally set
fromSide/toSide(top, right, bottom, left) for anchor pointsOptionally set
labelfor descriptive text on the edgeAppend the edge to the
edgesarrayValidate: Confirm both
fromNodeandtoNodereference existing node IDs
4. Edit an Existing Canvas
Read and parse the
.canvasfile as JSONLocate the target node or edge by
idModify the desired attributes (text, position, color, etc.)
Write the updated JSON back to the file
Validate: Re-check all ID uniqueness and edge reference integrity after editing
Nodes
Nodes are objects placed on the canvas. Array order determines z-index: first node = bottom layer, last node = top layer.
Generic Node Attributes
| Attribute | Required | Type | Description |
|---|---|---|---|
id | Yes | string | Unique 16-char hex identifier |
type | Yes | string | text, file, link, or group |
x | Yes | integer | X position in pixels |
y | Yes | integer | Y position in pixels |
width | Yes | integer | Width in pixels |
height | Yes | integer | Height in pixels |
color | No | canvasColor | Preset "1"-"6" or hex (e.g., "#FF0000") |
Text Nodes
| Attribute | Required | Type | Description |
|---|---|---|---|
text | Yes | string | Plain text with Markdown syntax |
{
"id": "6f0ad84f44ce9c17",
"type": "text",
"x": 0,
"y": 0,
"width": 400,
"height": 200,
"text": "# Hello World\n\nThis is **Markdown** content."
}Newline pitfall: Use \n for line breaks in JSON strings. Do not use the literal \\n -- Obsidian renders that as the characters \ and n.
File Nodes
| Attribute | Required | Type | Description |
|---|---|---|---|
file | Yes | string | Path to file within the system |
subpath | No | string | Link to heading or block (starts with #) |
{
"id": "a1b2c3d4e5f67890",
"type": "file",
"x": 500,
"y": 0,
"width": 400,
"height": 300,
"file": "Attachments/diagram.png"
}Link Nodes
| Attribute | Required | Type | Description |
|---|---|---|---|
url | Yes | string | External URL |
{
"id": "c3d4e5f678901234",
"type": "link",
"x": 1000,
"y": 0,
"width": 400,
"height": 200,
"url": "https://obsidian.md"
}Group Nodes
Groups are visual containers for organizing other nodes. Position child nodes inside the group's bounds.
| Attribute | Required | Type | Description |
|---|---|---|---|
label | No | string | Text label for the group |
background | No | string | Path to background image |
backgroundStyle | No | string | cover, ratio, or repeat |
{
"id": "d4e5f6789012345a",
"type": "group",
"x": -50,
"y": -50,
"width": 1000,
"height": 600,
"label": "Project Overview",
"color": "4"
}Edges
Edges connect nodes via fromNode and toNode IDs.
| Attribute | Required | Type | Default | Description |
|---|---|---|---|---|
id | Yes | string | - | Unique identifier |
fromNode | Yes | string | - | Source node ID |
fromSide | No | string | - | top, right, bottom, or left |
fromEnd | No | string | none | none or arrow |
toNode | Yes | string | - | Target node ID |
toSide | No | string | - | top, right, bottom, or left |
toEnd | No | string | arrow | none or arrow |
color | No | canvasColor | - | Line color |
label | No | string | - | Text label |
{
"id": "0123456789abcdef",
"fromNode": "6f0ad84f44ce9c17",
"fromSide": "right",
"toNode": "a1b2c3d4e5f67890",
"toSide": "left",
"toEnd": "arrow",
"label": "leads to"
}Colors
The canvasColor type accepts either a hex string or a preset number:
| Preset | Color |
|---|---|
"1" | Red |
"2" | Orange |
"3" | Yellow |
"4" | Green |
"5" | Cyan |
"6" | Purple |
Preset color values are intentionally undefined -- applications use their own brand colors.
ID Generation
Generate 16-character lowercase hexadecimal strings (64-bit random value):
"6f0ad84f44ce9c17"
"a3b2c1d0e9f8a7b6"Layout Guidelines
Coordinates can be negative (canvas extends infinitely)
xincreases right,yincreases down; position is the top-left cornerSpace nodes 50-100px apart; leave 20-50px padding inside groups
Align to grid (multiples of 10 or 20) for cleaner layouts
| Node Type | Suggested Width | Suggested Height |
|---|---|---|
| Small text | 200-300 | 80-150 |
| Medium text | 300-450 | 150-300 |
| Large text | 400-600 | 300-500 |
| File preview | 300-500 | 200-400 |
| Link preview | 250-400 | 100-200 |
Validation Checklist
After creating or editing a canvas file, verify:
All
idvalues are unique across both nodes and edgesEvery
fromNodeandtoNodereferences an existing node IDRequired fields are present for each node type (
textfor text nodes,filefor file nodes,urlfor link nodes)typeis one of:text,file,link,groupfromSide/toSidevalues are one of:top,right,bottom,leftfromEnd/toEndvalues are one of:none,arrowColor presets are
"1"through"6"or valid hex (e.g.,"#FF0000")JSON is valid and parseable
If validation fails, check for duplicate IDs, dangling edge references, or malformed JSON strings (especially unescaped newlines in text content).
Complete Examples
See references/EXAMPLES.md for full canvas examples including mind maps, project boards, research canvases, and flowcharts.
References
Files
- ATTRIBUTION.mdAdded by AutoGineer873 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md7.4 KiB
- references/EXAMPLES.md6.3 KiB
ATTRIBUTION.md
Attribution
This folder is an unmodified copy of the Agent Skill "json-canvas", distributed by AutoGineer (https://autogineer.com/agent-skills).
Commit: 3ccff5338ea700537839b21900aa5358a0402c98
Created by: Steph Ango (Obsidian) (https://github.com/kepano)
Publisher: Steph Ango (Obsidian) (https://github.com/kepano)
Licence: MIT License (https://github.com/kepano/obsidian-skills/blob/3ccff5338ea700537839b21900aa5358a0402c98/LICENSE)
Licence evidence: repository licence LICENSE
Retrieved: 2026-11-07
The skill's own files are unmodified copies. AutoGineer is not affiliated with or endorsed by the author or the publisher.
Files added by AutoGineer
ATTRIBUTION.md: this file, written by AutoGineer
LICENSE: copied from LICENSE
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Steph Ango (Obsidian)
- Publisher
- Steph Ango (Obsidian) (Community)
- Source
- kepano/obsidian-skills · skills/json-canvas · commit 3ccff53
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Steph Ango (Obsidian) or Steph Ango (Obsidian).
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download json-canvas.zip