A native macOS outliner for structured thinking, local-first notes, and Markdown-based knowledge management.
39
stars
139
commits
Swift
primary language
Sep 9, 2026
updated
A native (AppKit, no Electron) macOS outliner in the Logseq tradition - your notes are blocks, pages are
trees of blocks, and everything lives as plain Markdown files you own. Local-first,
no account, no lock-in: the app is just a fast index and editor over a folder of
.md files. Close Knopo and your graph is still a readable, greppable, git-able
directory of Markdown.

Enter splits, Tab/Shift+Tab
indent/outdent, Alt+↑/↓ move, click a bullet to zoom in, click the triangle to
fold. Markdown renders inline; the focused block shows raw source.[[Page]] - with stub pages, link autocomplete, and graph-wide
rename that rewrites every reference.((block-id)) to point at a block, {{embed …}}
to transclude a block or page read-only.#tag - labels (not pages), with a generated, click-through tag view.{{query …}} - a live, read-only result list from a small closed
filter language: tags, page references, task state, and properties combined with
and / or / not.⌘K full-text search across the whole graph (SQLite FTS5),
⌘F find within the current view.⌘/Shift-click opens pages and tag views as side-by-side
cards for reference work.⌘T for a tab, Open Graph… to repoint one). The same graph open in
two places stays in sync./link, /date, /embed, …).Some smaller touches: favourites & recents, content zoom, adjustable line spacing, and block background colors.
See the user guide for full documentation.
There's no shortage of outliners, and several are polished Logseq clones. Knopo exists for a different set of priorities. It's native macOS, no Electron. And it's opinionated: it keeps Logseq's block model where that's the right idea, but it isn't a clone and doesn't copy every Logseq decision. The bar is quality and stability over feature count - each feature is deliberate and vetted, not added just because another app has it.
What that looks like in practice:
.knopo/cache.db) backs
search, backlinks, tags, and queries, keeping navigation cheap on large graphs.Knopo is a real macOS app, not a wasteful Electromonster. What that gets you:
The trade-off is reach: Knopo is macOS-only, where web apps run everywhere from one codebase.
| Obsidian | Logseq | Roam Res. | Workflowy | Craft | Knopo | |
|---|---|---|---|---|---|---|
| Open source | ✗ | ✓ | ✗ | ✗ | ✗ | ✓ |
| Native (no Electron) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ |
| Local-first markdown | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ |
| Outliner (block tree) | ✗ | ✓ | ✓ | ✓ | ✗ | ✓ |
| Block references | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Embeds / transclusion | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ |
| Queries | ✗ | ✓ | ✓ | ✗ | ✗ | ✓ |
| Plugins | ✓ | ✓ | ✓ | ✗ | ✓ | ✗ |
The closest neighbour is Logseq - same outliner model, open source, block references, embeds, and queries - but Electron. Knopo makes the opposite platform bet (see What native buys you above): native and macOS-only rather than cross-platform.
Early but very useable. On-disk conventions may still change.
A graph is a directory. Knopo lays out and maintains:
<graph>/
pages/ # one Markdown file per page
journals/ # one file per day
assets/ # pasted/linked images and files
.knopo/ # rebuildable cache (SQLite index, config) - safe to delete
The Markdown files are the source of truth; .knopo/ is derived and can be
regenerated at any time.
A Swift Package - builds, runs and tests with the Command Line Tools, no Xcode required.
swift build # build
./scripts/test.sh # run the test suite (Swift Testing)
KNOPO_GRAPH=/path/to/graph swift run Knopo # run against a graph folder
KNOPO_GRAPH defaults to ~/Documents/Knopo; the folder is created and seeded
on first launch. To produce a double-clickable .app, run
./scripts/build-app.sh release - that step needs Xcode, for the app icon only.
The interface is English and picks up any language you add. To add one, see Localization/README.md.
This app is not notarized, so macOS Gatekeeper blocks a downloaded copy on first launch. To run it, either:
xattr -dr com.apple.quarantine /path/to/Knopo.app, orOn macOS 15 (Sequoia) the old Control-click → Open shortcut no longer bypasses Gatekeeper for un-notarized apps; use one of the above.
Building from source avoids this entirely - a locally built .app isn't
quarantined - but needs the Swift toolchain (the Xcode Command Line Tools).
139 commits
Swift
94.4%
Python
3.6%
Shell
1.9%
A native macOS outliner for structured thinking, local-first notes, and Markdown-based knowledge management.
39
stars
139
commits
Swift
primary language
Sep 9, 2026
updated
A native (AppKit, no Electron) macOS outliner in the Logseq tradition - your notes are blocks, pages are
trees of blocks, and everything lives as plain Markdown files you own. Local-first,
no account, no lock-in: the app is just a fast index and editor over a folder of
.md files. Close Knopo and your graph is still a readable, greppable, git-able
directory of Markdown.

