Browse by type

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.
# 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).
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.
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.
The engineering decisions behind outl on avelino.run:
MIT.
browse all types & interfaces →