A note-taking application built around an arbitrarily deep tree where a single note can be cloned into several places, with scripting, attributes and per-note encryption. It runs as a desktop app, as a self-hosted server, or as both with sync between them.
Our verdict on Trilium Notes#
Get the name right before you install anything. The original zadam/trilium repository was handed to the community rather than abandoned, and github.com/zadam/trilium now issues a permanent redirect to github.com/TriliumNext/Trilium. The interim TriliumNext/Notes repository was archived in June 2025 after the project reclaimed the original name. So: install from TriliumNext/Trilium, the Docker image is triliumnext/trilium, the site is triliumnotes.org, and the product is called Trilium Notes again. Development is healthy, with v0.105.0 shipping in August 2026 carrying compressed and encrypted backups, an attributes sidebar and image compression tools. It is still 0.x and still ships behavior changes in minor releases: v0.105.0 disabled HTML in text notes by default and started unwrapping div elements to fix paste behavior. Single user only, which is the actual limit here, not stability.
Who Trilium Notes is for#
Choose it if
- One person building a large personal knowledge base who wants a real tree, note cloning and attributes rather than a flat folder of Markdown
- Anyone leaving Evernote who needs the import to preserve structure and attachments
- People who want to script their notes, since attached JavaScript runs server-side with an API over the note tree
- Laptop plus server setups where the desktop app is the primary editor and the server is a sync target
Look elsewhere if
- You need more than one person editing, because Trilium has no multi-user model and sharing means publishing a subtree publicly
- You want your notes as plain Markdown files on disk; everything lives inside one SQLite database
- You cannot upgrade all your devices at once, since the sync protocol version must match across the cluster
What running it actually looks like#
One container on port 8080, and the only thing you must get right is the data directory. The rootful image stores it at /home/node/trilium-data and the rootless variant at /home/trilium/trilium-data; mount a volume there or you lose everything on the next pull. The docs state the standard container needs root privileges to operate correctly, and that SMB or CIFS mounts need nobrl and noperm mount options or SQLite locking fails in confusing ways. Official images cover amd64, arm64/v8 and armv7. The docs explicitly warn against the latest tag, because a minor bump can migrate your database and disrupt an existing sync setup. Set a password on first launch; there are no accounts, only one login.
Resource profile#
- Memory
- 200 MB idle, around 420 MB in ordinary use. Estimate for the server container alone with a small note tree. The Electron desktop app on the same database is closer to 500 MB because it carries a browser.
- CPU and acceleration
- Idle at essentially zero. Spikes come from full text search reindexing, importing a large Evernote or Markdown archive, and any custom scripts you attach to notes, which run server-side on the Node process.
- Storage growth
- Everything including images and attachments goes into the single `document.db` SQLite file, plus automatic backup copies in `trilium-data/backup`. A heavily illustrated tree can push the database into the multi-gigabyte range.
- Operational load
- 2 of 5, Light. One container, one SQLite file, no external database. What lifts it above a 1 is that database migration on upgrade is one-way and the sync protocol is versioned, so a multi-device setup has to be upgraded together.
Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.
Data and backup surface#
Back up the whole trilium-data directory. document.db is the SQLite database containing every note, attachment and image; config.ini holds the port and instance settings; backup/ holds the automatic database snapshots Trilium takes on its own schedule; log/ and tmp/ are disposable. Copying document.db while the server is running is the usual SQLite hazard, so either stop the container first or copy out of backup/, which is written as a consistent snapshot. v0.105.0 added compressed and encrypted backups with a restore path in the UI. Paths are overridable with TRILIUM_DATA_DIR, TRILIUM_DOCUMENT_PATH and TRILIUM_BACKUP_DIR if you want the database and its backups on different disks.
Derived backup shape
SQLite backup. sqlite3 <db> ".backup out.db" while running, or stop the container and copy. A live cp of a WAL-mode SQLite file can restore corrupt.
Traps and surprises#
TriliumNext/Notes is archived, TriliumNext/Trilium is live
Three names are in circulation and two of them are dead ends. zadam/trilium redirects, TriliumNext/Notes was archived in June 2025 with its last push that month, and active development is at TriliumNext/Trilium under maintainer Elian Doran. Search results and old blog posts still point at the archived repo and at triliumnext/notes on Docker Hub. Use triliumnext/trilium.
Upgrading the database is a one-way door
Starting a newer version migrates document.db automatically, and the docs state that after migration older versions of Trilium can no longer read that database. There is no downgrade path other than restoring the pre-migration backup. Copy trilium-data/backup somewhere off the machine before every version bump, not after.
The sync protocol is versioned across the whole cluster
If you sync a desktop client to a server instance, every member must be on the same sync protocol version. Upgrade the server and leave a laptop behind and sync stops, usually with an unhelpful error rather than a version mismatch message. Release notes flag protocol changes; upgrade every device in the same session.
SQLite on a network share corrupts
Putting trilium-data on an SMB or CIFS share needs the nobrl and noperm mount options because SQLite byte-range locking does not survive the default settings. NFS has the same class of problem. The failure mode is not a clean error, it is database corruption discovered later. Keep the database on local storage and sync elsewhere.
v0.105.0 changed how text notes handle HTML
The August 2026 release disabled HTML support in text notes by default and now unwraps div elements, both to fix copy and paste behavior. Notes pasted from web pages before the upgrade may render differently afterwards. The same release also made MCP authentication mandatory, which will break any automation that was talking to the endpoint unauthenticated.
Specifications#
- Category
- Documents, notes and knowledge
- Licence
- AGPL-3.0 (Copyleft)
- Written in
- TypeScript / Node.js (Electron desktop)
- First release
- 2017
- Maturity
- Mature
- Datastore
- SQLite (`document.db`)
- Default ports
8080- Ships as
- docker, desktop app (Windows/macOS/Linux), node from source, PWA against a server instance
- arm64 builds
- Yes
- Identity
- Native OIDC. Direct OpenID Connect and TOTP support are built into the server for login; there is no multi-user model, so SSO here authenticates you, it does not partition content.
- Replaces
- Evernote, OneNote, Notion, Obsidian
- Project site
- triliumnotes.org
- Source
- github.com/TriliumNext/Trilium
- Documentation
- docs.triliumnotes.org
Alternatives to Trilium Notes#
Everything else in documents, notes and knowledge, closest in operational weight first.
| Tool | Ops load | Idle RAM | Licence |
|---|---|---|---|
| BookStack | 2, Light | 260 MB | MIT |
| HedgeDoc | 2, Light | 250 MB | AGPL-3.0 |
| Docmost | 3, Moderate | 500 MB | AGPL-3.0 core, proprietary Docmost Enterprise licence for `ee` directories |
| Paperless-ngx | 3, Moderate | 450 MB | GPL-3.0 |
| Wiki.js | 3, Moderate | 260 MB | AGPL-3.0 |
| Outline | 4, Heavy | 550 MB | BUSL-1.1 (Change Date 2030-09-01, converts to Apache-2.0) |
Where Trilium Notes comes up elsewhere#
Head to head
Migration guides
Research
Sources#
Facts on this page were checked against the project's own material. Where a number is our own estimate rather than a published figure, the text says so.
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.