MCPcopy Create free account
hub / github.com/avelino/outl

github.com/avelino/outl @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
3,908 symbols 13,730 edges 476 files ⚖ MIT 1,334 documented · 34% updated 7d agov0.12.0-beta.165 · 2026-08-19★ 15131 open issues

Browse by type

Functions 3,488 Types & classes 420
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

outl

outl

Local-first outliner. Markdown is the source of truth. Sync that doesn't corrupt your tree when two devices edit offline.

Inspired by Roam Research and Logseq. Tree CRDT sync (Kleppmann et al. 2022), per-device append-only op log, IDs in a sidecar so the .md you see is the .md you wrote.

Install

# macOS / Linux via Homebrew (beta channel — every push to main)
brew tap outlmd/outl https://github.com/outlmd/outl
brew trust outlmd/outl # one-time, third-party tap
brew install outl-beta # TUI/CLI/MCP
brew install --cask outl-desktop-beta # GUI

iOS beta on TestFlight: join here. Point the TUI at the same iCloud Drive container (<container>/Documents/) and both clients share a workspace.

Android: a signed arm64 APK (outl-android-arm64.apk) rides every release. Sideload-only for now — not on Play, and each release is signed with a fresh key, so a new build means uninstalling the old one first (#171).

Quick start

outl init ~/notes              # scaffold a workspace
outl --workspace ~/notes       # opens the TUI on today's journal

Press ? for keymap, : for the command palette, Ctrl+P to fuzzy-jump.

Coming from Logseq or Roam?

outl import logseq ~/path/to/logseq-graph ~/notes
outl import roam ~/Downloads/backup.json ~/notes

The importers (Roam, Logseq, Obsidian — or auto to detect) resolve ((uid)) block refs and {{embed}}s into real outl block references, keep folded state, and translate each dialect. Everything touched is counted in the import report — run with --dry-run first to measure fidelity against your backup. Anything unresolvable stays as ((unresolved:UID)) for manual triage.

Contributing

Background reading

The engineering decisions behind outl on avelino.run:

  • File sync isn't trivial — why concurrent file moves are a distributed-systems problem that Dropbox and Google Drive still get wrong.
  • From paper to outliner — the gap between "the CRDT converges" and "the app ships": projections, content-addressable reconciliation, surviving iCloud's lazy materialisation.

License

MIT.

Extension points exported contracts — how you extend this code

browse all types & interfaces →

Core symbols most depended-on inside this repo

browse all functions →

Shape

Function 2,817
Method 671
Class 241
Interface 107
Enum 72

Languages

Rust82%
TypeScript18%
Ruby1%

Modules by API surface

crates/outl-md/tests/inline.rs56 symbols
plugin-sdk/src/index.ts54 symbols
crates/outl-frontend-shared/src/api/commands.ts54 symbols
crates/outl-mobile/src/components/Journal.tsx52 symbols
crates/outl-actions/src/dates.rs44 symbols
crates/outl-tui/src/edit_buffer.rs42 symbols
crates/outl-md/src/parse.rs37 symbols
crates/outl-tui/src/commands/builtins/dates.rs34 symbols
crates/outl-sync-iroh/src/peers.rs34 symbols
crates/outl-plugins/src/host.rs34 symbols
crates/outl-desktop/src/components/BlockRow.tsx34 symbols
crates/outl-tui/src/actions/plugins.rs32 symbols

For agents

$ claude mcp add outl \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page