Arbor

by kpyr
5
4
3
2
1
Score: 50/100

Description

Write notes as branching Markdown cards while keeping a normal note as the source of truth.

Reviews

  • Exo Frame
    Reviewed on Oct 10th, 2026
    Really nice plugin, makes it much easier to organize thoughts and ideas without getting lost in long notes

Stats

13
stars
3,717
downloads
1
forks
71
days
2
days
5
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
8
total issues
1
open issues
7
closed issues
227
commits

Latest Version

5 days ago

Changelog

Grow in every direction

Arbor 0.3.0 gives your ideas more room to grow: a vertical Tree Overview, expressive card and branch colors, and faster ways to find and connect blocks. Your notes remain ordinary Markdown.

Updated build — October 5: layout choices are now saved per note and survive closing/reopening and renaming, while plugin settings remain the default. The plugin files below were rebuilt from 162d2a6. If you already installed 0.3.0, reinstall the three plugin files to get this refresh; Obsidian does not automatically download a same-version asset update. The original 0.3.0 tag remains unchanged.

Vertical Tree Overview with inherited branch colors

A new direction for Tree Overview

  • Grow upward from a root at the bottom, or downward from a root at the top. Horizontal remains available.
  • Choose the default in Settings → Arbor → Tree overview layout, or save a different layout for the current note through the view menu.
  • Keyboard arrows, Ctrl/Cmd + arrow creation and touch controls follow the layout. LTR/RTL still controls sibling order.
  • Export the current layout as a high-quality PNG or single-page PDF, with upright text and preserved colors.

The note's layout is saved in its hidden Arbor metadata, independently of Output Profiles. It survives closing/reopening, renaming and sync to another device. Notes without their own choice follow the plugin default. Returning to Branch Editor keeps its familiar horizontal layout.

Color one card — or an entire branch

Use a card's right-click menu to open Card color… or Branch color…. Pick a swatch, enter a HEX value, or use the color picker, with a preview before applying.

  • Card colors affect only that card.
  • Branch colors apply to the parent and are inherited by existing and new descendants. Individually colored descendants keep their overrides.
  • Reset to the inherited or theme color at any time.
  • Colors survive reloads, moving, duplication and undo/redo. Tree exports preserve them; clean Markdown stays undecorated.

Branch color controls with swatches, HEX input and a preview

Find it. Follow it. Keep writing.

  • Block search now lists titles, highlighted matches and paths. Use ↑/↓ and Enter, or click a result, to reveal the matching card in either view. Long lists scroll and adapt to mobile.
  • Links on cards open consistently in Branch Editor and Tree Overview, including headings, block anchors and PDF subpaths. Ctrl/Cmd-click and middle-click preserve Obsidian's new-pane behavior.
  • Same-note links reveal their target card directly, without a native-protocol round-trip or leaving Arbor.
  • If you use the optional Heading Linker plugin, its indexed terms and aliases can link to headings in other cards of the same note. Its scope and opt-out settings are respected, and ambiguous targets are left unlinked.

Smoother, steadier editing

  • Parent columns no longer jump when a differently sized branch appears or disappears; selection animations remain intact.
  • Narrow trees open centered, and navigation keeps the selected card visible.
  • Inline Overview editing moves neighbors and connectors out of the way without losing your draft, focus or caret.
  • Long profile names show their beginning, with a gentle hover scroll to read the rest.
  • Card previews fade into their actual color; active-card scrollbars sit closer to the edge without shifting text.
  • Rendered content and exports follow Obsidian's text font. PNG/PDF connector lines no longer become black filled shapes.
  • Window-owned timers improve popout compatibility, and the modular view lifecycle guards against stale work after note switches.

Compatibility & updating

Supports desktop and mobile, with Obsidian 1.7.2 or newer. No manual note migration is required.

Update through Obsidian's Community Plugins. For a manual installation, download main.js, manifest.json and styles.css below and place them in your vault's .obsidian/plugins/arbor folder.

Full changelog · All changes since 0.2.9

README file from

Github

Arbor

Think in branches. Keep one note.

Arbor is a writing-first branching editor for Obsidian. Build a note as small Markdown blocks in a horizontal Branch Editor or a horizontal/vertical Tree Overview, while keeping the note itself as a normal .md file.

No separate canvas file. No sidecar database.

Arbor hero screenshot

Arbor workflow preview

