skills/33-Galaxy-Dawn-claude-scholar/skills/json-canvas/SKILL.md
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.
npx skillsauth add brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research json-canvasInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.canvas file with the base structure {"nodes": [], "edges": []}"6f0ad84f44ce9c17")id, type, x, y, width, heightfromNode and toNodefromNode/toNode values exist in the nodes array.canvas filex, y) that avoids overlapping existing nodes (leave 50-100px spacing)nodes arrayfromNode and toNode to the source and target IDsfromSide/toSide (top, right, bottom, left) for anchor pointslabel for descriptive text on the edgeedges arrayfromNode and toNode reference existing node IDs.canvas file as JSONidNodes are objects placed on the canvas. Array order determines z-index: first node = bottom layer, last node = top layer.
| 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") |
| 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.
| 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"
}
| 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"
}
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 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"
}
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.
Generate 16-character lowercase hexadecimal strings (64-bit random value):
"6f0ad84f44ce9c17"
"a3b2c1d0e9f8a7b6"
x increases right, y increases down; position is the top-left corner| 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 |
After creating or editing a canvas file, verify:
id values are unique across both nodes and edgesfromNode and toNode references an existing node IDtext for text nodes, file for file nodes, url for link nodes)type is one of: text, file, link, groupfromSide/toSide values are one of: top, right, bottom, leftfromEnd/toEnd values are one of: none, arrow"1" through "6" or valid hex (e.g., "#FF0000")If validation fails, check for duplicate IDs, dangling edge references, or malformed JSON strings (especially unescaped newlines in text content).
See references/EXAMPLES.md for full canvas examples including mind maps, project boards, research canvases, and flowcharts.
tools
Recommend AND run open-source AI tools, agents, Claude Code / Codex skills, and MCP servers for any stage of a literature review — searching, reading, extracting, synthesizing, screening, citation-checking, and paper writing. Use when the user asks "what tool should I use to..." OR "install/run/use <tool> to ..." for research/lit-review work: automating a survey or related-work section, PDF→Markdown extraction for LLMs (MinerU/marker/docling), PRISMA / systematic review (ASReview), citation-backed Q&A over PDFs (PaperQA2), wiring papers into Claude/Cursor via MCP (arxiv/paper-search/zotero servers), or chatting with a Zotero library. Ships a launcher (scripts/litrun.py) that installs each tool in an isolated venv and runs it. Curated catalog of 70+ vetted projects. 支持中英文(用于「文献综述工具选型」与「一键安装/运行」)。
development
Route empirical-research requests through the Auto-Empirical Research Skills catalog when this whole repository is installed as one skill in Codex, CodeBuddy, Claude Code, or another IDE. Use to choose and load the right vendored AERS skill for causal inference, econometrics, replication, data acquisition, manuscript writing, peer review and referee responses, citation checking, de-AIGC editing, or full empirical-paper workflows without reading the entire repository at once.
documentation
Use when the project collects primary data or runs a field, lab, or survey experiment, before the intervention begins — write the pre-analysis plan, size the sample from a power calculation, and register with the AEA RCT Registry. Apply after the design is chosen in aer-identification and before any outcome data are seen.
tools
Guide economists to authoritative data sources with explicit, confirmed data specifications before retrieval; interfaces with Playwright MCP to navigate portals and extract real data, not articles about data.