kpyr2k downloadsWrite notes as branching Markdown cards while keeping a normal note as the source of truth.
Think in branches. Keep one note.
Arbor is a writing-first branching editor for Obsidian. It lets you build a note as small Markdown blocks arranged left-to-right while keeping the note itself as a normal .md file.
No separate canvas file. No sidecar database.



The core idea:
Arbor works on desktop, phones, and tablets. It requires Obsidian >= 1.7.2.
Arbor is for notes where order matters, but thought does not arrive linearly.
Good fit:
Arbor is not a canvas, mind map, or whiteboard. It is still note editing, just with a branching spatial view.
ARBORUse a clean export copy as the Markdown handoff for Pandoc or another DOCX converter; Arbor does not generate DOCX directly.
Output Profiles let one Arbor note hold the complete tree while producing different versions such as Draft, Short version, or Final.
Full tree is built in, always includes every block, and is the default for existing notes.The source .md always retains the complete Arbor tree. Switching profiles, previewing, and exporting change the output version—not the source content.
Once Arbor is approved in the Obsidian community catalog:
Settings -> Community plugins -> Browse.Arbor.If you want to install Arbor before it appears in the community catalog:
manifest.json, main.js, and styles.css from the latest GitHub release..obsidian/plugins/arbor
Settings -> Community plugins.Arbor.Open view for current note.Enter on a selected card to edit it on desktop, or double-tap it on mobile.Ctrl/Cmd + Arrow to grow the structure.Selected block panel from the Arbor menu if you want a focused preview/editor panel.On a phone, Arbor keeps the selected block's sibling column on screen and puts navigation in a bottom action bar. Tap a card to select it; double-tap a card or use Edit to edit it. Save and Cancel are always visible while editing. Plain Enter makes a new line, while Ctrl/Cmd + Enter on a hardware keyboard saves. Pinch with two fingers in the branch editor to adjust card and text density without leaving the active sibling column.
In Tree Overview, drag with one finger to pan and pinch with two fingers to zoom. A drag never opens a card editor. Use the top-left map button to return to the branch editor.
If Arbor is useful to you, you can support development here:
These work inside Arbor itself. They are not command-palette bindings.
| Shortcut | Effect |
|---|---|
ArrowUp |
Select previous sibling |
ArrowDown |
Select next sibling |
ArrowLeft |
Select parent |
ArrowRight |
Select first child |
Home |
Jump to first sibling |
End |
Jump to last sibling |
Backspace / Delete |
Delete the selected block |
Enter |
Edit the selected block |
| Shortcut | Effect |
|---|---|
Enter in editor |
Save block and leave edit mode on desktop; insert a newline on mobile |
Shift + Enter |
Insert a newline inside the block on desktop |
Ctrl/Cmd + Enter |
Save the block on mobile with a hardware keyboard |
Escape |
Cancel current edit |
Ctrl/Cmd + Z in editor |
Native text undo inside the current textarea |
| Shortcut | Effect |
|---|---|
Ctrl/Cmd + ArrowUp |
Create sibling above |
Ctrl/Cmd + ArrowDown |
Create sibling below |
Ctrl/Cmd + ArrowRight |
Create child to the right |
Ctrl/Cmd + ArrowLeft |
Create a block to the left at parent level |
Notes:
Left to right layout. In Right to left, horizontal arrows and Ctrl/Cmd + horizontal-arrow creation mirror visually: ArrowLeft selects a child and ArrowRight selects the parent.Ctrl/Cmd + ArrowLeft is intentionally conservative and does nothing when the selected block is already at the root level.event.code for view-level shortcuts where needed, so layout-dependent bindings like search remain stable across keyboard layouts.Delete subtree shows a confirmation modal. Normal Delete block does not.| Shortcut | Effect |
|---|---|
Ctrl/Cmd + F |
Open Arbor search overlay |
Ctrl/Cmd + Z |
Undo the last Arbor structural/content change |
Ctrl/Cmd + Shift + Z |
Redo the last undone Arbor change |
Ctrl/Cmd + Mouse wheel |
Zoom the scene if zoom is enabled in settings |
| Mouse wheel over a branch column | Move through sibling blocks, or enter the visible parent/child column under the pointer |
| Click zoom indicator | Reset zoom to 100% |
Use Tree overview from the view menu or Command Palette to see every block in one connected map. Drag empty space to pan; Ctrl/Cmd + mouse wheel changes zoom. Cards render normal Obsidian Markdown and grow to fit their content. Select a card, then press Enter or double-click it to edit directly in place; Arbor smoothly reveals the editor when it is outside the viewport. Export the whole map as a PNG or one-page PDF from the overview menu. Overview always shows collapsed descendants and does not support drag-and-drop reparenting.
All of these are exposed as normal Obsidian commands. By default, they have no bound hotkey unless you bind one yourself in Obsidian.
| Command | ID | Scope | Default hotkey |
|---|---|---|---|
| Open view for current note | open-view |
Global | None |
| Create new note | create-note |
Global | None |
| Create new note in Markdown editor | create-note-markdown |
Global | None |
| Create demo note | create-demo-note |
Global | None |
| Export clean copy | export-clean-copy |
Arbor view | None |
| Open tree overview | open-tree-overview |
Arbor view | None |
| Return to branch editor | close-tree-overview |
Arbor view | None |
| Open block actions menu | open-block-actions-menu |
Arbor view | None |
| Create new root block | new-root-block |
Arbor view | None |
| Create sibling above | create-sibling-above |
Arbor view | None |
| Create sibling below | create-sibling-below |
Arbor view | None |
| Create child to the right | create-child-right |
Arbor view | None |
| Create block to the left at parent level | create-parent-level-block-left |
Arbor view | None |
| Select parent block | select-parent-block |
Arbor view | None |
| Select previous sibling block | select-previous-sibling-block |
Arbor view | None |
| Select next sibling block | select-next-sibling-block |
Arbor view | None |
| Select first child block | select-first-child-block |
Arbor view | None |
| Select first sibling block | select-first-sibling-block |
Arbor view | None |
| Select last sibling block | select-last-sibling-block |
Arbor view | None |
| Move block up among siblings | move-block-up |
Arbor view | None |
| Move block down among siblings | move-block-down |
Arbor view | None |
| Move block left to parent level | move-block-left |
Arbor view | None |
| Move block right to become child of previous block | move-block-right |
Arbor view | None |
| Delete block | delete-block |
Arbor view | None |
| Delete subtree | delete-subtree |
Arbor view | None |
| Duplicate block | duplicate-block |
Arbor view | None |
| Duplicate subtree | duplicate-subtree |
Arbor view | None |
| Toggle edit mode | toggle-edit-mode |
Arbor view | None |
| Reveal current block in linear Markdown | reveal-current-block-in-linear-markdown |
Arbor view | None |
| Rebuild linear Markdown from tree | rebuild-linear-markdown-from-tree |
Arbor view | None |
| Rebuild tree from metadata | rebuild-tree-from-metadata |
Arbor view | None |
| Undo branch action | undo-branch-action |
Arbor view | None |
| Redo branch action | redo-branch-action |
Arbor view | None |
Arbor includes a compact view menu in the top-right corner of the editor.
Current menu actions:
Manage output profiles…Output previewSelected block panelCtrl/Cmd + wheel zoom100%| Setting | Default | Meaning |
|---|---|---|
| Theme | Automatic |
Follow Obsidian, choose a built-in palette, or open Theme Studio for custom themes |
| Layout direction | Left to right |
Choose which physical side the root starts on; right-to-left also mirrors directional navigation and controls |
| Default opening mode | Branch editor |
Choose whether Arbor notes open in the branch editor or Tree Overview |
| Split direction | Vertical split |
Where Arbor opens relative to the current note; desktop only |
| Card width | 300 px |
Base card width in the branching scene |
| Card minimum height | 120 px |
Minimum card height before content expands it |
| Horizontal spacing | 20 px |
Gap between columns |
| Vertical spacing | 12 px |
Gap between sibling cards |
| Default zoom | 100% |
Initial scene scale when Arbor opens |
| Preview snippet length | 220 chars |
Maximum preview text for compact card snippets |
| Drag and drop | On |
Enable drag reorder and reparent; desktop only |
| Ctrl/Cmd + wheel zoom | On |
Allow scene zoom with Ctrl/Cmd + mouse wheel |
| Auto-open managed notes | On |
Open Arbor-managed notes directly in Arbor view |
| Show breadcrumb path | On |
Show the active path strip at the top |
| Show breadcrumb flow | On |
Show subtle connectors between breadcrumb items |
| Preferred breadcrumb line prefix | # |
Prefer the first non-empty line that starts with # when generating breadcrumb labels |
| Breadcrumb fallback | First non-empty line |
What Arbor uses when no preferred-prefix line exists |
| Selected block panel | Off |
Show the focused preview/editor panel for the selected block; desktop only |
Arbor does not move your note into a database or sidecar file.
Each Arbor note contains:
%% arbor:output comment for custom Output ProfilesExample shape:
<!-- arbor:block:v1 id="root-1" parent="" order="0" -->
# A visible markdown note
This text is still readable in normal Obsidian.
%% arbor:structure
```json
{
"arbor-plugin": "tree",
"version": 2,
"blocks": [{ "id": "root-1", "parent": null, "order": 0 }]
}
```
%%
Important behavior:
Beautiful blocks in the > [!note] style are still normal Markdown callouts. In the screenshots and demo notes, that styling comes from Callout Manager.
Arbor ships with a built-in demo note generator.
Use the command palette action:
Create demo noteThe command creates a new Arbor-managed demo note in the current note folder, or in the vault root if there is no active note.
>= 1.7.2arbor0.2.9Contributor workflow:
npm install
npm run dev
Release checks:
npm run lint
npm run build
npm test
Arbor includes a local eslint-plugin-obsidianmd setup so the same reviewer-facing checks can be run before submission updates.
Manual interaction checks live in:
docs/manual-qa.mdarbor/
assets/
demo/
docs/
src/
model/
storage/
view/
tests/
manifest.json
package.json
styles.css