Trilium Scripts
August 26, 2026 · View on GitHub
A collection of widgets, themes, and scripts for TriliumNext Notes.
Browse the addon catalog: https://beatlink.github.io/trilium-scripts/
⚠️ Work in progress. The addon system (TAM, its manifest format, and how addons store data) is under active development and changing frequently. Data loss is possible. Download this to test and explore only — do not point it at real/production Trilium data yet.
Installation
Install addons using Trilium Addon Manager by adding this catalog to TAM:
https://beatlink.github.io/trilium-scripts/catalog.json
Or download individual .zip files from Releases and import manually via Trilium → Import.
Addons
| Name | Type | Description | Version |
|---|---|---|---|
| Agenda | widget | The shared configuration behind the agenda addons: one settings note (schema.json/defaults.json/config.json, tagged #agendaConfig) holding an open-ended dimensions registry - area and priority ship as defaults, but you can add your own - the profiles, and the searches/filters/sorts/prefixes/colors/groupings/date-rules those profiles reference, plus the Agenda Settings page that edits all of it. Each dimension gets a sort ordinal and a derived prefix/color/grouping/filter variant, derived at read time so they can never drift from the vocabulary. This addon ships no widget: the Overview widget split out as agenda-overview@beatlink, which discovers this addon's config note at runtime and ships its own copy of lib/settings.js and lib/dimensions.js, because Trilium resolves an import only inside the importing note's own subtree. Item type is a separate axis owned by template-picker@beatlink's own registry (a note's ~template relation, not a dimension label). The other siblings each own their own settings note and read nothing from this one except the dimensions registry: agenda-task@beatlink (the Task pane; #agendaTaskConfig), agenda-myday@beatlink (the My Day focus panel; #agendaMyDayConfig), and agenda-organize@beatlink (the GTD triage page; #agendaOrganizeConfig). | 10.0.0 |
| Agenda My Day | widget | A right-pane panel shown on every note, modelled on Microsoft To Do's My Day page. Your My Day note is edited in place at the top of the panel as rich text, so today's list is always on screen and never has to be navigated to. Below it sits a collapsible Suggestions section listing recommended tasks to add to your day - grouped into Earlier, Today and Next 7 Days - each with a + that files it onto the My Day note and clones the task under it; tasks already on your day drop off the list. It optionally files tasks in automatically as their start time arrives, and sends a desktop notification as each task comes due. A second right-pane panel appears on task notes themselves - any note carrying the configurable task label - with a single Add to My Day / Remove from My Day button, so a task can be filed onto today (or unfiled, link and clone together) without going to the My Day note first. Fully self-contained: it owns its settings note (myDaySchema.json/myDayConfig.json, tagged #agendaMyDayConfig) and resolves its task list from a configurable Trilium search rather than depending on agenda@beatlink's code. The default search matches agenda's task vocabulary (#startDateTime/#dueDateTime), so the two interoperate through shared label conventions, but neither requires the other. No My Day note ships with the addon: point the My Day Note setting at a text note of your own and the panel edits it. Editing in the panel reuses the CKEditor instance Trilium builds for the note detail, so until a text note has been opened once in the session the panel shows the note read-only. | 14.0.0 |
| Agenda Organize | widget | The Organize triage UI from agenda@beatlink. Nothing provisions the notebook structure any more: this addon reads the structural identity labels (#agendaOrganizeArea / #agendaOrganizeType / #agendaOrganizeSpecial) you put on your own root notes, and triages the items filed under those roots. The Organize page - shown on a note you pick in the Organize Editor - walks the Inbox, Area and Type subtrees (de-duped, since a filed item is reachable from two roots) and gives you one triage queue per classification dimension, plus a start-date queue with Morning/Noon/Evening/Night quick-times, a misfiled-notes queue that checks each note against the axis of the root it sits under, and an Invalid Roots cleanup table. Filing an item into its Area root and its Type root as a Trilium clone is this addon's per-note job. Owns its own settings note (organizeSchema.json/organizeConfig.json) tagged #agendaOrganizeConfig - the Organize note picker and the four quick-times - independent of agenda@beatlink's #agendaConfig. The classification dimensions registry deliberately stays in agenda@beatlink and is read cross-addon via #agendaConfig, because agenda's Overview derives its prefix/color/grouping/filter variants from the same list these triage queues write to; a local copy would silently drift. Item type comes from template-picker@beatlink's own registry (a note's ~template relation). Every cross-addon read degrades gracefully: until roots carry the identity labels the queues are simply empty. | 3.5.1 |
| Agenda Overview | widget | The Overview widget from agenda@beatlink, split out as its own addon: a right-pane widget whose search/filter/sort/prefix/color rules re-file the active profile's matching notes under a shared overview note shown as a built-in collection view, and write the same task list out as an iCal feed. Every value it reads - profiles, searches, filters, the display-element library and the dimensions registry - lives in agenda@beatlink's #agendaConfig settings note, which this addon discovers at runtime and never writes to; agenda@beatlink is therefore required. It ships its own copy of that addon's settings.js and dimensions.js readers, the way agenda-organize@beatlink already does, because Trilium resolves an import only within the importing note's own subtree. | 1.0.1 |
| Agenda Task | widget | The Task widget from agenda@beatlink, split out as its own addon: a right-pane editor for a note's start/due dates, duration, recurrence, and an Actions section with Complete Task and a row of reschedule buttons. Recurrence is edited in a popover behind a button that reads the rule back in plain English; the other sections are collapsible. Owns its own settings note (schema.json/config.json) tagged #agendaTaskConfig - the label-name overrides and the reschedule buttons' option registry - and its own Task Settings page that edits them. Fully independent of agenda@beatlink: no shared code, no shared settings note, no cross-addon reads in either direction. The two interoperate only through note-label conventions (the start/due/recurrence label names, which agenda declares separately in its own config) and the agenda:tasksChanged event this addon broadcasts after a change. | 3.4.4 |
| Area Picker | widget | A right pane dropdown widget for setting a note to a specific area of life, plus a Missing Areas page that triages every note still lacking one, and configurable search-based filters to exclude specific notes from the picker. | 3.5.0 |
| BlockURL | widget | Applies a BlockURL block list to Trilium Desktop's Web View note type. A blocked page is replaced with the block screen, blocked links and images are hidden on the pages you browse, and a toolbar button blocks or unblocks the page you are looking at. Needs a BlockURL sync server (https://github.com/BeatLink/BlockURL). | 1.3.0 |
| Budget | widget | Nested single-entry budget tables with monthly tracking — apply the Budget template to any note and edit Title / Income / Expense / Notes rows in place, each row showing its balance and child rows rolling up into their parents. A Transactions tab records dated income and expenses against budget rows a month at a time, and a Report tab measures the month against the plan record by record: how much stayed within each record limits versus went off them, reported separately for income and for spending (spending past an allocation, income short of or beyond expectation, or anything with no allocation at all), an itemisation of every off-budget component, budgeted vs actual per row for both columns, the month's income, and a six-month trend. Rollup behaviour (computed, own + children, or budget cap) is configurable, amounts are shown and stored at a configurable number of decimal places, rows can be expanded and collapsed individually or all at once, columns can be shown, hidden and reordered, and budgets can be imported and exported as JSON. | 2.6.0 |
| Cinnamon Applet Agenda | script | Backend API endpoint for the Trilium API Cinnamon panel applet — surfaces the earliest (or latest) past-due task matched by a configurable date label. | 1.9.0 |
| Cinnamon Applet First Child | script | Backend API endpoint for the Trilium API Cinnamon panel applet — surfaces the first child (in Trilium sort order) of a configured parent note. | 1.6.0 |
| Cinnamon Applet Inbox | script | Backend API endpoint for the Trilium API Cinnamon panel applet — surfaces the first line of a designated inbox note, with an optional embedded countdown timer and desktop notification. | 1.10.0 |
| Diet Manager | widget | A food and recipe database with a daily nutrition diary, built to replace Cronometer. Track foods with per-serving nutrition facts (manually entered or looked up via USDA FoodData Central and Open Food Facts), build recipes out of those foods with nutrition computed automatically per serving, and log servings eaten each day against configurable daily nutrient targets. Foods can be measured in several units at once (100 g or 1 tortilla), foods and recipes sort, filter and group by nestable categories, and a manually maintained grocery list tracks what to buy. All data is a single persisted JSON note. | 2.14.0 |
| Draw.io | widget | Integrates Draw.io diagram editing into TriliumNext — click any SVG note to edit it inline using the embedded Draw.io editor | 0.8.2 |
| Duplicate Finder | widget | Finds notes with matching title, content and attributes, and converts the extra copies into clones of whichever copy you choose to keep. Which fields count as a match is configurable. | 1.4.0 |
| Email to Trilium | widget | Multi-account email inbox for TriliumNext. Connects to Gmail and Microsoft (Outlook) accounts over their HTTP APIs, lists recent messages in a render view, and lets you turn any email into a note (subject + HTML body + attachments) filed under a per-account target note, or delete it from the mail account. | 1.5.0 |
| Expanded | widget | Keep selected notes always expanded in the note tree. Tick the promoted 'Always Expanded' checkbox on any note to pin it open permanently, even after restarting Trilium. The label and its promoted definition are configurable in settings. | 2.1.0 |
| Font Awesome Icons | iconpack | Font Awesome 7 free solid and brand icons as note icons, under the fa-solid and fa-brands prefixes. | 1.2.1 |
| Game Tracker | widget | A video game tracker for TriliumNext. Your whole library lives in one JSON note created under a library root you choose, so it is a single note you can back up, inspect, or hand-edit. Pick any note as the Library Root and the addon wires it up for you: it becomes a render note showing the tracker, and switching roots reverts the old one. Metadata comes from an ordered list of seven sources -- IGDB, RAWG, Steam, GOG, Lutris, SteamGridDB, and TheGamesDB -- merged FIELD BY FIELD rather than picked one at a time: the first source supplying a value wins that field, and anything it leaves empty falls through to the next, so one game can carry IGDB's platforms, SteamGridDB's cover, and Steam's summary. Reordering changes precedence and untick disables. Three sources (Steam, GOG, Lutris) need no API key at all, so the tracker works with zero setup even where Twitch's two-factor requirement makes IGDB unobtainable. The chain stops as soon as every field is filled, so sources placed lower are only consulted for genuine gaps -- which is how the quota-limited TheGamesDB stays cheap at the end of the order. Each source records which fields it supplied, so provenance is visible per game. The composite is used everywhere metadata is read, not just on import: the library refresh re-merges every enabled source rather than only the first, and the details page is composed the same way -- addressing each source by its own recorded id, the Steam appid, or the title -- so a game with no IGDB id, including a Steam-only or file-imported one, opens and refreshes exactly like any other. Steam is a one-way import source for owned games and playtime, read but never written to; on IGDB, Steam appids are resolved in bulk through the external_games index so a whole library matches in a handful of requests. A library file can also be imported directly: an IGDB GDPR data export, or any CSV/JSON list of games. Because such files carry only titles, every row is matched by name and the result is previewed -- matched, unmatched, and already-tracked counts, with the provider's own spelling shown -- before anything is written. Statuses are fully user-defined -- add, rename, recolour, reorder, or remove them on the Statuses tab. Each status carries a role (backlog / playing / done / abandoned / none) and imports target the role rather than the name, so renaming Beaten to Finished, or adding a Wishlist alongside Backlog, never breaks an import. A game stores a status id, so renaming one touches no data, and removing a status leaves every game still holding it untouched rather than silently reclassifying it. Imports are additive and idempotent: games are keyed by their strongest known id and matched on any shared id so every source converges on one entry, playtime never moves backwards, and your own ratings and status are never overwritten unless you opt in. Nothing is ever marked Beaten by a Steam import -- playtime cannot tell whether a game was finished, so that stays your call. Each import reads the database once and writes once, so it cannot half-apply. Modelled on media-tracker@beatlink, which tracks films and TV. | 1.4.0 |
| Hoist Note | widget | A launchbar button that toggles hoisting on the current note. | 2.1.0 |
| Margin Top | css | This simple CSS adds extra padding to any notes with the #cssClass=margin-top label. Useful for headings in the tree view. | 1.0.4 |
| Media Tracker | widget | A movie and TV tracker for TriliumNext. Your whole library lives in one JSON note created under a library root you choose, so it is a single note you can back up, inspect, or hand-edit. Pick any note as the Library Root and the addon wires it up for you: it becomes a render note showing the tracker, and switching roots reverts the old one. TMDB provides search, posters, and episode lists; Trakt and Stremio are one-way import sources, read but never written to. Per-episode progress for shows is a compact run-collapsed string (s01e01-e10,s02e01) rather than a list of every episode, so a fully-watched ten-season show stays a short value. Imports are additive and idempotent: titles are keyed by their strongest known id and matched on any shared id so different sources converge on one entry, episode progress is merged rather than replaced, and your own ratings and status are never overwritten unless you opt in. Each import reads the database once and writes once, so it cannot half-apply. Absorbs and replaces stremio-sync@beatlink. | 1.3.0 |
| Mobile View | widget | These set of scripts allow you to use the full capabilities of the Trilium desktop interface while on a mobile device. | 0.0.7 |
| MultiSort | script | Sorts note children by multiple attributes and criteria using the #multiSorted label. | 1.2.2 |
| Notifications | script | Polls for notes matching a date label and sends desktop notifications for past-due items. | 1.2.2 |
| Priority Widget | widget | A right pane dropdown widget for setting the priority of a note, plus a Missing Priorities page that triages every note still lacking one, and configurable search-based filters to exclude specific notes from the picker. | 3.4.0 |
| RSS Reader | widget | A feed reader for TriliumNext that also works as a full FreshRSS client. Subscribe to RSS, Atom, RSS 1.0 and JSON feeds and read them in one list, or point it at a FreshRSS server and get its feeds, folders, articles and read/starred state, with your changes pushed back through the Google Reader API it exposes. Sync is two-way: marking read or starring here reaches the server immediately, subscribing and unsubscribing happen on the server, and a change that fails to push is queued and retried on the next sync. Feeds, articles and state live in one JSON note you can back up, inspect, or hand-edit. Feed bodies are stripped of scripts and other executable markup before they are rendered. Fetching goes through a backend note, since a feed sends no CORS headers, so Trilium's backend scripting has to be enabled; there is no background sync, because parsing a feed needs the browser's XML parser and refreshes therefore happen while the widget is open. | 1.2.0 |
| Simple Calendar | widget | Shows a FullCalendar day/week/month view of either an external ics feed URL, or notes matching a configurable Trilium search, mapped to start/due date labels. Settings-driven, no manual note setup required. | 1.6.0 |
| TAMTheme | theme | A full Trilium theme carrying the Trilium Addon Manager's own white/slate/blue design language across the whole app, with a matching dark mode. | 0.1.7 |
| Template Picker | widget | A right-pane widget for assigning or changing the template of the currently active note, plus a Missing Templates page that triages every note still lacking one, and configurable search-based filters to exclude specific notes from the picker. Ships nine bundled template notes under its own persisted Templates container: eight item types (Ideas / Goal / Routine / Task / Future / Project / Note / Link, the last a Web View note carrying #webViewSrc and #url for a saved web page) and the AreaCollection container template, meant for per-area root notes rather than as an item's own type. It also ships one empty root container note per bundled item template (Ideas / Goals / Routines / Tasks / Future / Projects / Notes / Links), carrying only the template's icon and #viewType=list; as of 1.13.0 they sit beside the templates in the Templates container instead of under the AreaCollection template, so a new Area no longer comes out holding copies of them. Each registry row has a Root Note field so other addons can resolve a template's root. | 1.15.0 |
| Timer | widget | A countdown timer in its own right-pane panel, shown on every note. Pick hours, minutes and seconds from three dropdowns, then start, pause and reset; the remaining time flashes in the accent colour while it runs and in red once it expires. An editable label above the controls names what is being timed. Optional select/start/end sounds ship with the addon as customResourceProvider files and are toggled by the addon's single setting. Split out of agenda-myday@beatlink, which used to embed it in the My Day panel: it shares no code or config with the agenda addons and works on its own. | 1.2.1 |
| ToggleNote | widget | Configurable buttons to quickly add or remove the current note as a child of one or more parent notes. Supports exclusive mode and placement in either the right pane or left pane launchbar. | 1.2.0 |
| Trilium Addon Manager | widget | This addon allows for the easy installation, removal and updating of Trilium addons from any manifest URL or catalog. | 8.1.1 |
| Video Speed Controller | script | A port of the Video Speed Controller browser extension. Puts a draggable speed overlay on every HTML5 video and audio player in Trilium, with keyboard shortcuts to slow down, speed up, reset, rewind, advance, mark and jump. Works on the pages you browse in Trilium Desktop's Web View note type - where the controller is injected into the guest page the way the extension injects into a tab - and on Trilium's own video and audio notes. Speed step, preferred speed, seek distance, per-site remembered speed, controller position and opacity, every key binding, and a per-site blacklist are all configurable. | 1.1.1 |
| Web Preview | widget | Browsing toolbar for Trilium Desktop's built-in Web View note type. Adds a small toolbar (Back / Forward / Save / Open in Browser / Delete Note) above any Web View note, driving the actual Electron <webview> element Trilium already renders for that note type, plus a New Tab launchbar button that opens an address bar over the note you are reading, offering what is typed as a page to visit or a search to run alongside the configured bookmarks and the Web View notes already in the tree that match it, and filing what it opens as a child of that note. Skips sponsor segments in YouTube videos played inside a Web View note, using SponsorBlock. The user agent Web View pages see is configurable, for sites that turn away Trilium's Electron one. | 2.7.0 |
| Web View Adblock | script | Ad and tracker blocking for Trilium Desktop's built-in Web View note type, optionally driven by your Firefox uBlock Origin config. Cancels ad requests with a filter on the webview's Electron session, and injects element-hiding rules into each page to collapse the ad slots that DNS-level blockers can't touch. | 2.2.0 |
| Web View KeePassXC | script | Fills logins from KeePassXC into Trilium Desktop's built-in Web View note type. Speaks the same encrypted browser protocol keepassxc-browser speaks, straight to KeePassXC's local socket, then injects an entry picker into the page and fills the username, password and one-time code of whichever entry you choose. | 1.1.0 |
| WhiteBlueLegacy | theme | Legacy WhiteBlue theme for older versions of Trilium. A white-dominant theme with light blue accents. | 1.0.4 |
| WhiteBlueNext | theme | This theme has a heavy emphasis on the use of white backgrounds throughout the interface for light users. Light greys and other non white colors are removed where possible. A light blue color is used as an accent for controls, headings and other areas of interest | 0.0.6 |
| Workout Manager | widget | An exercise library, reusable routines, and a workout log. Exercises are entered by hand or looked up in the public wger database, and each one is measured the way it is actually trained: weight and reps, bodyweight reps, duration, or cardio duration and distance. Routines plan sets and targets per exercise and start a pre-filled workout in one click, the log records what was really done set by set, and the stats tab tracks weekly volume against a target plus personal bests and full history per exercise. Exercises and routines sort and filter by nestable categories, and an existing training history imports from either of Liftosaur's exports. All data is a single persisted JSON note. | 1.2.1 |
| YouTube Manager | widget | A YouTube subscription tracker for TriliumNext, in the spirit of NoUTube: subscribe to channels, get one feed of everything they upload, and keep a permanent record of what you watched. No Google API key and no quota. Channel data comes from YouTube.js, which reads YouTube's own InnerTube API and runs entirely in the frontend, proxied through a narrow host-allowlisted backend endpoint because YouTube sends no CORS headers. Your subscriptions, the rolling video cache, your watch history, and your playlists live in one JSON note you can back up, inspect, or hand-edit. A History tab lists everything you watched, newest first, with per-video removal and a clear-all. A Playlists tab holds playlists you build with a + on any video row, reorderable and renameable, alongside read-only snapshots of channel playlists you follow. Add channels by pasting URLs or @handles, import a FreeTube subscription export in one go, or search YouTube from the widget and subscribe to a result. The search box also opens a pasted video URL in the player and a pasted channel URL as a full channel page: banner, subscriber and video counts, uploads with a Latest/Popular/Oldest sort and paging, a search across that channel's whole catalogue, its public playlists, and an About panel with its featured channels. Playback is YouTube's iframe embed inside the widget. Sponsor segments in a playing video are skipped automatically, using SponsorBlock. Shorts are hidden by default. There is no background sync: YouTube.js ships ESM-only and cannot be loaded by a Trilium backend script, so refreshes happen while the widget is open. | 1.7.0 |
Development
nix-shell resources/nix # enter dev shell
validate # validate addon structure
ci # validate then build every addon's ZIP
zip_to_tam <zip> # convert a Trilium export ZIP into a _tam_manifest_.json
tam_to_zip <manifest> # convert a _tam_manifest_.json into a Trilium-importable ZIP
generate_pages # build GitHub Pages site into resources/docs/ (incl. catalog.json)
generate_readme # regenerate README.md's addon table from manifests