PyQt6 · WYSIWYG · plain Markdown
Notes you edit like a document, stored as files you own.
qnotebook turns any folder of Markdown files into a richly linked personal wiki you edit live — no preview pane, no proprietary format, no lock-in. Headings, tables, task lists, wiki links and images render as you type, while the files on disk stay clean, portable Markdown any tool can read.
Inspired by Zim Desktop Wiki · written from scratch · GPL-2.0 · hundreds of tests
True WYSIWYG
A single editing surface renders Markdown as styled rich text as you type — there's no separate preview tab. What you see is exactly what's in the file.
Plain Markdown, your folder
Any directory of .md files is a notebook. qnotebook adds only a
hidden .qnotebook/ index, so your notes stay fully portable and
open in any other editor.
Saves you can trust
Every save is atomic and runs a 3-way merge ladder with pre-save snapshots, so an external edit or a sync race never silently eats your words.
A wiki that gets out of your way
Link pages together, jump anywhere instantly, and let the structure emerge as you write — without ever leaving the editing surface.
-
Link
Wiki linking with backlinks
[[Page]],[[Foo:Bar]],[[Target|alias]]and[[Page#Heading]]render as clickable links, with a backlinks dock and automatic rewriting when you rename a page. -
Find
Full-text search & command palette
SQLite FTS5 search with hit highlighting and click-to-jump, a fast quick switcher, and a fuzzy command palette over every menu action.
-
Author
Everything you'd reach for
Task lists with click-to-toggle, tables, fenced code with highlighting, image paste & drag-and-drop, LaTeX equations, footnotes, tags, page templates, a journal/calendar, a table of contents, and a link-map graph view.
-
Recall
Version history
Optional per-save Git commits with a built-in page-history viewer and one-click "restore this version."
Bulletproof saves
Writing is atomic — a same-directory temp file, an fsync, and an
atomic replace. When a file changed underneath you, an 8-rung merge ladder
(trivial → disjoint hunks → git diff3 → optional
wiggle/mergiraf) reconciles it, with a 3-pane merge
dialog only when a real conflict can't be resolved automatically.
A round-trip guard rejects any merge the parser can't faithfully re-read — your file is never left in a shape qnotebook itself couldn't open.
Built for sync
qnotebook detects Syncthing's *.sync-conflict-* files on open and
through a live file watcher, and ships a conflict-resolver plugin to review and
merge them — keep mine, keep theirs, save both, or merge.
Combined with optional Git versioning, it's at home on a folder you sync across machines with Syncthing, Git, or anything else that touches plain files.
Customizable, scriptable, pluggable
A Settings dialog with searchable categories and fully rebindable shortcuts, a
dark theme, and session restore — plus a plugin system that discovers plugins
straight from your notebook's .qnotebook/plugins/ directory.
--search, --export, --append-today & moreBuilt to last, tested hard
The core invariant is proven by property test: re-serializing a parsed document converges to a fixed point, so your Markdown round-trips cleanly every save. Requires Python 3.10+, PyQt6 6.5+, and mistune 3.
Get qnotebook
qnotebook is in active development — feature-rich and pre-1.0. Clone it, install dependencies, and point it at any folder of Markdown files.
git clone https://codeberg.org/qnotebook/qnotebook
cd qnotebook
just install-deps
just run /path/to/notebook
Heads up: user plugins run with full Python privileges — only open notebooks you trust.