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.
- Why outl? → outl.app/docs/why-outl.html
- Sync, done right: → outl.app/docs/sync.html
- CRDT walkthrough: → outl.app/docs/crdt.html
Install
# macOS / Linux via Homebrew (beta channel — every push to main)
iOS beta on TestFlight: join here. Point the TUI at the same iCloud Drive container (<container>/Documents/) and both clients share a workspace.
- From source / channels: → getting started, homebrew
Quick start
Press ? for keymap, : for the command palette, Ctrl+P to fuzzy-jump.
Coming from Logseq or Roam?
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
- Developer setup
- Contributing guide
- Architecture
- Roadmap — where the project is going
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.