Arbor Tree Overview

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 works on desktop, phones, and tablets. It requires Obsidian >= 1.7.2.

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

  • Horizontal branching editor for one Markdown note, with left-to-right or right-to-left layout
  • Stable block tree with inline editing
  • Normal readable Markdown body as the source document
  • Visible block markers plus a readable in-note structure footer, with optional evidence for locating card text
  • 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
  • Block search with selectable results, highlighted snippets and paths; use arrows and Enter or click to reveal a card
  • Zoom, breadcrumbs, view menu, and context menus
  • Whole-tree Overview with connected Markdown cards and horizontal, upward, or downward layouts saved per note
  • Tree Overview export as a PNG or one-page PDF
  • Touch-first phone editor with a focused sibling column and 44 px action controls
  • One-finger Tree Overview pan and two-finger pinch zoom
  • Automatic and custom palettes through Theme Studio
  • Individual card colors and inherited branch colors
  • Rendered cards and tree exports follow Obsidian's text font
  • Mouse-wheel navigation through sibling blocks and visible branch columns
  • Auto-open managed Arbor notes in Arbor view
  • File Explorer labels that mark managed notes with ARBOR
  • Clean Markdown export copies with an optional YAML frontmatter
  • Named Output Profiles for producing several clean versions from one complete tree
  • Reconcile unambiguous edits made in normal Markdown mode

Use a clean export copy as the Markdown handoff for Pandoc or another DOCX converter; Arbor does not generate DOCX directly.

Output Profiles

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.
  • Use the profile pill in the Arbor toolbar, then Manage output profiles…, to create, duplicate, rename, delete, or switch profiles.
  • In a custom profile, right-click a card to Include block only, Exclude block only, Include subtree, or Exclude subtree. Inherited exclusions stay visible in the editor and explain which parent rule caused them.
  • Presets in Output profiles provide Include all, Exclude all, Invert selection, Include only selected branch, Root blocks only, and Reset profile.
  • Output preview renders only the included Markdown in the current Arbor view. It never creates a temporary file or changes the source note.
  • Export clean copy… exports the active profile and can either omit excluded blocks or keep them as HTML comments. YAML frontmatter can be kept or removed independently.

The source .md always retains the complete Arbor tree. Switching profiles, previewing, and exporting change the output version—not the source content.

Install

Arbor is available in the Obsidian community catalog.

  1. Open Settings -> Community plugins -> Browse.
  2. Search for Arbor.
  3. Install it.
  4. Enable it.

Manual install

Use this alternative if you prefer to install the plugin files yourself.

  1. Download manifest.json, main.js, and styles.css from the latest GitHub release, not the source-code archives.
  2. Create this folder in your vault:
.obsidian/plugins/arbor
  1. Place those three files inside it.
  2. Open or restart Obsidian so it loads the installed files.
  3. Go to Settings -> Community plugins.
  4. Enable Arbor.

For updates, use Check for updates in Community Plugins. For a manual update, replace only those three files and restart Obsidian; keep data.json to preserve your settings. See the latest release for changes and any update-specific instructions.

Quick Start

  1. Open any Markdown note.
  2. Run Open view for current note.
  3. Create a root block.
  4. Press Enter on a selected card to edit it on desktop, or double-tap it on mobile.
  5. Use Ctrl/Cmd + Arrow to grow the structure.
  6. Use the right-click menu or the mobile block-actions menu to duplicate, delete, or continue a branch.
  7. Turn on Selected block panel from the Arbor menu if you want a focused preview/editor panel.

Rendered links in Branch Editor and Tree Overview are clickable: internal links open their note, heading, block, or PDF destination. Ctrl/Cmd-click or middle-click opens a new tab. A link click stays separate from card selection and editing; double-click the card's ordinary text to edit it.

When Heading Linker is enabled, Arbor can also turn indexed terms and aliases into links to headings in other cards of the same note. Include that note in Heading Linker's glossary sources and highlighting scope, and enable Reading highlighting. Arbor preserves your Markdown, skips headings, code, math and existing links, and leaves ambiguous local targets unlinked. An ordinary click reveals the target card in the current view; Ctrl/Cmd-click and middle-click retain Obsidian's normal new-pane behavior.

Bring content into a card

In Branch Editor (left-to-right or right-to-left) and Tree Overview, drop supported text or a source link onto a card to append it after a blank line. When editing a card, drop or paste at the textarea caret; selected text is replaced. The edit remains a draft until you use the normal save action. Arbor copies the provided content without cutting or editing the original source. Generated source links are retained with imported Markdown; plain text does not gain a citation automatically.

Use Paste content into card from a card's actions menu (including the mobile block-actions menu), or run Paste content into card from the Command Palette for the currently selected Arbor card. It has no default hotkey. Output Preview and empty background are not targets. If clipboard access is denied, Arbor opens the original card editor so you can use the system Paste command; the current draft is kept.

To create a block instead, drag text or a source reference over a card: two dashed targets appear beside it. New block beside creates a sibling at the same level; New child block adds it inside that branch. Drop onto the card itself to append as before. These targets work in both Branch Editor and Tree Overview, including vertical layouts.

You can also drop an image file onto a rendered card or either new-block target. New files are saved to Obsidian's configured attachment location; an existing image dragged from the vault is embedded without copying it.

Raw binary payloads, HTML-only content, and full Arbor documents are not imported as card text. Supported Obsidian file/link drags can insert a reference; images keep their existing editor attachment path. For cross-folder references, use a reader-generated link or copy a Markdown link; ambiguous raw relative links are not guaranteed to resolve. If a failed import leaves incoming content available, Retry and Copy are view-local for the current view session, not disk or crash recovery. Copy it before reloading if you need to preserve it. Native text Undo depends on the host's edit-history support.

