v0.104.0
Note
If you enjoyed this release, consider showing a token of appreciation by:
- Pressing the “Star” button on GitHub (top-right).
- Considering a one-time or recurrent donation to the lead developer via GitHub Sponsors or PayPal.
This release is the largest in Trilium's history, built around two big themes: security and interoperability. The attack surface has been dramatically reduced across the desktop app, the server, and shared notes — with 16 dedicated security fixes and a few deliberate breaking changes (backend scripting and the SQL console are now disabled by default), so please review the Breaking changes section before upgrading.
Getting notes in and out of Trilium is also much easier: new importers for OneNote, Notion, Google Keep, Anytype and Obsidian join a faster, more memory-efficient import/export pipeline and Spreadsheet now has XLSX and CSV import & export.
On top of that come a redesigned setup and login experience, better AI integration (including being able to use your Claude Code subscription), richer text editing (multi-state TODO lists, collapsible blocks, link previews), dashboard collections, and a huge wave of polish — roughly 86 bugfixes and 68 smaller improvements touching nearly every corner of the app. The sections below have the full details.
💡 Key highlights
- Setup was redesigned from scratch to be more modern (see details below).
- The LLM integration can now use your Claude Code subscription, without the need of an API key or additional cost.
- Text notes: Customizable multi-state TODO lists by @adoriandoran
- Collapsible blocks by @adoriandoran
- Link previews by @stexz01, @eliandoran and @adoriandoran
- Toggle List (aka Accordion) by @adoriandoran
- Text notes: Collapsible bullets
- Spreadsheet gains XLSX and CSV import & export
- A new experimental Dashboard collection.
- Auto theme switching for code blocks and code notes
- Autocompletion (e.g. Intellisense) for Frontend & Backend code notes
- Significant hardening of the desktop and server app by @perfectra1n and @eliandoran.
- A new import mechanism allows importing from multiple applications: OneNote notebooks using the cloud API, Notion, Google Keep, Anytype, Obsidian
- Significant improvements to the import/export process
- Use a better buffering system so that the memory consumption never increases proportionally to the number of notes exported.
- Display the progress of import/export.
- Use a native mechanism on desktop so that the files being imported are not copied in memory.
- Server now uses the disk to store imported files, reducing memory pressure.
- Improved compression time by skipping already compressed files.
- Improved import performance.
🚨 Breaking changes
- Backend scripting is now disabled by default.
- If you make use of these scripts, see the documentation (config.ini change for server or desktop settings).
- The goal of this change is to strengthen Trilium's security posture since backend scripts have dangerously powerful levels of access (e.g. full FS access). Front-end scripts are unaffected.
- SQL console access is disabled by default.
- Similar to backend scripting, it can be reactivated from config.ini.
- The desktop application (based on Electron) has been hardened against potential RCE attacks. You might have to adapt your scripts if you have front-end scripts that depend on Electron remote or the Node.js integration.
- The desktop application now no longer opens its port on the local network by default.
- This can generally affect you only if you are using ETAPI or desktop-to-desktop sync with your desktop client (servers are unaffected).
- This option can be changed in Options → Security.
- OPML v1 export was dropped from this release, v2 which preserves basic formatting has been kept instead. The v1 is still supported for import.
🐞 Bugfixes
This release lands roughly 86 bugfixes, with a strong focus on data integrity: several issues that could overwrite note content, corrupt the database during ZIP import, or leave sync in an inconsistent state have been resolved. The remainder is steady polish across the text editor, spreadsheets, Markdown import/export, canvas notes, sharing, authentication and mobile.
All 86 bugfixes
- Backend log doesn't respect the code color theme.
- Search: Wrong escape of highlighted tokens
- Desktop layout doesn't respect the bottom safe area.
- When refreshing the page, the sidebar shows up animated.
- “Upload attachment” not working on mobile.
- Text notes: Moving lines using keyboard shortcut sometimes not working
- Flickering note save indicator on desktop.
- Revisions: “Diff isn't available” when viewing revisions of an empty note.
- Code block tries to link/create note when typing @, and suggests slash-commands when typing /
- Recovered notes appear after interrupting a sync from a device that was long offline
- Relation map:
- Partially typed name being used as relation by @Renatonet0
- Fix Chinese IME input by @Dinis-Ou
- share* labels are not filtered out during safe import.
- Geomap rendering raw HTML
- Text Notes can not add lists that are not numbered (i.e. letters) by @adoriandoran
- ETAPI YAML endpoint not accessible.
- Status bar: Code language switcher not showing the language if it was not enabled in settings.
- Spreadsheet:
- Ctrl+R copies to the right, intercepting page refresh / Unnecessary save on refresh
- Can't edit the same note in a split.
- Save is sometimes done before recalculation, causing potential incorrect values.
- Unnecessary save when first showing some spreadsheets.
- Exporting as a single file results in a .undefined file with zero content.
- Calendar collection not occupying 100% height.
- Formatting toolbar not showing after temporarily editing a note in the old layout.
- New layout: Note map not visible on text notes
- Not all notes in a split loading after a refresh.
- Background effects interfere with shadow on Linux.
- AI: Extended thinking not working in some models
- Markdown: colspans and rowspans are not preserved during editing
- Read-only Mermaid diagrams not always rendering
- Notes being overwritten with another note
- Changes to AI providers not refreshing the sidebar.
- Markdown: wrong escape of dollar signs
- TOTP: Entering a wrong password uses up the recovery code
- OIDC credentials are not checked for
- Current OpenID Connect Implementation is not compatible with Authelia
- New checkbox rows are already prechecked when previous row was checked
- Spreadsheet not localized
- Move line up/down doesn't always work
- Scroll position is lost when the editor reinitializes.
- Periodic hidden subtree checks causes the text editor to refresh.
- Missing blurred background for the icon switcher for the inline title.
- Geomaps breaking with GPX (entire navigation breaks)
- Tree position resets to top when switching between tabs with different workspaces/hoisted notes.
- Formatting toolbar remains visible after changing note type by @SiriusXT
- Markdown import: preserve heading hierarchy instead of flattening to H2
- Exports: filename length is capped to 30 characters
- Markdown rending issues when using multiple "$" in Code Block inside Blockquote
- Tables not rendering properly in read-only after a Markdown import
- The delete attachment confirmation dialog does not auto-select "OK"
- Misleading "Copy link to clipboard" for attachments
- Backend crash on abrupt WS disconnect
- Allow creating notes from relation auto-complete
- Can't confirm inline note creation via keyboard
- Time offset in Log - 24 hours (timestamps today are showing as yesterday)
- Enabling showLoginInShareTheme does not enable login from base domain
- Docker deployment, when accessing the webpage, the following prompt appears: Share root not found. Please set up a note with #shareRoot label first.
- Video/audio players' seek forward button has incorrect text
- Converting an attachment to a note breaks links
- Built-in LaTeX editor generates \differentialD, which is not supported by the renderer
- Share: Table of contents scrolls to the wrong position for duplicate headings.
- Importing a ZIP archive that contained a root note with content would corrupt the database.
- ignore IME composition Enter when editing card and column titles by @greymoth-jp
- Zooming shortcut Ctrl+ doesn't work on German Keyboard
- Shared note with a large code note freeze the server
- The checkbox and cursor in the to-do list are too close
- Table: boolean column sorting not always working & row number appear shuffled when sorting
- Include note would render recursively for nested includes, causing performance concerns
- Old layout: removed collection properties in the ribbon since they are duplicated with the collection bar.
- Search does not find protected notes while being in protected session
- Markdown import/export
- Some equations containing HTML-like characters are broken
- A table with no heading row but with heading columns will end up having an empty row when reimported.
- Tree can crash in some rare circumstances while updating itself
- “Blob not found” when deleting the active note.
- Table of contents becoming stale when switching between two notes with many headings.
- CTRL-Z with two Canvas notes will delete previous drawing
- Canvas notes sometimes fail to render
- New layout: Note map not shown in empty note type switcher
- Some protected notes and notes titles are still displayed after inactivity delay
- JavaScript error while OCR processing existing image files
- Day notes title pattern replacements not working
- Template collision for Code note
- Fix calendar events that cross midnight not showing up by @Glitch752