MCPcopy Index your code
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 1,334 documented · 34%
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 avelino/outl https://github.com/avelino/outl
brew trust avelino/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.

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 importer strips id:: lines, resolves ((uid)) block refs to page links, slugifies filenames, seeds the sidecars. Anything it can't resolve 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

SlashCommand (Interface)
One executable command. Implementations are stateless — the registry holds them as `Arc ` for cheap cl [26 implementers]
crates/outl-tui/src/commands/mod.rs
Runtime (Interface)
A language backend. The contract is intentionally Unix-y: take a `source` string, return stdout / stderr / exit-status [7 …
crates/outl-exec/src/runtime.rs
ConfigApi (Interface)
(no doc) [5 implementers]
plugin-sdk/src/index.ts
SyncTransport (Interface)
Transport abstraction — how ops travel between devices. iCloud/filesystem: detects file changes via polling. iroh: rece [2 …
crates/outl-actions/src/sync.rs
AppHost (Interface)
Implemented by each client's `AppState` so the shared command bodies (generic over `S: AppHost`) can run against either [2 …
crates/outl-tauri-shared/src/host.rs
Storage (Interface)
Storage backend trait. Implementations: [`JsonlStorage`] (one file per actor, the only persistent backend), [`MemorySto [2 …
crates/outl-core/src/storage/mod.rs
PluginEngine (Interface)
A JS engine able to load a plugin and run its commands / op hooks. Not `Send`: a Boa `Context` is single-threaded. The [1 …
crates/outl-plugins/src/runtime.rs
BlockHit (Interface)
A block hit from `search --in all`.
extensions/raycast/src/search.tsx

Core symbols most depended-on inside this repo

push
called by 418
plugin-sdk/src/index.ts
path
called by 298
crates/outl-core/src/lock.rs
iter
called by 277
crates/outl-core/src/log.rs
default
called by 227
crates/outl-theme/src/lib.rs
get
called by 213
plugin-sdk/src/index.ts
path
called by 201
crates/outl-sync-iroh/src/peers.rs
parse
called by 187
crates/outl-md/src/parse.rs
is_empty
called by 148
crates/outl-core/src/log.rs

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