zenolzx76 downloadsCreate collapsible Canvas mind maps from Markdown with seven layouts.
简体中文 | English
Think in a mind map, create a Markdown note, and keep writing.
Canvas Mind Map offers three workspaces: Native Canvas for native cards, Organic for existing Markdown, and Composer for creating a new document from a blank mind map. Organic and Composer share the curved-branch renderer and layouts, but save to different sources.
Available in the Obsidian Community Plugins directory. Open the plugin page · Download releases.
This README describes the current source, including Composer's thinking and writing tools (v1.1 / v1.2 roadmap). Features available in a packaged version are listed in its release notes.
| Mode | Source and saving | Purpose | Entry point |
|---|---|---|---|
| Native Canvas | Native Canvas nodes and edges | Seven layouts, movable cards and native Canvas interaction | Generate a mind map from a Canvas note/text card |
| Organic | An existing .md file; Edit writes to that file |
View reads/navigates; Edit changes headings and direct section bodies | Right-click a Markdown file → Open note in Organic mode, or run that command |
| Composer | A plugin draft; no .md file until Create Note |
Start blank or from a template, collect ideas, organize and write | Ribbon / command New Mind Map Document, or folder menu New Mind Map Document here |
For a new document, start with Composer. For an existing note, use Organic Edit. For movable cards, follow Native Canvas Quick Start. View / Edit are states inside Organic; Native's title / body choices control card content, not the workspace mode.
New Mind Map Document → Composer draft → Create Note → Organic Edit ⇄ View
Organic opens in its own tab and never converts or overwrites a .canvas file. In View mode, a sole top-level heading becomes the center; otherwise the note name is used. Notes without headings show the note name. Initially the center (depth 0) and two descendant levels are visible. Click a heading to open its source line, including repeated headings; use the small +/− controls to fold branches. Folding preserves branch color, side, order and the clicked heading's screen position.
Drag the background to pan, scroll to zoom around the pointer, or use the toolbar's zoom and Fit to view controls. With the background focused, arrow keys pan, +/− zoom and 0 fits the map. Headings and fold controls are keyboard accessible.
Organic automatically refreshes after source changes (500ms debounce), preserving matched heading state and the viewport. Refresh remains available. Heading identity is reconciled using section content and hierarchy; ambiguous edits safely discard unmatched state. Source navigation still checks for stale content before jumping.
Use Search headings or Ctrl/Cmd+F inside Organic to search all headings, including folded descendants. Enter/Shift+Enter moves between results; Esc clears search. Right-click a heading to Focus branch or Read this branch. Focus shows its subtree and ancestor path; Reading follows Markdown order with ↑/↓ and smooth viewport movement. Search outside a focused branch temporarily suspends Focus and restores it when cleared. Temporary expansion does not overwrite manual folding.
The layout selector offers Organic Radial, Organic Horizontal, and Compact Organic. Fold animations respect reduced motion. Export → SVG / PNG saves the current visible structure (including Focus and folding) next to the source note, with numbered filenames to avoid overwriting. PNG defaults to 2x; 1x/2x/3x are available in settings. Very large PNG dimensions are rejected with a suggestion to reduce scale or use SVG.
Folding, zoom, viewport center, Focus, Reading position, selection and layout are stored in plugin data by source path. Rename/move migrates saved state; deletion removes it. Multiple tabs interact independently; the most recent user interaction owns the saved state. Settings provide automatic refresh, remembered state/reset, default layout, animation/duration and PNG scale. View explores the note; Edit writes changes to the source Markdown and provides its own editing history.
The root suggests a filename, which can be changed independently in the create dialog. Document name only exports children as H1; Use root as H1 exports the root as H1 and children as H2. Structural operations and root-behavior changes validate the complete subtree against H6. Create section headings as map nodes, rather than placing headings in a heading node's body.
? prefix and dashed outline; Todo nodes have a checkbox indicator and Mark complete / incomplete action.Search or Ctrl/Cmd+F searches Titles, Bodies, or Everything, including folded and unsorted nodes. Enter / Shift+Enter cycles results; Esc closes search. Focus shows the selected branch and its ancestor path; Show overview restores the document. Search can temporarily show a result outside Focus without changing saved fold flags. The node menu also provides Expand one level, Expand branch, Collapse branch, and Show to level….
Use New Composer from template in the command palette, or ⋯ → New from template, for Blank, Essay, Project Plan, Meeting Notes, Research Notes or Course Notes. Each opens a new draft. ⋯ → Duplicate draft makes an independent copy, including bodies, types, properties and unsorted ideas.
⋯ → Document properties edits YAML frontmatter without --- delimiters. It must be a YAML mapping; valid properties are placed before the introduction. ⋯ → Copy outline copies a Markdown bullet outline, including Todo checkboxes and an Unsorted Ideas group. The status line shows section, idea, Todo, unsorted-node and word/character counts plus draft save status.
Create Note checks structure and filenames, uses an existing vault folder, and never overwrites another note. The root-name suggestion and filename can differ. An empty export requires confirmation. Preview Markdown shows the same generated text used for creation.
| Content | Export behavior |
|---|---|
| Heading | Markdown heading followed by its direct body and children |
| Idea | Explicitly choose Convert to headings, Convert to bullet items, Exclude idea branches, or Review individually to change node types first |
| Todo | - [ ] or - [x] list item |
| Bullet / Todo branch | Descendants become nested list items, including nodes previously typed as headings; bodies remain inside their list items |
| Unsorted Ideas | Explicitly choose Append to document or Exclude and keep draft |
Excluding an Idea excludes its whole branch. Whenever any content is excluded, the complete draft remains available after note creation. Otherwise it is removed only after Organic Edit initializes successfully. Selection and folding transfer by generated source positions; nodes exported as list items select their nearest exported heading, or the document introduction.
Draft saved means plugin data is saved, not that a Markdown file exists. Drafts autosave after 500ms and survive tab closure. Restore Composer Draft reopens drafts and provides Rename / Duplicate / Delete plus recovery-data import. Close an open draft before deleting it from that list, or use its Discard draft menu. Save failures offer retry and copyable recovery data. Undo history belongs to the current editing session and is not restored after reopening.
| Key / gesture | Action |
|---|---|
| F2 / double-click | Rename the document or node |
| Enter / Tab | Add sibling / child; continue creating while typing a new node |
| Shift+Tab / Alt+← | Promote |
| Alt+→ | Demote below the preceding sibling |
| Alt+↑ / Alt+↓ | Reorder siblings |
| Arrow keys | Navigate visible nodes / parent / first child |
| Delete | Delete selection; branches offer keep-children choice |
| Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z | Undo / redo, including body and batch changes |
| Ctrl/Cmd+Enter | Focus direct-body editor; Esc returns to the map |
| Ctrl/Cmd+F | Open Composer search while the map has focus |
Background drag / wheel / + / - / 0 |
Pan / zoom / zoom / fit |
Horizontal, Radial and Compact reuse Organic's layout and renderer. Composer remembers its layout and panel width defaults independently of Organic.
The current Composer remains a document tree. The proposed v2 features—non-tree relationships, shared ideas and free-form knowledge mapping—are not implemented.
.md file.Drag a heading to move its entire section, including its body and descendants. Drop targets offer Before / Make child / After with a preview. You can also promote, demote, or reorder sections with the keyboard. Operations that create cycles or exceed H6 are rejected. Deletion asks whether to remove the entire subtree or keep its body and promote its children.
These shortcuts apply while the map has focus:
| Key | Action |
|---|---|
| Double-click / F2 | Rename a heading inline |
| Enter / Tab | Add a sibling / child section |
| Shift+Tab or Alt+← | Promote a section |
| Alt+→ | Make it a child of the preceding sibling |
| Alt+↑ / Alt+↓ | Move before / after a sibling |
| ↑ / ↓ / ← / → | Select previous sibling / next sibling / parent / first child |
| Delete | Open the deletion dialog |
| Ctrl/Cmd+Enter | Focus the section body editor |
| Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z | Undo / redo a structural edit |
When creating headings inline, Enter confirms and starts another sibling; Tab confirms and starts a child. Esc cancels the draft. In the body editor, undo/redo edits text; Esc returns focus to the map. The editor supports Markdown highlighting and Ctrl/Cmd+B/I/K for bold, italic, and links.
Drag the divider to resize the body panel, or hide it through the more menu. The filename root provides access to text before the first heading and lets you add top-level sections; it does not rename the file. Mode and split-view state can be restored when reopening; undo history lasts only for the current session.
Edits update the original Markdown. If another editor has unsaved changes, save there first and refresh the map. External refreshes preserve unsaved body drafts; failed saves on closing offer draft recovery. Renaming headings does not update links in other notes. See the Writing Mode guide (Chinese) for conflict handling and current editor/line-ending limitations.
The existing features below describe Native Canvas. Its title/body content options are separate from rendering modes.
Download main.js, manifest.json, and styles.css from the same version on the GitHub Releases page.
Open your Obsidian vault directory and navigate to .obsidian/plugins/. Create a folder named canvas-mind-map:
.obsidian/plugins/canvas-mind-map/
Place main.js, manifest.json, and styles.css inside this folder. The final directory structure should look like this:
.obsidian/
└── plugins/
└── canvas-mind-map/
├── main.js
├── manifest.json
└── styles.css
Reload Obsidian, go to Settings → Community plugins, find Canvas Mind Map, and enable it.
If the plugin does not appear in the list, make sure all three files are located directly inside
.obsidian/plugins/canvas-mind-map/, then restart Obsidian.
Requires Obsidian 1.7.7 or later.
If you previously used the mind map functionality from Enhanced Canvas, disable the old plugin first. Existing mind map metadata from the old implementation is currently not compatible.
The default configuration is Title only + Bidirectional horizontal layout, displaying the mind map up to level 2. Saved layout preferences remain respected.
If the source contains only one top-level heading, that heading becomes the center node. If there are multiple top-level headings, they are arranged around the note center.
Generating a mind map replaces the source card and reconnects existing external edges to the new center node. The operation can be reverted with Undo.
Open the context menu on any mind map node to:
Each mind map stores its layout independently.
All seven layouts pack complete subtrees using actual card dimensions and progressively shorter base gaps. Radial layout allocates sectors by subtree weight. Expansion fixes the clicked card and its ancestor path and arranges its descendants; other first-level branches and ordinary Canvas cards remain in place. Subtrees can extend outward to avoid obstacles. Explicit relayout rearranges the entire map and replaces manual positions.
New maps use branch colors: descendants and native edges inherit their first-level branch's palette identity. Title mode also uses lightweight cards and typography hierarchy; body mode retains its reading space. Existing maps are unchanged on load: use Relayout for improved geometry and Options → Apply branch appearance (keep customizations) for the new appearance. Manual card colors, dimensions and edge colors are preserved. Restore level template resets a single card. Native curves remain rendered by Obsidian.
During refresh, if an existing node cannot be matched—for example because a heading was deleted, renamed, moved to another parent, or duplicated—the plugin displays a confirmation dialog before applying the changes.
Node.js and npm are required:
npm install
npm run build
The production build checks TypeScript and generates main.js. Copy it with manifest.json and styles.css into your vault's plugin directory. For development, npm run dev rebuilds on source changes; stop it with Ctrl+C.
Run npm test for the Native, Organic and Composer model regressions. npm run test:composer-browser exercises Composer interactions and the Organic handoff in a headless browser with simulated Obsidian APIs. Set CMM_PLAYWRIGHT to a Playwright module path and CMM_BROWSER to a Chromium/Edge executable when using a different local test setup. These tests do not replace checking a real vault.
Report bugs and suggestions through GitHub Issues. Include your Obsidian and plugin versions, rendering mode, View/Edit mode, layout, reproduction steps, and a shareable minimal note.
Based in part on Enhanced Canvas, including Canvas integration and helper implementations. Thanks to its author and contributors.
Licensed under the MIT License, with upstream copyright notices preserved.