Mobile controls

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 Return to branch editor in the view menu to switch back.

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 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

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:

  • The tables describe horizontal Left to right layout. In horizontal Right to left, horizontal arrows and Ctrl/Cmd + horizontal-arrow creation mirror visually: ArrowLeft selects a child and ArrowRight selects the parent. Vertical Tree Overview uses the mappings below.
  • The parent-direction creation shortcut is intentionally conservative and does nothing when the selected block is already at the root level.
  • Arbor uses 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.

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
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%

Tree overview

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.

Set Tree overview layout in Arbor settings to Horizontal (the default), Vertical — root at bottom (children grow upward), or Vertical — root at top (children grow downward). The same choices in the view menu save the layout for the current note. Notes without their own choice follow the plugin setting.

The note's layout is stored in its hidden Arbor metadata, so it survives closing the tab, restarting Obsidian, renaming the note and syncing it to another device. It applies to every tab showing that note, independently of other notes and Output Profiles. Changing orientation preserves the Markdown body, an active editor draft and content undo/redo history. Return to branch editor keeps Branch Editor horizontal.

Vertical Overview shortcut Root at top Root at bottom
Select parent ArrowUp ArrowDown
Select child ArrowDown ArrowUp
Previous / next sibling (left to right) ArrowLeft / ArrowRight ArrowLeft / ArrowRight

Layout direction still controls left-to-right or right-to-left sibling order: in vertical right-to-left mode, previous/next sibling arrows swap, but parent/child remain vertical. Ctrl/Cmd plus a direction arrow creates in that direction: child along the child arrow, sibling along previous/next, or a parent-level sibling along the parent arrow. Home/End shortcuts are Branch Editor-only; number keys select a numbered child (0 selects the parent). The touch dock keeps its Parent/Previous/Next/Child actions with arrows matching the effective layout; its add menu still creates a child or next sibling. PNG and one-page PDF exports use the current Overview orientation and sibling direction, with upright text.

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
Export clean copy export-clean-copy Arbor view None
Export tree overview export-tree-overview 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
Paste content into card paste-content-into-card Active selected Arbor card 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 its toolbar. The adjacent profile pill switches Output Profiles or opens Manage output profiles….

Use the view menu to:

  • search blocks, zoom in/out, or reset zoom to 100%
  • switch between Tree Overview and Branch Editor
  • save a horizontal, upward, or downward Tree Overview layout for this note
  • open Output preview
  • export a clean Markdown copy or the tree as PNG/PDF
  • open the source note in Markdown
  • toggle Selected block panel
  • toggle breadcrumb path
  • toggle breadcrumb flow
  • toggle Ctrl/Cmd + wheel zoom
  • open Arbor settings

For Card color…, Branch color…, or Copy block link, open a card's block-actions menu.

Settings

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 the root side in horizontal views or sibling order in vertical Tree Overview; directional navigation and controls mirror accordingly
Tree overview layout Horizontal Default for notes without a saved layout; use the view menu to save a different layout for a specific note
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

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
  • an optional %% arbor:output comment for custom Output Profiles
  • one readable structure footer at the end of the same note; structure-v2 may also include optional source-location evidence

Minimal compatible note shape (optional source-location evidence is omitted):

<!-- 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:

  • frontmatter is preserved
  • the visible body stays readable if the plugin is disabled
  • Arbor keeps stable block IDs in both visible markers and the readable structure footer
  • optional sourceMap evidence records body ranges and a fingerprint, not a second copy of note content or a sidecar; visible Markdown remains the source of text
  • when evidence is stale, unambiguous visible markers can still be reconciled; if marker boundaries are ambiguous, Arbor refuses to guess
  • if you open an older Arbor note without visible markers, Arbor upgrades it automatically to the precise marker format
  • older plugin versions ignore optional evidence. A downgrade is not guaranteed to preserve notes whose content makes visible marker boundaries ambiguous (for example, literal markers or unfinished code fences); make a clean copy before opening such a note with an older version

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 a readable Obsidian comment footer.
  • 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

Known Limitations

  • 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.
  • Mobile Tree Overview exports are capped at 4,096 px on a side and 8 MP before rendering, to avoid unsafe raster allocations.
  • Vertical layouts are available in Tree Overview only; Branch Editor remains horizontal.

Feedback and feature requests

Report bugs or suggest improvements in GitHub Issues. Check existing issues first; for a bug, include your Obsidian and Arbor versions, device/platform, and steps to reproduce it.

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.

Also check editing, keyboard navigation, links, drag-and-drop, zoom and exports in both views on desktop and mobile before a release.

Repository Layout

arbor/
  assets/
  demo/
  src/
    model/
    storage/
    view/
  tests/
  manifest.json
  package.json
  styles.css