skip to content

compare / neorg

tnotes vs Neorg

Neovim plugin for structured notes, tasks and journals in its own .norg format, parsed by tree-sitter.

tnotes

terminal app · macOS, Linux · MIT · free · v1.3.0

Neorg

editor plugin · Neovim 0.10+ on Linux, macOS, Windows; needs luarocks and a tree-sitter build · GPL-3.0 · Free

Neorg is not a Markdown tool and does not try to be one. It defines its own file format, .norg, with a tree-sitter grammar, and builds every feature on that: headings that nest by star count, TODO items with a state cycle, a journal module, a table of contents module, a presenter, a code-block tangler. The README calls the project young and warns of occasional breaking changes; version 9.0.0 changed the installation path to luarocks, and 9.6.4 (April 2026) is the latest tag.

Links are Norg objects, not titles. {* Heading} points at a heading in the current file, {:notes/index:* Heading} at a heading in another file of the workspace, {# anything} at any object with that name; core.esupports.hop follows them. There is no title-based link and no backlinks index. The roadmap lists a Zettelkasten backend, to be written in Rust, whose main job would be tracking backlinks; it is unchecked.

Getting out is a Neovim command. :Neorg export to-file out.md converts the current buffer through core.export.markdown, and :Neorg export directory ~/notes markdown converts a workspace. Pandoc does not read .norg; the roadmap marks the Pandoc integration as stalled.

Feature comparison

FeaturetnotesNeorg
Storage format✓ plain .md files, folders are directories✓ plain .norg files in workspaces managed by core.dirman; not Markdown
Runs in the terminal✓ TUI (ratatui) plus a headless CLI✓ it is Neovim
[[Wikilinks]]✓ [[Title]] with completion; rewritten on rename~ {:file:} and {:file:* Heading} links, {* Heading} in-file; no [[Title]] syntax
Backlinks✓ overlay + backlinks in JSON✗ planned as part of a Zettelkasten library on the roadmap
#tags✓ #tag and nested #work/project, parsed from text~ categories in @document.meta; no inline #tag index
Headless CLI✓ ls, search, cat, new, append, write, trash, restore✗ commands are :Neorg … inside Neovim
JSON output for scripts / agents✓ --json on every command✗
Live reload on external edits✓ file watcher; dirty tabs keep their text~ Neovim's own autoread / checktime
Vim keys✓ vim or emacs keys (edtui)✓ native
Mouse support✓ click, double-click, right-click menus, drag✓ Neovim's mouse support
Sync~ any file sync: git, Syncthing, iCloud, Dropbox~ files; git or any file sync
Encryption~ encrypt the folder: FileVault, gocryptfs✗
Mobile app✗ files sync to any mobile Markdown editor✗ a mobile app is on the roadmap, not built
Plugins✗✓ everything is a module; core.*, external.* community modules
Open source✓ MIT, Rust✓ GPL-3.0, Lua

✓ yes · ~ partial or via the file system · ✗ no

Choose Neorg if

  • You want Neovim to be the entire environment: Norg files, journal, TODO states, calendar and presenter without leaving the editor.
  • You prefer a format designed for a parser: Norg’s grammar is stricter and more regular than Markdown, and tree-sitter powers folding, concealing and text objects.
  • You extend by writing Lua modules: Neorg’s module system is the product, and community external.* modules plug into it.
  • You are fine with a young project and pinning versions.

Choose tnotes if

  • You want Markdown, readable by every other tool, phone app and language model.
  • You want [[Title]] links, completion after [[, backlinks and rename rewriting today, not on a roadmap.
  • You want a CLI with --json so scripts and agents can read and write the vault.
  • You want vim keys without owning a Neovim configuration: tnotes ships with an edtui vim mode and installs as one binary.

Using Neorg and tnotes together

There is no overlap on disk: Neorg writes .norg, tnotes lists only .md, and Pandoc has no Norg reader. The one bridge is Neorg’s exporter, which is one-way. Inside Neovim, export a workspace into a folder under a tnotes root:

:Neorg export directory ~/norg markdown ~/notes/from-norg

Then open the root:

tnotes ~/notes

The result is a snapshot. tnotes indexes only [[…]] links, so whatever the exporter emits for {:file:} links is text or a Markdown link to tnotes, not an edge in links / backlinks; @document.meta categories are not #tags. Edits in tnotes do not go back to .norg.

If you want both, split by kind rather than convert: Norg for the journal and task workflow inside Neovim, a tnotes root for reference notes that scripts and agents read with tnotes ls --json. Both are plain text in one git repository, and tnotes ignores the .norg files next to its Markdown.

FAQ

? Does Neorg support backlinks?

No. Links are one-directional Norg objects ({* Heading}, {:file:* Heading}). A Zettelkasten library that would track backlinks is listed on the roadmap as unstarted work.

? Can I convert Neorg files to Markdown?

Yes, from inside Neovim: :Neorg export to-file note.md converts the current buffer through core.export.markdown, and :Neorg export directory <dir> markdown [out-dir] converts a whole workspace. Pandoc cannot read .norg; the roadmap marks a Pandoc parser as stalled.

? Does Neorg work with Markdown or Org files?

No. Neorg only understands .norg. The roadmap mentions upgraders from .org to .norg as a goal, and Markdown export exists, but there is no import path and no Markdown mode.

Sources

Neorg facts checked on 2026-09-22 against: