skip to content

compare / zettlr

tnotes vs Zettlr

Electron Markdown editor for academic writing: citations, Pandoc export and a Zettelkasten layer on plain files.

tnotes

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

Zettlr

desktop app · macOS, Windows, Linux (Electron; x64 and ARM builds) · GPL-3.0 · Free, donation-funded

Zettlr calls itself a publication workbench, and the feature list follows from that: a bundled Pandoc, export profiles for LaTeX and Word templates, CSL-styled citations from a Zotero or JabRef export, LanguageTool integration, a readability mode. The Markdown editor is CodeMirror 6 with a preview-style rendering mode, a table editor and a linter for style issues. Version 4.8.0 shipped on 18 September 2026 and the project is still actively developed.

The Zettelkasten layer sits on top of ordinary files. Zettlr generates a timestamp ID (YYYYMMDDHHMMSS by default) and recognises it in either the filename or the file body; [[…]] links can target that ID or the filename, and Cmd/Ctrl+L inserts a fresh ID at the cursor. There is no separate backlinks pane: the Related Files tab in the sidebar lists inbound, outbound and bidirectional links above notes that merely share a tag, and a graph view draws the same relations.

Zettlr is a desktop application. It has command-line switches such as --data-dir and --clear-cache, but nothing that reads or writes notes without opening the window. If your workflow is a terminal, a script or an agent, Zettlr has no surface for it.

Feature comparison

FeaturetnotesZettlr
Storage format✓ plain .md files, folders are directories✓ plain .md files in folders opened as workspaces
Runs in the terminal✓ TUI (ratatui) plus a headless CLI✗ GUI only; its command-line switches configure the app, they do not replace it
[[Wikilinks]]✓ [[Title]] with completion; rewritten on rename✓ [[ID]] or [[filename]], optional [[target|title]]; autocomplete after [[
Backlinks✓ overlay + backlinks in JSON✓ inbound links listed in the Related Files sidebar tab
#tags✓ #tag and nested #work/project, parsed from text✓ #tag in text or YAML keywords; tag cloud and tag manager
Headless CLI✓ ls, search, cat, new, append, write, trash, restore✗ no headless subcommands
JSON output for scripts / agents✓ --json on every command✗
Live reload on external edits✓ file watcher; dirty tabs keep their text✓ "Always load remote changes" setting; off by default it asks first
Vim keys✓ vim or emacs keys (edtui)✓ input mode: Normal, Vim or Emacs
Mouse support✓ click, double-click, right-click menus, drag✓
Sync~ any file sync: git, Syncthing, iCloud, Dropbox~ none built in; files sync with any file sync
Encryption~ encrypt the folder: FileVault, gocryptfs✗ not built in; encrypt the folder at the OS level
Mobile app✗ files sync to any mobile Markdown editor✗
Plugins✗✗ no plugin API; custom CSS, snippets, custom export commands
Open source✓ MIT, Rust✓ GPL-3.0, TypeScript on Electron

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

Choose Zettlr if

  • You export: Pandoc is bundled, and there are profiles for PDF via LaTeX, Word templates and Textbundle.
  • You cite: CSL JSON or BibTeX databases, CSL styles, and citation autocomplete in the editor.
  • You want a rendered editing view with a table editor, spellcheck and LanguageTool, not raw Markdown in a terminal.
  • You link by stable ID so that notes can be retitled and renamed without breaking links.

Choose tnotes if

  • You live in a terminal or over SSH: tnotes is a TUI plus tnotes ls | search | cat | new | append | write, all with --json.
  • Scripts or AI agents need to read and write the same vault; Zettlr has no headless mode.
  • You want a small Rust binary with no Electron runtime.
  • You link by title and want links rewritten automatically when a note is renamed.

Using Zettlr and tnotes together

Both tools read a folder of .md files, so you can point tnotes at a Zettlr workspace:

tnotes ~/Zettelkasten          # adds the folder to your roots and opens it
tnotes search "luhmann" --json  # read-only: ls, search and cat never touch a file

What carries over and what breaks:

Practical split: keep the ID in the body (Zettlr’s Cmd/Ctrl+L puts it there), link by title where you can, and use tnotes for search and reading from the terminal. If you edit in both, expect files to be renamed by tnotes.

FAQ

? Does Zettlr have backlinks?

Yes, under a different name. The Related Files tab in the right sidebar lists every note that links to the current one (inbound), every note it links to (outbound), mutual links, and then notes that share a tag. Bidirectional links sort to the top.

? Does Zettlr use IDs or titles for wiki links?

Either. Zettlr recognises an ID (a timestamp by default) in the file name or the body, and a preference decides whether autocomplete inserts the ID or the file name as the link target. Links can carry a title after a pipe, and another preference sets which side of the pipe is the target.

? Can I use Zettlr from the terminal?

No. Zettlr is an Electron app; its command-line switches (--data-dir, --clear-cache, --launch-minimized) only affect how the GUI starts. For a terminal or scripted workflow on the same Markdown files, use a tool with a headless CLI such as tnotes or nb.

Sources

Zettlr facts checked on 2026-09-22 against: