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.

Write & navigate

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.

Make it yours

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.

Headless CLI--search, --export, --append-today & more
Pluginsconflict resolver, word count, journal, link map
Quick switcherjump to any page instantly
Command palettefuzzy-run any action
Dark modeand session restore on launch
Send-Toreceive snippets from other qdistro apps
Under the hood

Built to last, tested hard

PyQt6no GTK / GObject dependency
mistune v3CommonMark + GFM parsing
SQLite FTS5pages, backlinks, tags, search
SafeWriteratomic save + merge ladder
Git versioningoptional per-save history
Hundreds of testsround-trip, fuzz & stress

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.

From the blog