Arbor
approvedby kpyr
This plugin has not been manually reviewed by Obsidian staff. Write notes as branching Markdown cards while keeping a normal note as the source of truth.
Arbor
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 export step. No separate canvas file. No sidecar database.


The core idea:
- write in short blocks instead of one long wall of text
- see the current branch, nearby alternatives, and next steps at the same time
- reorganize ideas without copy-paste chaos
- stay inside one note instead of splitting thoughts across many files
Arbor is desktop-only. It currently requires Obsidian >= 1.5.12 and was tested on Obsidian 1.12.4.
Why Arbor
Arbor is for notes where order matters, but thought does not arrive linearly.
Good fit:
- article and essay drafting
- study notes with branches and alternatives
- argument building
- structured brainstorming
- rewriting and rearranging long notes without losing the original Markdown
Arbor is not a canvas, mind map, or whiteboard. It is still note editing, just with a branching spatial view.
Core Features
- Left-to-right branching editor for one Markdown note
- Stable block tree with inline editing
- Normal readable Markdown body as the source document
- Visible block markers plus hidden in-note metadata for exact recovery
- Selected block panel with focused preview and inline editing
- Context-aware dimming so the active branch stays readable
- Drag-and-drop reorder and reparent
- Keyboard-first navigation and structure editing
- Search overlay for block-level search
- Zoom, breadcrumbs, view menu, and context menus
- Auto-open managed Arbor notes in Arbor view
- Safe rebuild when the note changed in plain Markdown mode
Install
Community Plugins
Once Arbor is approved in the Obsidian community catalog:
- Open
Settings -> Community plugins -> Browse. - Search for
Arbor. - Install it.
- Enable it.
Manual install
If you want to install Arbor before it appears in the community catalog:
- Download
manifest.json,main.js, andstyles.cssfrom the latest GitHub release. - Create this folder in your vault:
.obsidian/plugins/arbor
- Place those three files inside it.
- Open Obsidian.
- Go to
Settings -> Community plugins. - Enable
Arbor.
Quick Start
- Open any Markdown note.
- Run
Open view for current note. - Create a root block.
- Press
Enteron a selected card to edit it. - Use
Ctrl/Cmd + Arrowto grow the structure. - Use the right-click menu to duplicate, move, delete, or continue a branch.
- Turn on
Selected block panelfrom the Arbor menu if you want a focused preview/editor panel.
Support
If Arbor is useful to you, you can support development here:
Built-In View Shortcuts
These work inside Arbor itself. They are not command-palette bindings.
Navigation
| 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 |
Editing
| Shortcut | Effect |
|---|---|
Enter in editor | Save block and leave edit mode |
Shift + Enter | Insert newline inside the block |
Escape | Cancel current edit |
Ctrl/Cmd + Z in editor | Native text undo inside the current textarea |
Structural creation
| 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:
Ctrl/Cmd + ArrowLeftis intentionally conservative and does nothing when the selected block is already at the root level.- Arbor uses
event.codefor view-level shortcuts where needed, so layout-dependent bindings like search remain stable across keyboard layouts. Delete subtreeshows a confirmation modal. NormalDelete blockdoes not.
Search and zoom
| 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 |
| Click zoom indicator | Reset zoom to 100% |
Command Palette Actions
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 |
| 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 |
View Menu
Arbor includes a compact view menu in the top-right corner of the editor.
Current menu actions:
- toggle
Selected block panel - toggle breadcrumb path
- toggle breadcrumb flow
- toggle
Ctrl/Cmd + wheelzoom - reset zoom to
100% - open Arbor settings
Settings
| Setting | Default | Meaning |
|---|---|---|
| Split direction | Vertical split | Where Arbor opens relative to the current note |
| 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 |
| 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 |
| Managed metadata block style | Multiline | Store hidden Arbor metadata as a multiline or compact HTML comment |
How Notes Stay Normal Markdown
Arbor does not move your note into a database or sidecar file.
Each Arbor note contains:
- the visible Markdown body
- machine-written block markers before each block in the visible body
- one hidden metadata block at the end of the same note
Example shape:
<!-- arbor:block:v1 id="root-1" parent="" order="0" -->
# A visible markdown note
This text is still readable in normal Obsidian.
<!-- arbor:metadata:v1
BASE64_ENCODED_JSON
-->
Important behavior:
- frontmatter is preserved
- the visible body stays readable if the plugin is disabled
- Arbor keeps stable block IDs in both visible markers and hidden metadata
- if hidden metadata is stale, Arbor can recover the exact block tree from the visible markers
- if you open an older Arbor note without visible markers, Arbor upgrades it automatically to the precise marker format
- if you edit the note in normal Markdown mode, Arbor will safely rebuild the tree from the visible note body instead of silently dropping content
Beautiful blocks in the > [!note] style are still normal Markdown callouts. In the screenshots and demo notes, that styling comes from Callout Manager.
Privacy and disclosures
- No account is required.
- No telemetry is collected.
- No ads are shown.
- Arbor does not make network requests for its core functionality.
- Arbor stores plugin settings with Obsidian's plugin data system.
- Arbor stores branch structure inside the note itself as hidden metadata comments.
- If you paste an image into a block, Arbor writes that image into your vault as a normal attachment.
Demo Notes
Arbor ships with a built-in demo note generator.
Use the command palette action:
Create demo note
The command creates a new Arbor-managed demo note in the current note folder, or in the vault root if there is no active note.
Compatibility
- Desktop only
- Obsidian
>= 1.5.12 - Tested on Obsidian
1.12.4 - Plugin ID:
arbor - Current version:
0.1.9
Known Limitations
- Arbor is intentionally desktop-first.
- Plain-Markdown rebuild is conservative by design. It protects content first and structure second.
- Undo and redo are Arbor view history, not native editor history.
- Very large notes can still benefit from future virtualization work.
Roadmap
- richer block search navigation
- stronger conflict handling when Arbor view and plain Markdown both change the same note
- more refinement for very large note trees
Development
Contributor 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.md
Repository Layout
arbor/
assets/
demo/
docs/
src/
model/
storage/
view/
tests/
manifest.json
package.json
styles.css
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.