Enter splits, Tab/Shift+Tab
indent/outdent, Alt+↑/↓ move, click a bullet to zoom in, click the triangle to
fold. Markdown renders inline; the focused block shows raw source.[[Page]] - with stub pages, link autocomplete, and graph-wide
rename that rewrites every reference.((block-id)) to point at a block, {{embed …}}
to transclude a block or page read-only.#tag - labels (not pages), with a generated, click-through tag view.{{query …}} - a live, read-only result list from a small closed
filter language: tags, page references, task state, and properties combined with
and / or / not.⌘K full-text search across the whole graph (SQLite FTS5),
⌘F find within the current view.⌘/Shift-click opens pages and tag views as side-by-side
cards for reference work.⌘T for a tab, Open Graph… to repoint one). The same graph open in
two places stays in sync./link, /date, /embed, …).Some smaller touches: favourites & recents, content zoom, adjustable line spacing, and block background colors.
See the user guide for full documentation.
There's no shortage of outliners, and several are polished Logseq clones. Knopo exists for a different set of priorities. It's native macOS, no Electron. And it's opinionated: it keeps Logseq's block model where that's the right idea, but it isn't a clone and doesn't copy every Logseq decision. The bar is quality and stability over feature count - each feature is deliberate and vetted, not added just because another app has it.
What that looks like in practice:
.knopo/cache.db) backs
search, backlinks, tags, and queries, keeping navigation cheap on large graphs.Knopo is a real macOS app, not a wasteful Electromonster. What that gets you:
The trade-off is reach: Knopo is macOS-only, where web apps run everywhere from one codebase.
| Obsidian | Logseq | Roam Res. | Workflowy | Craft | Knopo | |
|---|---|---|---|---|---|---|
| Open source | ✗ | ✓ | ✗ | ✗ | ✗ | ✓ |
| Native (no Electron) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ |
| Local-first markdown | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ |
| Outliner (block tree) | ✗ | ✓ | ✓ | ✓ | ✗ | ✓ |
| Block references | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Embeds / transclusion | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ |
| Queries | ✗ | ✓ | ✓ | ✗ | ✗ | ✓ |
| Plugins | ✓ | ✓ | ✓ | ✗ | ✓ | ✗ |
The closest neighbour is Logseq - same outliner model, open source, block references, embeds, and queries - but Electron. Knopo makes the opposite platform bet (see What native buys you above): native and macOS-only rather than cross-platform.
Early but very useable. On-disk conventions may still change.
A graph is a directory. Knopo lays out and maintains:
<graph>/
pages/ # one Markdown file per page
journals/ # one file per day
assets/ # pasted/linked images and files
.knopo/ # rebuildable cache (SQLite index, config) - safe to delete
The Markdown files are the source of truth; .knopo/ is derived and can be
regenerated at any time.
A Swift Package - builds, runs and tests with the Command Line Tools, no Xcode required.
swift build # build
./scripts/test.sh # run the test suite (Swift Testing)
KNOPO_GRAPH=/path/to/graph swift run Knopo # run against a graph folder
KNOPO_GRAPH defaults to ~/Documents/Knopo; the folder is created and seeded
on first launch. To produce a double-clickable .app, run
./scripts/build-app.sh release - that step needs Xcode, for the app icon only.
The interface is English and picks up any language you add. To add one, see Localization/README.md.
This app is not notarized, so macOS Gatekeeper blocks a downloaded copy on first launch. To run it, either:
xattr -dr com.apple.quarantine /path/to/Knopo.app, orOn macOS 15 (Sequoia) the old Control-click → Open shortcut no longer bypasses Gatekeeper for un-notarized apps; use one of the above.
Building from source avoids this entirely - a locally built .app isn't
quarantined - but needs the Swift toolchain (the Xcode Command Line Tools).
139 commits
Swift
94.4%
Python
3.6%
Shell
1.9%