json-canvas — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited json-canvas (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A canvas file (.canvas) contains two top-level arrays following the JSON Canvas Spec 1.0:
{
"nodes": [],
"edges": []
}.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 (50-100px spacing)nodes arrayfromNode and toNode to the source and target IDsfromSide/toSide (top, right, bottom, left) and labelNodes are objects placed on the canvas. Array order determines z-index (first = bottom 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 | string | Preset "1"-"6" or hex (e.g., "#FF0000") |
{
"id": "6f0ad84f44ce9c17",
"type": "text",
"x": 0, "y": 0, "width": 400, "height": 200,
"text": "# Hello World\n\nThis is **Markdown** content."
}Newline pitfall: Use \n in JSON strings. Do not use literal \\n.
{
"id": "a1b2c3d4e5f67890",
"type": "file",
"x": 500, "y": 0, "width": 400, "height": 300,
"file": "Attachments/diagram.png"
}{
"id": "c3d4e5f678901234",
"type": "link",
"x": 1000, "y": 0, "width": 400, "height": 200,
"url": "https://obsidian.md"
}{
"id": "d4e5f6789012345a",
"type": "group",
"x": -50, "y": -50, "width": 1000, "height": 600,
"label": "Project Overview",
"color": "4"
}| Attribute | Required | Default | Description |
|---|---|---|---|
id | Yes | - | Unique identifier |
fromNode | Yes | - | Source node ID |
toNode | Yes | - | Target node ID |
fromSide | No | - | top, right, bottom, or left |
toSide | No | - | top, right, bottom, or left |
fromEnd | No | none | none or arrow |
toEnd | No | arrow | none or arrow |
color | No | - | Line color |
label | No | - | Text label |
{
"id": "0123456789abcdef",
"fromNode": "6f0ad84f44ce9c17",
"fromSide": "right",
"toNode": "a1b2c3d4e5f67890",
"toSide": "left",
"label": "leads to"
}| Preset | Color |
|---|---|
"1" | Red |
"2" | Orange |
"3" | Yellow |
"4" | Green |
"5" | Cyan |
"6" | Purple |
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 |
After creating or editing a canvas file:
id values are unique across both nodes and edgesfromNode and toNode references an existing node IDtype is one of: text, file, link, grouptop, right, bottom, leftnone, arrow~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.