Obsidian Canvas text nodes exist only as raw JSON entries inside aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/redsheep913/Canvas-Card-Materializer/llms.txt
Use this file to discover all available pages before exploring further.
.canvas file. They have no independent presence in your vault — they can’t be linked to, searched, tagged, or versioned as standalone notes. Materialization is the process of extracting those ephemeral text nodes into real .md files that live in your vault like any other note. Once materialized, a node becomes a first-class citizen: it can appear in graph view, receive backlinks, and be opened directly from the file explorer.
How Materialization Works
The plugin executes the transformation in four sequential passes over the selected nodes.Pass 1 — File Creation
For each selected text node, the plugin:- Reads
node.textand splits it on newlines - Takes the first line as the note title, sanitizes it into a safe filename (stripping Markdown heading markers, backticks, and characters illegal on most filesystems)
- Truncates the filename to 50 characters to avoid path-length issues
- Resolves the target sub-folder from the node’s
colorproperty usingcolorFolderMap - Creates the
.mdfile at<canvas-parent-dir>/<canvas-name>/<ColorFolder>/<filename>.mdwith the remaining lines as the file body - Records the new
TFileobject and its metadata in an internalexportMapkeyed by the original node ID
vault.modify() rather than throwing an error.
Existing file nodes in the selection are handled gracefully — they are added to exportMap as-is so their connections can still be processed, but no new file is created for them.
Pass 2 — Edge Analysis
After all files exist, the plugin inspectscanvas.edges — a Set<CanvasEdge> exposed by Obsidian’s internal Canvas API. For each edge where both edge.from.node.id and edge.to.node.id are present in exportMap, it resolves an Obsidian-style wikilink path using:
Related-Note rather than a full vault path), which is then wrapped in [[...]] and queued under the source node’s ID in a linkUpdates map.
Pass 3 — Frontmatter & Backlinks
For every entry inexportMap, the plugin:
- Calls
app.fileManager.processFrontMatter()to safely inject two YAML keys:canvas_id(the original node UUID) andcanvas_color(the color code string) - Reads the file content, checks for the presence of
**Connected Nodes:**, and — if absent — appends the collected wikilinks under a horizontal rule
Pass 4 — Canvas Data Update
The plugin usescanvas.getData() to read the full canvas JSON, then maps over every node:
type: groupnodes are left completely untouched- Nodes whose IDs are in
exportMapand are stilltype: textare rewritten totype: file, withfileset to the new.mdpath andtextremoved - All original position coordinates (
x,y,width,height) are preserved via the spread operator (...n)
canvas.setData() in two steps: first a node-clearing flush (nodes set to [] while edges and groups are preserved) followed 100 ms later by the full updated node list, to avoid rendering glitches. canvas.requestSave() then persists the changes to disk without a full reload.
After materialization, each converted node changes from
type: text to type: file in the canvas JSON. The card still appears at exactly the same position in the visual layout, but it now references an actual vault file rather than storing raw text inline. You can double-click it to open the note in a new pane.