compare / logseq
tnotes vs Logseq
Outliner-style knowledge base with daily journals, block references and a plugin API; file graphs are Markdown or Org files, the newer DB graphs are SQLite.
tnotes
terminal app · macOS, Linux · MIT · free · v1.3.0
desktop app · Linux, macOS, Windows (Electron); iOS, Android; web app for DB graphs · AGPL-3.0 · Free. Logseq Sync (beta) requires an Open Collective contribution ($5 or $15/month).
Logseq is an outliner: every line is a block with a bullet, blocks nest, and any block can be referenced from anywhere by its ((uuid)). Pages are Markdown or Org files in a graph directory (pages/, journals/, assets/, logseq/config.edn), and the app rebuilds a Datascript database from them on load. Linked References under each page, #tag as a page reference, key:: value properties on any block, and Datalog queries are what people stay for.
The project is mid-transition. The “DB version” replaces file graphs with a SQLite database, adds a real-time collaboration sync (RTC, alpha), a new mobile app, and a Node CLI (logseq graph list, logseq list page --output json, logseq sync start). The README calls the DB version beta and warns that data loss is possible. File graphs still work in the stable release, and the file-graph documentation at docs.logseq.com is the part that matters for a plain-text workflow.
tnotes is the opposite shape: no outliner, no block identities, no queries. A note is a Markdown file whose first line is its title; links resolve by title; the TUI and the tnotes CLI are the whole interface. If your notes are Logseq-shaped (bullets everywhere, block refs, properties) tnotes will show them but not understand them. If they are documents with headings and [[links]], both tools read the same files.
Feature comparison
| Feature | tnotes | Logseq |
|---|---|---|
| Storage format | ✓ plain .md files, folders are directories | ~ file graphs: .md/.org in pages/ and journals/; DB graphs (beta): SQLite |
| Runs in the terminal | ✓ TUI (ratatui) plus a headless CLI | ✗ Electron desktop app; the new Node CLI targets DB graphs only |
| [[Wikilinks]] | ✓ [[Title]] with completion; rewritten on rename | ✓ [[page]] with autocompletion; ((uuid)) block refs |
| Backlinks | ✓ overlay + backlinks in JSON | ✓ Linked References and Unlinked References per page |
| #tags | ✓ #tag and nested #work/project, parsed from text | ✓ #tag is a page reference; tags:: page property |
| Headless CLI | ✓ ls, search, cat, new, append, write, trash, restore | ~ logseq CLI (Node) for DB graphs: list, query, sync; nothing for file graphs |
| JSON output for scripts / agents | ✓ --json on every command | ~ CLI --output json, DB graphs only |
| Live reload on external edits | ✓ file watcher; dirty tabs keep their text | ~ desktop watches the graph; a conflicting external edit prompts to reload |
| Vim keys | ✓ vim or emacs keys (edtui) | ~ custom :shortcuts in config.edn; community vim-shortcuts plugin |
| Mouse support | ✓ click, double-click, right-click menus, drag | ✓ GUI: drag blocks, sidebar, whiteboards |
| Sync | ~ any file sync: git, Syncthing, iCloud, Dropbox | ~ any file sync for file graphs; Logseq Sync (paid beta, E2EE); RTC alpha for DB graphs |
| Encryption | ~ encrypt the folder: FileVault, gocryptfs | ~ Logseq Sync encrypts with age; local graph is plain files |
| Mobile app | ✗ files sync to any mobile Markdown editor | ✓ iOS and Android; DB-graph mobile app in alpha |
| Plugins | ✗ | ✓ plugin API, marketplace, themes |
| Open source | ✓ MIT, Rust | ✓ AGPL-3.0, ClojureScript |
✓ yes · ~ partial or via the file system · ✗ no
Choose Logseq if
- You think in outlines and block references, not documents. Nothing in tnotes addresses a block.
- Daily journals,
TODO/DONEtask states, scheduled and deadline dates, and Datalog queries over properties are the workflow. - You want a plugin ecosystem, PDF annotation, whiteboards, and mobile apps that read the same graph.
- Logseq Sync’s end-to-end encryption (file names included) fits your threat model better than syncing a folder yourself.
Choose tnotes if
- You want notes that any Markdown tool reads without an outliner’s
-on every line andid::lines under referenced blocks. - You need a headless interface today:
tnotes ls --json,search,cat,new,append,writework on a plain folder, not a DB graph, and a running TUI picks the changes up. - You work over SSH or in a terminal multiplexer and want the notes app in the same window as the shell.
- A single static binary (Homebrew, cargo, or a tarball) instead of an Electron app; no beta storage format to migrate through.
Using Logseq and tnotes together
A Logseq file graph is a directory of Markdown, so it can be a tnotes root. pages/ and journals/ show up as folders; assets/ has no .md files and is empty in the tree.
tnotes ~/graphs/work # add the graph as a root
tnotes ls --folder work/journals --json | jq '.[0]'
tnotes search "retro" --dir ~/graphs/work
What tnotes does with Logseq’s conventions:
- Block properties (
key:: value), theid:: <uuid>line Logseq writes under any block that is referenced,collapsed:: true, and((uuid))block references are plain text in tnotes. They are highlighted as list items and left alone. - Logseq pages rarely start with a heading; the first line is usually
-or a property. tnotes uses the first line as the title and renames the file when that line changes. Do not edit the first line of a Logseq page in tnotes unless you want the file renamed. Reading, searching and appending are safe. [[Page Title]]resolves in both tools when the file stem matches the title. Namespaced pages ([[term/backlink]]stored asterm___backlink.md) and journal links ([[Sep 22nd, 2026]]for2026_09_22.md) resolve in Logseq only.#tagis a page reference in Logseq and a filter in tnotes; nested#work/projectis a namespace in Logseq and a nested tag in tnotes. Both read the same characters.- Logseq’s
logseq/directory is not dot-prefixed, so any.mdit contains (it keeps backups underlogseq/bak/) is listed as a note..git,.stfolderand other dot-entries are ignored. - Logseq detects external writes; when it has unsaved in-memory changes to the same file it prompts about the file being modified on disk. Save in Logseq before appending with
tnotes append, or keep one writer per file.
DB graphs are SQLite and have no .md files on disk; there is nothing for tnotes to open. Use logseq graph export --type edn for those, or keep a file graph.
FAQ
- ? Can I open a Logseq graph in a terminal?
Logseq has no TUI. Its Node CLI (
logseq) works only against DB graphs (SQLite). For a file graph, point a terminal Markdown tool at the directory:tnotes ~/graphs/worklistspages/andjournals/as folders and searches their text. Outliner semantics (block refs, properties, queries) are not interpreted.- ? Does Logseq store notes as Markdown files?
File graphs do: one
.md(or.org) per page underpages/, one per day underjournals/, pluslogseq/config.edn. Every block is a-bullet and Logseq addsid::and otherkey:: valueproperty lines as needed. DB graphs, the beta default in the DB version, store the graph in SQLite; export to EDN or SQLite with the CLI.- ? Is Logseq Sync end-to-end encrypted?
Yes. Per the Logseq docs, each synced graph is encrypted with a password using age; file contents and file names are encrypted before they reach AWS. It is a beta feature available to active Open Collective contributors, and Logseq advises against combining it with iCloud, Syncthing or Dropbox on the same graph.
Sources
Logseq facts checked on 2026-09-22 against:
- logseq/logseq README (DB version, plugin API, CLI)
- Logseq CLI (Node) docs
- Logseq docs: Logseq Sync
- Logseq docs: Built-in Properties (id, collapsed)