canvas — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited 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.
Treat a canvas as a vault-scoped JSON Canvas document. Keep reads read-only and route every requested mutation through one recoverable transaction.
Resolve the installed product root from this skill's own location, not from the vault or current working directory:
PRODUCT_ROOT=/absolute/path/to/installed/claude-obsidian
CORE="$PRODUCT_ROOT/scripts/claude-obsidian.py"
test -f "$CORE"Every ../wiki/references/ link in this file resolves the same way, relative to this skill's own directory under $PRODUCT_ROOT, never relative to the selected vault's wiki/ directory.
Prefer a separately installed kepano/obsidian-skills json-canvas skill for format details. Otherwise read references/canvas-spec.md. The open standard is JSON Canvas 1.0.
Use this skill for vault workflow and transaction safety even when an upstream syntax skill is available.
wiki/canvases/; use wiki/canvases/main.canvas only asthe default when the user did not name a board.
wiki/canvases/_index.md as an optional catalog. Add a new board to itin the same transaction when a catalog exists. Node or edge edits inside an existing board do not require a catalog change.
file cannot be deleted or renamed through this skill. Explain that boundary for a file-removal or file-rename request and return a separate cleanup plan; do not substitute host file tools or silently turn a rename into a copy.
file and background; reject absolute paths,.. traversal, home shortcuts, and paths that escape through symlinks.
transaction. If an optional capture or media capability is detected, compose with it and consume its returned vault-relative path. Do not assume a particular plugin, command, or session log, and do not download or copy assets in this skill.
link nodes for URLs. Accept HTTPS URLs only; a link node does not grantpermission to fetch the page. Creating its JSON makes no request, but opening it in Obsidian may fetch Open Graph metadata from that URL's host. Disclose that render-time egress and confirm it is acceptable; otherwise use a text node containing the URL.
For status or list requests, parse the selected .canvas files and report node counts, group labels, broken edge endpoints, and missing vault-relative file targets. If the default canvas is absent, report that fact and offer a creation preview; do not create it during a status request.
or null for a file that must be absent.
bottom-to-top z-order.
lowercase hexadecimal ID and verify it is unused.
x, y, width, and height values for every node.text, file, link, or group exactly as defined by JSON Canvas.fromNode and toNode to reference an existing or newlydrafted node.
parent. Use 20 px inner padding and 40 px gaps, wrap to a new row when needed, and preview any group expansion.
nodes and edges arrays.Minimal node examples:
{
"nodes": [
{
"id": "6f0ad84f44ce9c17",
"type": "text",
"text": "# Research map\n\nA concise orientation card.",
"x": 0,
"y": 0,
"width": 400,
"height": 180
},
{
"id": "a1b2c3d4e5f67890",
"type": "file",
"file": "wiki/concepts/Contextual Retrieval.md",
"x": 460,
"y": 0,
"width": 400,
"height": 240
}
],
"edges": []
}Use file plus optional subpath: "#Heading" for notes, images, PDFs, and other vault files. Use url only on a link node. Escape line breaks in JSON strings as \n, not as literal backslash-plus-n text.
Validate before showing the preview:
Build one claude-obsidian.transaction.v1 bundle with operation type canvas. Include the canvas and the catalog in that same bundle when the catalog changes. Read operation-transactions.md, then inspect the bundle before applying it:
python3 "$CORE" transaction inspect BUNDLE --vault VAULT
# Set APPROVAL_SHA256 to the inspect result's approval_sha256 after review.
python3 "$CORE" transaction apply BUNDLE --vault VAULT \
--approved-plan-sha256 "$APPROVAL_SHA256"For destructive edits within a board, including node or edge removal, obtain explicit consent after presenting the preview. These edits replace the board file through the transaction engine. Report the operation ID, exact changed paths, board name, node IDs, and final positions. Do not commit Git.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.