# notes

noteId: d8q85vCoLuob
type: text
mime: text/html
blobId: K8abiGfxRwBlkM9EfYoN
dateCreated: 2025-03-09 12:18:55.626+0200
dateModified: 2025-03-09 12:18:55.626+0200
utcDateCreated: 2025-03-09 10:18:56.329Z
utcDateModified: 2025-03-09 10:18:56.329Z
title:
  Error [TransformError]: The package "@esbuild/linux-x64" could not be found, and is needed by esbuild.


# options

name: openNoteContexts
utcDateModified: 2025-03-11 16:25:03.385Z
value:
  [{"ntxId":"50R4QW","mainNtxId":null,"notePath":"root/xegaRGkDMfkv/krkLW8AwcYf2/fKYGY3OOo5d1","hoistedNoteId":"root","active":true,"viewScope":{"viewMode":"default","tocPreviousVisible":false,"highlightsListPreviousVisible":false}},{"ntxId":"Ck9thr","mainNtxId":"50R4QW","notePath":"root/pOsGYCXsbNQG/KSZ04uQ2D1St/grjYqerjn243","hoistedNoteId":"root","active":false,"viewScope":{"viewMode":"default","tocPreviousVisible":false,"highlightsListPreviousVisible":false}}]


name: allowedHtmlTags
utcDateModified: 2025-03-09 07:48:52.566Z
value:
  ["h1","h2","h3","h4","h5","h6","blockquote","p","a","ul","ol","li","b","i","strong","em","strike","s","del","abbr","code","hr","br","div","table","thead","caption","tbody","tfoot","tr","th","td","pre","section","img","figure","figcaption","span","label","input","details","summary","address","aside","footer","header","hgroup","main","nav","dl","dt","menu","bdi","bdo","dfn","kbd","mark","q","time","var","wbr","area","map","track","video","audio","picture","del","ins","en-media","acronym","article","big","button","cite","col","colgroup","data","dd","fieldset","form","legend","meter","noscript","option","progress","rp","samp","small","sub","sup","template","textarea","tt"]


# blobs

blobId: XTz8cgAowvFG5udJHyO4
dateModified: 2025-03-09 10:46:07.608+0200
utcDateModified: 2025-03-09 08:46:07.803Z
content:
  <h2>Canvas-note</h2>
  <p>(Since trilium v0.52)</p>
  <p>Canvas note use the excalidraw library to allow handwritten notes with mouse, pen or touch on an infinite canvas. It also supports basic diagramming, text and garphics input.</p>
  <p><img src="api/images/IYMnSG4HrC1K/Canvas-note image.png" alt="grafik" /></p>


blobId: 582L65fXh2080vLuCJxD
dateModified: 2025-03-09 10:46:07.608+0200
utcDateModified: 2025-03-09 08:46:07.904Z
content:
  <h2>Home</h2>
  <h2>Overview</h2>
  <p>Basic overview of the Trilium project is available at project homepage - <a href="https://github.com/triliumnext/notes#trilium-notes">https://github.com/triliumnext/notes#trilium-notes</a></p>
  <p>Inspiration for the name "Trilium":</p>
  <blockquote>
  <p>Naming software is hard. I lived in Ontario when I first started the project and Trillium (the flower) is sort of a provincial logo, many institutions in Ontario are named "Trillium [something]". So I kept hearing/reading it almost everyday, I liked the sound of it and its nature motif, so I just reused it.</p>
  </blockquote>
  <blockquote>
  <p>~ Zadam (Trilium Developer)</p>
  </blockquote>
  <h2>Documentation</h2>
  <p>This <a href="https://github.com/TriliumNext/Notes/wiki">wiki</a> %%{WARNING}%% contains additional and more in-depth information on some topics. See the sidebar for listing of all available pages.</p>
  <h2>Quick Start</h2>
  <h2>Choose the setup</h2>
  <p><strong>Local only desktop/laptop</strong> - Allows a single instance on a desktop and will save the notes locally on that desktop.</p>
  <ol>
  <li><a href="#root/poXkQfguuA0U">Desktop installation</a></li>
  </ol>
  <p><strong>Server with web only access</strong> - Installs the application on the server and allows access from any web browser on any device, including mobile.</p>
  <ol>
  <li><a href="#root/WOcw2SLH6tbX">Server installation</a></li>
  <li><a href="#root/RDslemsQ6gCp">Mobile frontend</a> (optional)</li>
  <li><a href="https://heroku.com/deploy?template=https://github.com/feilongfl/trilium-heroku"><img src="api/images/B0kIDkK5rnIf/Home button.svg" alt="Deploy" /></a></li>
  <li><a href="https://www.pikapods.com/pods?run=trilium-next">PikaPods managed hosting</a></li>
  </ol>
  <p><strong>Combination of server and desktop/laptop</strong> - Install the application on both a server, for web access and data synchronization, and desktop instance(s). This allows all the data to be stored on the server and either accessed from the web browser, or the desktop application. The desktop application will sync and store the data locally so that it can be used when offline.</p>
  <ol>
  <li><a href="#root/WOcw2SLH6tbX">Server installation</a></li>
  <li><a href="#root/RDslemsQ6gCp">Mobile frontend</a> (optional)</li>
  <li><a href="#root/poXkQfguuA0U">Desktop installation</a></li>
  <li><a href="#root/cbkrhQjrkKrh">Synchronization</a></li>
  </ol>
  <h2>Basic concepts</h2>
  <ol>
  <li>Understand <a href="#root/BFs8mudNFgCS">Note</a></li>
  <li>Watch the <a href="#root/lD2Qh6zp8k4d">Screenshot tour</a></li>
  </ol>


blobId: hv9ljYgP87YPAt2HBpYW
dateModified: 2025-03-09 10:46:07.608+0200
utcDateModified: 2025-03-09 08:46:08.302Z
content:
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19.045 7.401c.378-.378.586-.88.586-1.414s-.208-1.036-.586-1.414l-1.586-1.586c-.378-.378-.88-.586-1.414-.586s-1.036.208-1.413.585L4 13.585V18h4.413L19.045 7.401zm-3-3 1.587 1.585-1.59 1.584-1.586-1.585 1.589-1.584zM6 16v-1.585l7.04-7.018 1.586 1.586L7.587 16H6zm-2 4h16v2H4z"/></svg>


blobId: lzXe9SXKofT3BQC2GwEI
dateModified: 2025-03-09 10:46:07.608+0200
utcDateModified: 2025-03-09 08:46:09.334Z
content:
  <h2>Importing Documentation</h2>
  <p>To import these docs into your own Trilium instance:</p>
  <ol>
  <li>Download archive from main branch of this repo:
  <a href="https://github.com/TriliumNext/Docs/archive/refs/heads/main.zip">https://github.com/TriliumNext/Docs/archive/refs/heads/main.zip</a></li>
  <li>In Trilim create a new note to act as branch for the docs</li>
  <li>Right-click on the note, select "Import into note" and select downloaded <code>Docs-main.zip</code> file.<ul>
  <li>Optionally uncheck "Shrink images"</li>
  </ul>
  </li>
  </ol>
  <h2>Optional cleanup</h2>
  <ul>
  <li>delete <code>!!!meta.json</code></li>
  <li>Move <code>images</code> node down to the bottom (instead of dragging, it's easier to move out to parent node than back into Wiki. It will go to end of list automatically).</li>
  </ul>
  <p>For new releases delete the old docs note tree and start fresh, or you'll get duplicates.</p>


blobId: xFRauqR2DDCvaACOXBqB
dateModified: 2025-03-09 10:46:07.608+0200
utcDateModified: 2025-03-09 08:46:09.460Z
content:
  <h2>Patterns-of-personal-knowledge</h2>
  <h2>Patterns-of-personal-knowledge-base</h2>
  <p>This page contains description of some of the patterns I use to organize information in my knowledge base. This is meant to give some inspiration of how one might create and structure their knowledge base in general and also specifically in <a href="https://github.com/triliumnext/notes">Trilium Notes</a>. It also gives some background and justification for some of the design decisions.</p>
  <h2>Meta patterns</h2>
  <p>Just to be clear, meta patterns are "patterns of patterns", i.e. patterns appearing in other patterns.</p>
  <h3>Hierarchical organization of information</h3>
  <p>Basic meta pattern is that I sort notes (units of information) into a hierarchy - I have some "top level" notes which represent coarse grained organization, these then split into sub-notes defining finer grained organization and so on. I consider this hierarchical (tree) organization very efficient for organization of large amounts of information. A lot of note taking software (such as Evernote) are frustratingly limited in this regard which limits scalability of the software to large amounts of notes.</p>
  <h4>Scalability</h4>
  <p>It's important to frame the following (meta) patterns with some idea of how large amount of data are we talking about.</p>
  <p>My rule of thumb for estimation of size of personal knowledge base is that you can reasonably produce around 10 notes a day, which is 3650 in a year. I plan to use my knowledge base long term (with or without Trilium Notes), probably decades so you can easily get to number 100 000 or even more. Right now, my personal knowledge base has around 10 000 notes.</p>
  <p>100 000 is a number to which most note taking software doesn't scale well (in both performance and UI). Yet I don't think it's really very much considering a lifetime of knowledge.</p>
  <h4>Lazy hierarchy</h4>
  <p>My approach to creating the hierarchy is being lazy - I don't create the structure first and then fill it with notes, instead I create single note for some specific topic and start using this one note. Once the content starts to grow, and I see how <em>some</em> parts could be split out, I move them out into separate sub notes. As an example I have a book review for <em>The Fellowship of the Ring</em>:</p>
  <ul>
  <li>Book reviews<ul>
  <li>The Fellowship of the Ring</li>
  </ul>
  </li>
  </ul>
  <p>The note contains basic book info (author, publisher etc.), book highlights with the comments and then overall review. Now it turns out there's far too many book highlights and overall review is also rather long, so I want to change the structure to the following:</p>
  <ul>
  <li>Book reviews<ul>
  <li>The Fellowship of the Ring       <em>(still contains basic info)</em><ul>
  <li>Highlights</li>
  <li>Review</li>
  </ul>
  </li>
  </ul>
  </li>
  </ul>
  <p>If I used standard text file stored in a filesystem I would soon run into an annoying problem that in order to split out the Highlights and Review into sub-notes I would also have to convert <em>The Fellowship of the Ring</em> from text file into directory and split out all sections of the note into sub-notes. Instead, Trilium treats all notes as equal - both leaf notes and inner notes can have both text content which allows me to sub-structure only content which needs it.</p>
  <h3>Sorting notes into multiple places in the hierarchy</h3>
  <p>While organizing the notes into the hierarchy, you very quickly run into a dilemma - your note seem to belong to two places in the hierarchy equally. As an example - you want to make a note about <a href="https://en.wikipedia.org/wiki/Bash_(Unix_shell)">bash</a> - does it belong to "OS / Linux" or "Programming / Scripting languages"? This is actually a false dichotomy forced down by the limits of the basic tree hierarchy - the answer is <em>of course it belongs to both</em>. This is the reason why Trilium doesn't use standard tree structure (which requires every note to have exactly one parent), but an extension which allows every note to have several parents, thus effectively allowing it to appear in multiple places in the hierarchy. For lack of better term I call this "<a href="https://github.com/TriliumNext/Notes/wiki/Cloning_notes">cloning</a>". The main problem with this term is that it suggests that each clone must have an original, but here all clones are completely equal - effectively there's no original.</p>
  <p>In tech lingo, it might be better to describe it as a <a href="https://en.wikipedia.org/wiki/Hard_link">hard link</a> with an important difference that it is possible to hard link (clone) a directory (inner note).</p>
  <h3>Protected notes</h3>
  <p>I have Trilium Notes opened non-stop. Sometimes I forget to lock my computer when going to the bathroom. Sometimes I let a friend or family member to use my computer for a minute without supervision. They might click on (running) Trilium and inadvertently see a note I really don't want anybody to see (personal diary, credentials). To cover this, Trilium has a concept of "<a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected notes</a>" - protected note is encrypted and on top of that requires the user to enter the password every 5 minutes which guarantees that such note can be in a readable state only for small amount of time. Working with ordinary (not protected) notes don't require password so you're not bothered by extra security when it's not needed.</p>
  <h3>Archiving notes</h3>
  <p>Notes can lose relevancy with time - let's say I switch jobs - all the notes specific to the former employer immediately lose most of its import. This doesn't mean I want to delete these notes though - typically I just want them to somehow deprioritize - in Trilium I would do that by assigning an <a href="https://github.com/TriliumNext/Notes/wiki/Attribute-inheritance">inherited</a> <a href="https://github.com/TriliumNext/Notes/wiki/Attributes">label</a> <code>archived</code> to the company root note. The main effect of this label is that all the notes from this sub-tree are filtered out from search results (fast search via note autocomplete is my main <a href="https://github.com/TriliumNext/Notes/wiki/Note-navigation">navigation approach</a>). Apart from this, I also typically move such outdated notes to some less prominent place in the hierarchy.</p>
  <p>I use archivation also for notes which are not very relevant from their creation - an example might be automatically imported reddit comments.</p>
  <p>Sometimes there's no clear <em>category</em> split between relevant and non-relevant notes, in that case I just create "<em>OLD</em>" note with <code>archived</code> label and move all irrelevant notes there. So my credentials note might look something like this:</p>
  <ul>
  <li>Credentials<ul>
  <li>Personal<ul>
  <li>OLD       <em>(contains a bunch of notes with credentials for services I don't use anymore)</em></li>
  <li>Gmail</li>
  <li>Github</li>
  <li>...</li>
  </ul>
  </li>
  </ul>
  </li>
  </ul>
  <h2>Patterns</h2>
  <h3>Day note</h3>
  <p>Every day has its note which contains or references everything related to the given day. Structure looks like this:</p>
  <ul>
  <li>2018<ul>
  <li>11 - November<ul>
  <li>26 - Monday</li>
  <li>27 - Tuesday<ul>
  <li>subnote 1</li>
  </ul>
  </li>
  </ul>
  </li>
  </ul>
  </li>
  </ul>
  <p>Day note serves as a workspace and note inbox at the same time - it's the default location to create a note when I don't have time to think about proper placement. At the end of the day I typically review my day note and clone the notes into suitable locations in the hierarchy.</p>
  <p>Trilium has this pattern partly built-in - Trilium understands and can create this Year / Month / Day structure semi-automatically (on API call). There's also global keyboard shortcut <code>CTRL-ALT-P</code> which will create new note in the day note.</p>
  <p>What notes do I keep under this day note?</p>
  <ul>
  <li>TODO list for given day (this can be automated - see <a href="https://github.com/TriliumNext/Notes/wiki/Task-manager">Task Manager</a>)</li>
  <li>Personal diary</li>
  <li><a href="https://github.com/TriliumNext/Notes/wiki/Cloning-notes">clones</a> of notes I created during this day (which kind of represents what I've been working on).</li>
  <li>I often clone notes (or sub-trees) of e.g. projects I'm working on at given day so they are at hand</li>
  <li>I have some <a href="https://github.com/TriliumNext/Notes/wiki/Scripts">scripts</a> which allow me to track certain daily metrics (like weight). These are saved into one daily "data note" (actually JSON <a href="https://github.com/TriliumNext/Notes/wiki/Code-notes">code note</a>).<ul>
  <li>I have other scripts which then help me to visualize these data (see a <a href="https://github.com/TriliumNext/Notes/wiki/Weight%20tracker">Weight Tracker</a> example)</li>
  <li>I have a script which automatically imports all my comments from reddit into the day note.<ul>
  <li>People are sometimes wondering why. The answer is that I usually put some effort and thought into a comment and that's why I feel it's worth preserving, especially if it can be done automatically.</li>
  </ul>
  </li>
  </ul>
  </li>
  </ul>
  <p>For most notes, this day note placement is <em>secondary</em> and their primary location is somewhere else (e.g. for a book review I've been working on it's <em>Book / Reviews</em>, not the day note). So for this pattern to work, ability to <a href="https://github.com/TriliumNext/Notes/wiki/Cloning-notes">clone</a> notes into multiple places is pretty fundamental.</p>
  <h3>Projects</h3>
  <p><em>Project</em> is pretty self-explanatory, for me specifically it also means being long term (years) - an example of a project might be Trilium Notes or university studies. Given their longevity, projects can be large and deep, but their structure is very domain specific, and I don't see any common patterns. What's pretty clear is they are often widely interconnected with other parts of the knowledge base - e.g. university credentials are cloned from "Credentials / University" top level notes and Trilium related blog posts are in "Blog / [Name of the blog] / Trilium".</p>
  <p><em>Epics</em> are the same thing as projects, but differ in scope - they are typically several months long and as such are usually placed into a year note (e.g. <em>2018 / Epics</em>). Epics are often of work nature (also cloned into work note) and personal (e.g. currently I have large epic for moving to a different city).</p>
  <p>I don't have a term for short term projects (typically several days long), but continuing the scrum analogy I might call them <em>story</em>. These are often placed directly into day notes and manually moved from one day to another (or place into a month note, e.g. <em>2018 / 11 - November</em>).</p>
  <h3>Credentials</h3>
  <p>I keep all my credentials in the knowledge base, they are sorted into categories - work related, project related, personal per country etc. These notes are of course <a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected</a> and are often cloned into other places (e.g. project credentials are cloned into the project itself). This is a pretty important advantage compared to traditional tools like KeePass - all the relevant information is centralized into one place without compromising security.</p>
  <h3>People profiles</h3>
  <p>This might seem creepy to some, but I keep a profile on most people. It contains pretty standard things like date of birth, contacts, address, but also current and previous employments, their hobbies and worldviews and sometimes even important (IM/mail/meatspace) conversations. Just about everything I find notable. It helps to refresh some basic info before meeting people, especially if you haven't been in touch in a while. It gets pretty awkward to ask for the tenth time where do they work for example, because you keep forgetting it.</p>
  <p>Naturally I have a lot of (extended) family members, friends, acquaintances etc. so I need some way to sort them. My main method is to sort them by social circle (work, high school, sports club etc.), sometimes also by their town of residence. Family <em>circle</em> is still too large so the further organization is by <em>clan</em> (as in "Smiths"). Some people are members of several such circles, so they are just cloned into multiple places.</p>
  <p>For family specifically it's pretty useful to create <a href="https://github.com/TriliumNext/Notes/wiki/Relation-map">relation map</a> to visualize relationships:</p>
  <p><img src="api/images/xeZPrfi77XPu/relation-map-family.png" alt="" /></p>
  <h3>Books</h3>
  <p>Of course, I keep standard "To read" list. I also keep a record on the books I've read - typically one book has one subtree where the root has some basic info like author, page count, publication date, date started, date finished (in the form of <a href="https://github.com/TriliumNext/Notes/wiki/Promoted-attributes">promoted labels</a>). I also write a (private) review and keep list of highlights from Kindle, optionally with some commentary, these are usually stored in sub notes (unless they are pretty short).</p>
  <p>To keep the list of books manageable, I sort them per year (of reading them), this also gives me some basic overview of "reading performance" for given year. I plan to create a <a href="https://github.com/TriliumNext/Notes/wiki/Scripts">script</a> which would show some timeline chart visualizing book attributes <code>dateStarted</code> - <code>dateFinished</code> to have nicer view of my reading sprints and trends.</p>
  <p>Some specific authors also have their own note which contains cloned book reviews, links to interviews and other related resources.</p>
  <p>I have similar system for movies and TV shows, but not as sophisticated.</p>
  <h3>Personal diary</h3>
  <p>This is a place to reflect on events, experiences, new findings etc. This can help you get deeper understanding of your inner self, clarify your thinking and make better decisions as a result.</p>
  <p>I sort personal diary notes directly under <em>day note</em> (explained above), but it can be cloned also to e.g. "trip note" (if the diary note is about given trip) or to person's profile (if the person plays a role in the diary note). All my diary notes are <a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected</a> since they are usually pretty sensitive.</p>
  <h3>Documents</h3>
  <p>I keep all my personal documents (ID, passport, education certificates ...) scanned in the knowledge base. They are <a href="https://github.com/TriliumNext/Notes/wiki/Synchronization">synchronized</a> across every PC which provides decent backup and makes them available everywhere.</p>
  <p>Advantage compared to e.g. keeping them in Dropbox or Google Drive is that they are not stored on some 3rd party server and they can be encrypted (<a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected</a>).</p>
  <h3>Inventory</h3>
  <p>Inventory contains documents and other relevant importation for my important belongings - e.g. for car you can keep the registration card, maintenance record, related costs etc. I also keep inventory for some items personally important to me - mainly computers, phones, cameras and similar electronics. This can be practical at times but also provides sentimental value.</p>
  <h3>Topic knowledge base</h3>
  <p>This where I store hard "knowledge" - summarized topics and findings from different domains. Topics can range from traditional sciences - physics, history, economy to philosophy, mental models, apps (notes about specific apps I use) etc. Of course this is very subjective - given what I do, my Physics sub-tree is pretty sparse compared to my Programming subtree.</p>
  <h3>Work knowledge base</h3>
  <p>I usually keep top level note for the company I currently work at (past jobs are moved elsewhere). I track basic organization of the company (divisions, business units), who is who (<a href="https://github.com/TriliumNext/Notes/wiki/Relation-map">relation maps</a>) are again useful for visualization), projects I work at etc.</p>
  <p>There's a number of credentials to various company services I need to use. Companies usually have a bunch of complex processes and tools. I record meeting minutes, link to the company wiki (which is usually difficult to find relevant info). In general there's a lot of company specific information I need to know or need have them at hand in a nice structure I can understand. Often it's just copy pasting and reshuffling of existing information into something more understandable for me.</p>
  <p>From my experience, keeping this makes me more productive and even more importantly dramatically reduces frustration and stress.</p>
  <h2>Conclusion</h2>
  <p>I could probably go on with more patterns (e.g. study notes, travelling), but I think you get the idea. Whatever is important in your life, it probably makes sense to document and track it.</p>


blobId: mIaQ4QAg7W3FArnp2QYf
dateModified: 2025-03-09 10:46:07.608+0200
utcDateModified: 2025-03-09 08:46:09.466Z
content:
  <h2>Privacy-policy</h2>
  <h3>Trilium Notes</h3>
  <p>Trilium Notes does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary.</p>
  <p>Automatic network activity consists of:</p>
  <ul>
  <li>Trilium periodically queries URL <a href="https://github.com/TriliumNext/Notes/releases">https://github.com/TriliumNext/Notes/releases</a> to see if there's a new stable version released. (check only, there's no automatic download and/or installation).</li>
  <li>Trilium will download spelling dictionaries automatically as needed based on language settings</li>
  </ul>
  <h3>Trilium Web Clipper</h3>
  <p>Trilium Web Clipper does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary.</p>
  <h3>Trilium Sender for Android</h3>
  <p>Trilium Sender for Android does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary.</p>


blobId: MFoS3W6YFhVq4XPQcPSd
dateModified: 2025-03-09 10:46:07.608+0200
utcDateModified: 2025-03-09 08:46:09.495Z
content:
  <h2>Screenshot tour</h2>
  <p>Sometimes the fastest way to assess the software is just through screenshots so here they are:</p>
  <p><img src="api/images/V01a3OdC9O06/screenshot.png" alt="" /></p>
  <p><img src="api/images/zaQnUsJTbvjr/dark-theme.png" alt="" /></p>
  <p>See <a href="#root/Wy267RK4M69c">Themes</a>.</p>
  <p><img src="api/images/8jgXl1RUGL4H/code-note.png" alt="" /></p>
  <p>This shows <a href="#root/6f9hih2hXXZk">code note</a> editor.</p>
  <p><img src="api/images/umjOUcnZi4z2/promoted-attributes-queen.png" alt="" /></p>
  <p>See <a href="#root/OFXdgB2nNk1F">promoted attributes</a></p>
  <p><img src="api/images/xeZPrfi77XPu/relation-map-family.png" alt="" /></p>
  <p>See <a href="#root/iRwzGnHPzonm">relation map</a>.</p>
  <p><img src="api/images/5nE2aM3crNI6/link-map.png" alt="" /></p>
  <p>See <a href="#root/Hdf1kG6Kvcl1">link map</a>.</p>
  <p><img src="api/images/nQf1irAyZrZl/day-notes.png" alt="" /></p>
  <p>See <a href="#root/l0tKav7yLHGF">Day notes</a>.</p>
  <p><img src="api/images/PFrpANAUte0M/weight-tracker.png" alt="" /></p>
  <p>See <a href="#root/R7abl2fc6Mxi">Weight tracker</a>.</p>
  <p><img src="api/images/92KeXdKh3Ca1/task-manager.png" alt="" /></p>
  <p>See <a href="#root/xYjQUYhpbUEW">Task manager</a>.</p>
  <p><img src="api/images/MA2uvkVloWXl/note-revisions.png" alt="" /></p>
  <p>See <a href="#root/vZWERwf8U3nx">Note revisions</a>.</p>
  <p><img src="api/images/TFAiJIXJFfqv/mobile-smartphone.png" alt="" /></p>
  <p><img src="api/images/fi37V32TNyzm/mobile-tablet.png" alt="" /></p>
  <p>See <a href="#root/RDslemsQ6gCp">Mobile frontend</a>.</p>


blobId: beXdlYxXQ1rhBVjl1bNG
dateModified: 2025-03-09 10:51:55.984+0200
utcDateModified: 2025-03-09 08:51:55.985Z
content:
  <ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate titles of the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Set <code>#shareAlias</code> for all the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Recreate structure of notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Merge images into their corresponding notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Review and delete each note from Pikapod</span></label></li></ul>


blobId: tuELQyserkydZ0jLONJQ
dateModified: 2025-03-09 11:05:56.271+0200
utcDateModified: 2025-03-09 09:05:56.272Z
content:
  <p>(Since trilium v0.52)</p><p>Canvas note use the excalidraw library to allow handwritten notes with mouse, pen or touch on an infinite canvas. It also supports basic diagramming, text and garphics input.</p><p><img src="api/images/IYMnSG4HrC1K/Canvas-note image.png" alt="grafik"></p>


blobId: jUOOGKz1cj5kdn3JiuwR
dateModified: 2025-03-09 11:10:18.996+0200
utcDateModified: 2025-03-09 09:10:18.997Z
content:
  <h2>Overview</h2><p>Basic overview of the Trilium project is available at project homepage - <a href="https://github.com/triliumnext/notes#trilium-notes">https://github.com/triliumnext/notes#trilium-notes</a></p><p>Inspiration for the name "Trilium":</p><blockquote><p>Naming software is hard. I lived in Ontario when I first started the project and Trillium (the flower) is sort of a provincial logo, many institutions in Ontario are named "Trillium [something]". So I kept hearing/reading it almost everyday, I liked the sound of it and its nature motif, so I just reused it.</p></blockquote><blockquote><p>~ Zadam (Trilium Developer)</p></blockquote><h2>Documentation</h2><p>This <a href="https://github.com/TriliumNext/Notes/wiki">wiki</a> %%{WARNING}%% contains additional and more in-depth information on some topics. See the sidebar for listing of all available pages.</p><h2>Quick Start</h2><h2>Choose the setup</h2><p><strong>Local only desktop/laptop</strong> - Allows a single instance on a desktop and will save the notes locally on that desktop.</p><ol><li><a href="#root/poXkQfguuA0U">Desktop installation</a></li></ol><p><strong>Server with web only access</strong> - Installs the application on the server and allows access from any web browser on any device, including mobile.</p><ol><li><a href="#root/WOcw2SLH6tbX">Server installation</a></li><li><a href="#root/RDslemsQ6gCp">Mobile frontend</a> (optional)</li><li><a href="https://heroku.com/deploy?template=https://github.com/feilongfl/trilium-heroku"><img src="api/images/B0kIDkK5rnIf/Home button.svg" alt="Deploy"></a></li><li><a href="https://www.pikapods.com/pods?run=trilium-next">PikaPods managed hosting</a></li></ol><p><strong>Combination of server and desktop/laptop</strong> - Install the application on both a server, for web access and data synchronization, and desktop instance(s). This allows all the data to be stored on the server and either accessed from the web browser, or the desktop application. The desktop application will sync and store the data locally so that it can be used when offline.</p><ol><li><a href="#root/WOcw2SLH6tbX">Server installation</a></li><li><a href="#root/RDslemsQ6gCp">Mobile frontend</a> (optional)</li><li><a href="#root/poXkQfguuA0U">Desktop installation</a></li><li><a href="#root/cbkrhQjrkKrh">Synchronization</a></li></ol><h2>Basic concepts</h2><ol><li>Understand <a href="#root/BFs8mudNFgCS">Note</a></li><li>Watch the <a href="#root/lD2Qh6zp8k4d">Screenshot tour</a></li></ol>


blobId: ixEpdAbLnyxbLhsnImOb
dateModified: 2025-03-09 11:10:30.622+0200
utcDateModified: 2025-03-09 09:10:30.622Z
content:
  <p>To import these docs into your own Trilium instance:</p><ol><li>Download archive from main branch of this repo: <a href="https://github.com/TriliumNext/Docs/archive/refs/heads/main.zip">https://github.com/TriliumNext/Docs/archive/refs/heads/main.zip</a></li><li>In Trilim create a new note to act as branch for the docs</li><li>Right-click on the note, select "Import into note" and select downloaded <code>Docs-main.zip</code> file.<ul><li>Optionally uncheck "Shrink images"</li></ul></li></ol><h2>Optional cleanup</h2><ul><li>delete <code>!!!meta.json</code></li><li>Move <code>images</code> node down to the bottom (instead of dragging, it's easier to move out to parent node than back into Wiki. It will go to end of list automatically).</li></ul><p>For new releases delete the old docs note tree and start fresh, or you'll get duplicates.</p>


blobId: In45hJLl2GywfaRMHGHG
dateModified: 2025-03-09 11:11:23.800+0200
utcDateModified: 2025-03-09 09:11:23.800Z
content:
  <ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate titles of the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Set <code>#shareAlias</code> for all the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Recreate structure of notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Merge images into their corresponding notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Review and delete each note from Pikapod</span></label></li></ul><hr><p>Broken images:</p><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/fKYGY3OOo5d1">Canvas Note</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/l0tKav7yLHGF">Day notes</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/aCE9SFyzUrod">Home</a></span></label></li></ul><p>Content changes:</p><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/poXkQfguuA0U">Desktop Installation Guide</a></span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Mention Windows installation.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate Fedora documentation</span></label></li></ul></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/Hdf1kG6Kvcl1">Link map</a>&nbsp;– it's empty</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/QEAPj01N5f7w">links</a>&nbsp;- extremely old GIFs.</span></label></li></ul>


blobId: KjxJBWJAXkaLOPCDsDa2
dateModified: 2025-03-09 11:13:29.188+0200
utcDateModified: 2025-03-09 09:13:29.189Z
content:
  <p>This page contains description of some of the patterns I use to organize information in my knowledge base. This is meant to give some inspiration of how one might create and structure their knowledge base in general and also specifically in <a href="https://github.com/triliumnext/notes">Trilium Notes</a>. It also gives some background and justification for some of the design decisions.</p><h2>Meta patterns</h2><p>Just to be clear, meta patterns are "patterns of patterns", i.e. patterns appearing in other patterns.</p><h3>Hierarchical organization of information</h3><p>Basic meta pattern is that I sort notes (units of information) into a hierarchy - I have some "top level" notes which represent coarse grained organization, these then split into sub-notes defining finer grained organization and so on. I consider this hierarchical (tree) organization very efficient for organization of large amounts of information. A lot of note taking software (such as Evernote) are frustratingly limited in this regard which limits scalability of the software to large amounts of notes.</p><h4>Scalability</h4><p>It's important to frame the following (meta) patterns with some idea of how large amount of data are we talking about.</p><p>My rule of thumb for estimation of size of personal knowledge base is that you can reasonably produce around 10 notes a day, which is 3650 in a year. I plan to use my knowledge base long term (with or without Trilium Notes), probably decades so you can easily get to number 100 000 or even more. Right now, my personal knowledge base has around 10 000 notes.</p><p>100 000 is a number to which most note taking software doesn't scale well (in both performance and UI). Yet I don't think it's really very much considering a lifetime of knowledge.</p><h4>Lazy hierarchy</h4><p>My approach to creating the hierarchy is being lazy - I don't create the structure first and then fill it with notes, instead I create single note for some specific topic and start using this one note. Once the content starts to grow, and I see how <i>some</i> parts could be split out, I move them out into separate sub notes. As an example I have a book review for <i>The Fellowship of the Ring</i>:</p><ul><li>Book reviews<ul><li>The Fellowship of the Ring</li></ul></li></ul><p>The note contains basic book info (author, publisher etc.), book highlights with the comments and then overall review. Now it turns out there's far too many book highlights and overall review is also rather long, so I want to change the structure to the following:</p><ul><li>Book reviews<ul><li>The Fellowship of the Ring &nbsp; &nbsp; &nbsp;&nbsp;<i>(still contains basic info)</i><ul><li>Highlights</li><li>Review</li></ul></li></ul></li></ul><p>If I used standard text file stored in a filesystem I would soon run into an annoying problem that in order to split out the Highlights and Review into sub-notes I would also have to convert <i>The Fellowship of the Ring</i> from text file into directory and split out all sections of the note into sub-notes. Instead, Trilium treats all notes as equal - both leaf notes and inner notes can have both text content which allows me to sub-structure only content which needs it.</p><h3>Sorting notes into multiple places in the hierarchy</h3><p>While organizing the notes into the hierarchy, you very quickly run into a dilemma - your note seem to belong to two places in the hierarchy equally. As an example - you want to make a note about <a href="https://en.wikipedia.org/wiki/Bash_(Unix_shell)">bash</a> - does it belong to "OS / Linux" or "Programming / Scripting languages"? This is actually a false dichotomy forced down by the limits of the basic tree hierarchy - the answer is <i>of course it belongs to both</i>. This is the reason why Trilium doesn't use standard tree structure (which requires every note to have exactly one parent), but an extension which allows every note to have several parents, thus effectively allowing it to appear in multiple places in the hierarchy. For lack of better term I call this "<a href="https://github.com/TriliumNext/Notes/wiki/Cloning_notes">cloning</a>". The main problem with this term is that it suggests that each clone must have an original, but here all clones are completely equal - effectively there's no original.</p><p>In tech lingo, it might be better to describe it as a <a href="https://en.wikipedia.org/wiki/Hard_link">hard link</a> with an important difference that it is possible to hard link (clone) a directory (inner note).</p><h3>Protected notes</h3><p>I have Trilium Notes opened non-stop. Sometimes I forget to lock my computer when going to the bathroom. Sometimes I let a friend or family member to use my computer for a minute without supervision. They might click on (running) Trilium and inadvertently see a note I really don't want anybody to see (personal diary, credentials). To cover this, Trilium has a concept of "<a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected notes</a>" - protected note is encrypted and on top of that requires the user to enter the password every 5 minutes which guarantees that such note can be in a readable state only for small amount of time. Working with ordinary (not protected) notes don't require password so you're not bothered by extra security when it's not needed.</p><h3>Archiving notes</h3><p>Notes can lose relevancy with time - let's say I switch jobs - all the notes specific to the former employer immediately lose most of its import. This doesn't mean I want to delete these notes though - typically I just want them to somehow deprioritize - in Trilium I would do that by assigning an <a href="https://github.com/TriliumNext/Notes/wiki/Attribute-inheritance">inherited</a> <a href="https://github.com/TriliumNext/Notes/wiki/Attributes">label</a> <code>archived</code> to the company root note. The main effect of this label is that all the notes from this sub-tree are filtered out from search results (fast search via note autocomplete is my main <a href="https://github.com/TriliumNext/Notes/wiki/Note-navigation">navigation approach</a>). Apart from this, I also typically move such outdated notes to some less prominent place in the hierarchy.</p><p>I use archivation also for notes which are not very relevant from their creation - an example might be automatically imported reddit comments.</p><p>Sometimes there's no clear <i>category</i> split between relevant and non-relevant notes, in that case I just create "<i>OLD</i>" note with <code>archived</code> label and move all irrelevant notes there. So my credentials note might look something like this:</p><ul><li>Credentials<ul><li>Personal<ul><li>OLD &nbsp; &nbsp; &nbsp;&nbsp;<i>(contains a bunch of notes with credentials for services I don't use anymore)</i></li><li>Gmail</li><li>Github</li><li>...</li></ul></li></ul></li></ul><h2>Patterns</h2><h3>Day note</h3><p>Every day has its note which contains or references everything related to the given day. Structure looks like this:</p><ul><li>2018<ul><li>11 - November<ul><li>26 - Monday</li><li>27 - Tuesday<ul><li>subnote 1</li></ul></li></ul></li></ul></li></ul><p>Day note serves as a workspace and note inbox at the same time - it's the default location to create a note when I don't have time to think about proper placement. At the end of the day I typically review my day note and clone the notes into suitable locations in the hierarchy.</p><p>Trilium has this pattern partly built-in - Trilium understands and can create this Year / Month / Day structure semi-automatically (on API call). There's also global keyboard shortcut <code>CTRL-ALT-P</code> which will create new note in the day note.</p><p>What notes do I keep under this day note?</p><ul><li>TODO list for given day (this can be automated - see <a href="https://github.com/TriliumNext/Notes/wiki/Task-manager">Task Manager</a>)</li><li>Personal diary</li><li><a href="https://github.com/TriliumNext/Notes/wiki/Cloning-notes">clones</a> of notes I created during this day (which kind of represents what I've been working on).</li><li>I often clone notes (or sub-trees) of e.g. projects I'm working on at given day so they are at hand</li><li>I have some <a href="https://github.com/TriliumNext/Notes/wiki/Scripts">scripts</a> which allow me to track certain daily metrics (like weight). These are saved into one daily "data note" (actually JSON <a href="https://github.com/TriliumNext/Notes/wiki/Code-notes">code note</a>).<ul><li>I have other scripts which then help me to visualize these data (see a <a href="https://github.com/TriliumNext/Notes/wiki/Weight%20tracker">Weight Tracker</a> example)</li><li>I have a script which automatically imports all my comments from reddit into the day note.<ul><li>People are sometimes wondering why. The answer is that I usually put some effort and thought into a comment and that's why I feel it's worth preserving, especially if it can be done automatically.</li></ul></li></ul></li></ul><p>For most notes, this day note placement is <i>secondary</i> and their primary location is somewhere else (e.g. for a book review I've been working on it's <i>Book / Reviews</i>, not the day note). So for this pattern to work, ability to <a href="https://github.com/TriliumNext/Notes/wiki/Cloning-notes">clone</a> notes into multiple places is pretty fundamental.</p><h3>Projects</h3><p><i>Project</i> is pretty self-explanatory, for me specifically it also means being long term (years) - an example of a project might be Trilium Notes or university studies. Given their longevity, projects can be large and deep, but their structure is very domain specific, and I don't see any common patterns. What's pretty clear is they are often widely interconnected with other parts of the knowledge base - e.g. university credentials are cloned from "Credentials / University" top level notes and Trilium related blog posts are in "Blog / [Name of the blog] / Trilium".</p><p><i>Epics</i> are the same thing as projects, but differ in scope - they are typically several months long and as such are usually placed into a year note (e.g. <i>2018 / Epics</i>). Epics are often of work nature (also cloned into work note) and personal (e.g. currently I have large epic for moving to a different city).</p><p>I don't have a term for short term projects (typically several days long), but continuing the scrum analogy I might call them <i>story</i>. These are often placed directly into day notes and manually moved from one day to another (or place into a month note, e.g. <i>2018 / 11 - November</i>).</p><h3>Credentials</h3><p>I keep all my credentials in the knowledge base, they are sorted into categories - work related, project related, personal per country etc. These notes are of course <a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected</a> and are often cloned into other places (e.g. project credentials are cloned into the project itself). This is a pretty important advantage compared to traditional tools like KeePass - all the relevant information is centralized into one place without compromising security.</p><h3>People profiles</h3><p>This might seem creepy to some, but I keep a profile on most people. It contains pretty standard things like date of birth, contacts, address, but also current and previous employments, their hobbies and worldviews and sometimes even important (IM/mail/meatspace) conversations. Just about everything I find notable. It helps to refresh some basic info before meeting people, especially if you haven't been in touch in a while. It gets pretty awkward to ask for the tenth time where do they work for example, because you keep forgetting it.</p><p>Naturally I have a lot of (extended) family members, friends, acquaintances etc. so I need some way to sort them. My main method is to sort them by social circle (work, high school, sports club etc.), sometimes also by their town of residence. Family <i>circle</i> is still too large so the further organization is by <i>clan</i> (as in "Smiths"). Some people are members of several such circles, so they are just cloned into multiple places.</p><p>For family specifically it's pretty useful to create <a href="https://github.com/TriliumNext/Notes/wiki/Relation-map">relation map</a> to visualize relationships:</p><p><img src="api/images/xeZPrfi77XPu/relation-map-family.png" alt=""></p><h3>Books</h3><p>Of course, I keep standard "To read" list. I also keep a record on the books I've read - typically one book has one subtree where the root has some basic info like author, page count, publication date, date started, date finished (in the form of <a href="https://github.com/TriliumNext/Notes/wiki/Promoted-attributes">promoted labels</a>). I also write a (private) review and keep list of highlights from Kindle, optionally with some commentary, these are usually stored in sub notes (unless they are pretty short).</p><p>To keep the list of books manageable, I sort them per year (of reading them), this also gives me some basic overview of "reading performance" for given year. I plan to create a <a href="https://github.com/TriliumNext/Notes/wiki/Scripts">script</a> which would show some timeline chart visualizing book attributes <code>dateStarted</code> - <code>dateFinished</code> to have nicer view of my reading sprints and trends.</p><p>Some specific authors also have their own note which contains cloned book reviews, links to interviews and other related resources.</p><p>I have similar system for movies and TV shows, but not as sophisticated.</p><h3>Personal diary</h3><p>This is a place to reflect on events, experiences, new findings etc. This can help you get deeper understanding of your inner self, clarify your thinking and make better decisions as a result.</p><p>I sort personal diary notes directly under <i>day note</i> (explained above), but it can be cloned also to e.g. "trip note" (if the diary note is about given trip) or to person's profile (if the person plays a role in the diary note). All my diary notes are <a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected</a> since they are usually pretty sensitive.</p><h3>Documents</h3><p>I keep all my personal documents (ID, passport, education certificates ...) scanned in the knowledge base. They are <a href="https://github.com/TriliumNext/Notes/wiki/Synchronization">synchronized</a> across every PC which provides decent backup and makes them available everywhere.</p><p>Advantage compared to e.g. keeping them in Dropbox or Google Drive is that they are not stored on some 3rd party server and they can be encrypted (<a href="https://github.com/TriliumNext/Notes/wiki/Protected-notes">protected</a>).</p><h3>Inventory</h3><p>Inventory contains documents and other relevant importation for my important belongings - e.g. for car you can keep the registration card, maintenance record, related costs etc. I also keep inventory for some items personally important to me - mainly computers, phones, cameras and similar electronics. This can be practical at times but also provides sentimental value.</p><h3>Topic knowledge base</h3><p>This where I store hard "knowledge" - summarized topics and findings from different domains. Topics can range from traditional sciences - physics, history, economy to philosophy, mental models, apps (notes about specific apps I use) etc. Of course this is very subjective - given what I do, my Physics sub-tree is pretty sparse compared to my Programming subtree.</p><h3>Work knowledge base</h3><p>I usually keep top level note for the company I currently work at (past jobs are moved elsewhere). I track basic organization of the company (divisions, business units), who is who (<a href="https://github.com/TriliumNext/Notes/wiki/Relation-map">relation maps</a>) are again useful for visualization), projects I work at etc.</p><p>There's a number of credentials to various company services I need to use. Companies usually have a bunch of complex processes and tools. I record meeting minutes, link to the company wiki (which is usually difficult to find relevant info). In general there's a lot of company specific information I need to know or need have them at hand in a nice structure I can understand. Often it's just copy pasting and reshuffling of existing information into something more understandable for me.</p><p>From my experience, keeping this makes me more productive and even more importantly dramatically reduces frustration and stress.</p><h2>Conclusion</h2><p>I could probably go on with more patterns (e.g. study notes, travelling), but I think you get the idea. Whatever is important in your life, it probably makes sense to document and track it.</p>


blobId: RSXhh32p6IJxkG5yuHVL
dateModified: 2025-03-09 11:13:37.500+0200
utcDateModified: 2025-03-09 09:13:37.500Z
content:
  <h3>Trilium Notes</h3><p>Trilium Notes does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary.</p><p>Automatic network activity consists of:</p><ul><li>Trilium periodically queries URL <a href="https://github.com/TriliumNext/Notes/releases">https://github.com/TriliumNext/Notes/releases</a> to see if there's a new stable version released. (check only, there's no automatic download and/or installation).</li><li>Trilium will download spelling dictionaries automatically as needed based on language settings</li></ul><h3>Trilium Web Clipper</h3><p>Trilium Web Clipper does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary.</p><h3>Trilium Sender for Android</h3><p>Trilium Sender for Android does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary.</p>


blobId: EsABT2vYdt3ibSzKfhxr
dateModified: 2025-03-09 11:14:19.537+0200
utcDateModified: 2025-03-09 09:14:19.537Z
content:
  <p>Sometimes the fastest way to assess the software is just through screenshots so here they are:</p><p><img src="api/images/V01a3OdC9O06/screenshot.png" alt=""></p><p><img src="api/images/zaQnUsJTbvjr/dark-theme.png" alt=""></p><p>See <a href="#root/Wy267RK4M69c">Themes</a>.</p><p><img src="api/images/8jgXl1RUGL4H/code-note.png" alt=""></p><p>This shows <a href="#root/6f9hih2hXXZk">code note</a> editor.</p><p><img src="api/images/umjOUcnZi4z2/promoted-attributes-queen.png" alt=""></p><p>See <a href="#root/OFXdgB2nNk1F">promoted attributes</a></p><p><img src="api/images/xeZPrfi77XPu/relation-map-family.png" alt=""></p><p>See <a href="#root/iRwzGnHPzonm">relation map</a>.</p><p><img src="api/images/5nE2aM3crNI6/link-map.png" alt=""></p><p>See <a href="#root/Hdf1kG6Kvcl1">link map</a>.</p><p><img src="api/images/nQf1irAyZrZl/day-notes.png" alt=""></p><p>See <a href="#root/l0tKav7yLHGF">Day notes</a>.</p><p><img src="api/images/PFrpANAUte0M/weight-tracker.png" alt=""></p><p>See <a href="#root/R7abl2fc6Mxi">Weight tracker</a>.</p><p><img src="api/images/92KeXdKh3Ca1/task-manager.png" alt=""></p><p>See <a href="#root/xYjQUYhpbUEW">Task manager</a>.</p><p><img src="api/images/MA2uvkVloWXl/note-revisions.png" alt=""></p><p>See <a href="#root/vZWERwf8U3nx">Note revisions</a>.</p><p><img src="api/images/TFAiJIXJFfqv/mobile-smartphone.png" alt=""></p><p><img src="api/images/fi37V32TNyzm/mobile-tablet.png" alt=""></p><p>See <a href="#root/RDslemsQ6gCp">Mobile frontend</a>.</p>


blobId: acCgng9cod2YaF85DNQD
dateModified: 2025-03-09 11:18:41.218+0200
utcDateModified: 2025-03-09 09:18:41.219Z
content:
  <ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Integrate titles of the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Set <code>#shareAlias</code> for all the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Recreate structure of notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Add icons to the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Merge images into their corresponding notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Review and delete each note from Pikapod</span></label></li></ul><hr><p>Broken images:</p><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/fKYGY3OOo5d1">Canvas Note</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/l0tKav7yLHGF">Day notes</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/aCE9SFyzUrod">Home</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/VbjZvtUek0Ln">Theme Gallery</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/9sRHySam5fXb">Workspace</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/iRwzGnHPzonm">Relation map</a></span></label></li></ul><p>Content changes:</p><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/poXkQfguuA0U">Desktop Installation Guide</a></span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Mention Windows installation.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate Fedora documentation</span></label></li></ul></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/Hdf1kG6Kvcl1">Link map</a>&nbsp;– it's empty</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/QEAPj01N5f7w">Links</a>&nbsp;- extremely old GIFs.</span></label></li></ul>


blobId: 8XX6RBnLTPJS3rTez2b2
dateModified: 2025-03-09 11:51:14.819+0200
utcDateModified: 2025-03-09 09:51:14.819Z
content:
  <ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Integrate titles of the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Set <code>#shareAlias</code> for all the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Recreate structure of notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Add icons to the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Merge images into their corresponding notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Review and delete each note from Pikapod</span></label></li></ul><h2>Broken images</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/fKYGY3OOo5d1">Canvas Note</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/l0tKav7yLHGF">Day Notes</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/aCE9SFyzUrod">Home</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/VbjZvtUek0Ln">Theme Gallery</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/9sRHySam5fXb">Workspace</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/iRwzGnHPzonm">Relation Map</a></span></label></li></ul><h2>Content changes</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/poXkQfguuA0U">Desktop Installation</a></span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Mention Windows installation.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate Fedora documentation</span></label></li></ul></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/Hdf1kG6Kvcl1">Link map</a>&nbsp;– it's empty</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/QEAPj01N5f7w">Links</a>&nbsp;- extremely old GIFs.</span></label></li></ul>


blobId: lmGDZeIhgfwXakcqUuXT
dateModified: 2025-03-09 12:02:17.628+0200
utcDateModified: 2025-03-09 10:02:17.664Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>Scripts</h2>

              <ul>
                <li>If you have backend scripts that depend on <code>require</code> (for example
                  the “agenda” plugin), then these plugins will need to be migrated to the
                  new module system that TriliumNext uses.
                  <ul>
                    <li>Either check if the plugin has support for TriliumNext or disable it.</li>
                    <li>For developers, see <a class="reference-link" href="#root/3eTu21fjtZkj/AHW3CNPwKbGf">Server-side imports</a> on
                      how to make the necessary changes.</li>
                  </ul>
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: cCSmkrjO86XEzIbKhRcX
dateModified: 2025-03-09 12:07:34.593+0200
utcDateModified: 2025-03-09 10:07:34.593Z
content:
  <p>This section represents the technical documentation of the project, which should help understanding how it works under the hood and how to contribute.</p><blockquote><p>For more general information about how the application works from a user-facing point of view, please refer to&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG">User Guide</a>.</p></blockquote>


blobId: 9T49RbjfCSp8vjjtc3l8
dateModified: 2025-03-09 12:09:40.140+0200
utcDateModified: 2025-03-09 10:09:40.140Z
content:
  <ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Integrate titles of the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Set <code>#shareAlias</code> for all the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Recreate structure of notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Add icons to the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Merge images into their corresponding notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Review and delete each note from Pikapod</span></label></li></ul><h2>Content changes</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/poXkQfguuA0U">Desktop Installation</a></span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Mention Windows installation.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate Fedora documentation</span></label></li></ul></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/Hdf1kG6Kvcl1">Link map</a>&nbsp;– it's empty</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/QEAPj01N5f7w">Links</a>&nbsp;- extremely old GIFs.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Broken images</span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/fKYGY3OOo5d1">Canvas Note</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/l0tKav7yLHGF">Day Notes</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/aCE9SFyzUrod">Home</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/VbjZvtUek0Ln">Theme Gallery</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/9sRHySam5fXb">Workspace</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/iRwzGnHPzonm">Relation Map</a></span></label></li></ul></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Check for <code>%%{WARNING}%%.</code>.</span></label></li></ul><h2>Generic improvements</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Add some promoted attributes for when the page was last reviewed.</span></label></li></ul><h2>Development improvements</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate <a href="https://trilium.rocks/xecUJ8eL3pvM">Trilium Rocks theme</a>.</span></label></li></ul>


blobId: 1e7kIZuaN18D8s2ga2dv
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.411Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>💡 Key highlights</h2>
              <ul>
                <li>…</li>
              </ul>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li>Login screen not rendering correctly under dark mode.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1218">Some valid javascript syntax are highlighted as error</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1308">Clarify misleading message about deleting revisions</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/357">Note creation issues with certain template types</a>
                </li>
              </ul>
              <h2>✨ Improvements</h2>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1361">Allow light and dark theme as base theme</a>
                </li>
              </ul>
              <h2>🌍 Internationalization</h2>
              <ul>
                <li>…</li>
              </ul>
              <h2>🛠️ Technical updates</h2>
              <ul>
                <li>Updated test dependencies</li>
                <li>build: improvements for TS &amp; Webpack &amp; Docker by @pano9000 </li>
              </ul>
              <p> </p>
            </div>
          </div>
        </div>
      </div>


blobId: XvJsbILFc0KleKYaUHqB
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.415Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>💡 Key highlights</h2>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1267">Signed binaries for macOS (thanks to @perfectra1n for the implementation).</a>
                </li>
                <li>Basic support for right-to-left content has been added. See in-app help
                  (F1) for more information.</li>
              </ul>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/943">Errors occurred when importing some .enex files</a>
                </li>
                <li>Error log about sending headers twice when accessing a password-protected
                  share.</li>
                <li>Migrations since Trilium 0.60.4 are now working, no more need to update
                  to the latest zadam's Trilium version before migrating to TriliumNext.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1321">Custom widget position doesn't work</a>
                </li>
                <li>Canvas: Unable to copy-paste elements on the canvas.</li>
                <li>Couldn't add external link from add link dialog by @JYC333 </li>
              </ul>
              <h2>✨ Improvements</h2>
              <ul>
                <li>A task list/to-do list system is on the works.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1258/files">Small improvements to Zen Mode</a> by
                  @pano9000 </li>
                <li>Calendar View:
                  <ul>
                    <li>Display promoted attributes (initial implementation by @rom1dep) </li>
                    <li>Customisable start and end attributes.</li>
                  </ul>
                </li>
                <li>Search now focuses automatically on search string</li>
                <li>Video file preview:
                  <ul>
                    <li>Display in full-width by default (similar to PDFs)</li>
                    <li>Match screen size while maintaining aspect ratio (remove the scroll).</li>
                    <li>Improve display in note list.</li>
                  </ul>
                </li>
                <li>Settings: improve ETAPI options page description by @pano9000 </li>
                <li>Small improvements for printing:
                  <ul>
                    <li>Code blocks are now displayed with word wrapping.</li>
                    <li>Language tag is hidden if it's “auto-detected”.</li>
                  </ul>
                </li>
                <li>Minor improvements to the in-app help (updated documentation, removed
                  suffix from title, image fit).</li>
              </ul>
              <h2>🌍 Internationalization</h2>
              <ul>
                <li>French translation improvements by @Potjoe-97 </li>
                <li>Romanian translation improvements</li>
                <li>Chinese translation improvements by @clsty  </li>
                <li>Spanish translation improvements by @hasecilu </li>
              </ul>
              <h2>🛠️ Technical updates</h2>
              <ul>
                <li>bundle bootstrap with webpack by @pano9000 </li>
                <li>remove unneeded extra arm64 handling by @pano9000 </li>
                <li>update dependency prettier to v3.5.3</li>
                <li>update dependency sass to v1.85.1</li>
                <li>update dependency typedoc to v0.27.9</li>
                <li>update vitest monorepo to v3.0.7</li>
                <li>update dependency chardet to v2.1.0</li>
                <li>update dependency mind-elixir to v4.4.1</li>
                <li>update dependency axios to v1.8.1</li>
                <li>update dependency electron to v34.3.0</li>
                <li>update dependency force-graph to v1.49.3</li>
                <li>update dependency typescript to v5.8.2</li>
                <li>update dependency axios to v1.8.2 [security]</li>
                <li>Various TypeScript ports by @pano9000 and @JYC333 </li>
                <li>package.json maintenance by @pano9000 </li>
                <li>let webpack handle dayjs, split.js and i18next by @pano9000 </li>
                <li>fix prettier code style issues by @pano9000 </li>
                <li>add eslint as linter by @pano9000 </li>
                <li>stop copying dump-db during build by @pano9000 </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: TCfsTs74hXyV5E3cuPcz
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.417Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li>Missing Windows ZIP artifact by @pano9000 </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: Cmn4Ye3GgbyScH4y88B6
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.421Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>💡 Key highlights</h2>
              <ul>
                <li>There are now stricter rules when it comes to importing HTML, where we
                  only allow very few styles (colors, borders, etc.). Should you encounter
                  any issues when importing, try disabling “Safe import” and report any issues
                  you might have.</li>
              </ul>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li>Geomap: Viewport and zoom not restored properly when switching between
                  two geomaps.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/931">Imported Evernote Enex file overlaps Trilium UI</a>
                </li>
              </ul>
              <h2>✨ Improvements</h2>
              <ul>
                <li>Web view now renders in browser using an <code>&lt;iframe&gt;</code>. It
                  might have a few quirks but it seems to work in basic usecases.</li>
                <li>When rendering a File note that contains text, display only a fragment
                  of the text in order to improve UI responsiveness.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1236">Treat .mdx files as markdown</a>
                </li>
                <li>Calendar view
                  <ul>
                    <li>Customizable calendar entries by @rom1dep </li>
                    <li>Calendar is now displayed in full height.</li>
                    <li>Option to hide the weekends.</li>
                    <li>Icons are now displayed next to events, if one is set.</li>
                    <li>The calendar is now recursive, as such it will look for calendar notes
                      in the children of its child notes and so on.</li>
                    <li>Basic integration with day notes, if calendar view is set to a <code>#calendarRoot</code> it
                      will now render all the day notes and its children (1-level nesting). See
                      help for more info.</li>
                  </ul>
                </li>
                <li>Support for importing UTF-16 LE (such as mails saved as HTML from Outlook)
                  content.</li>
                <li>Settings
                  <ul>
                    <li>Friendly numbers protected session timeout by @pano9000 </li>
                    <li>Friendly numbers note revision by @pano9000 </li>
                  </ul>
                </li>
                <li>Share: <a href="https://github.com/TriliumNext/Notes/pull/1207">Allow redirecting / to <code>#shareRoot</code> if not authenticated</a> by
                  @maphew </li>
                <li>In-app-help:
                  <ul>
                    <li>Remove any help notes that are no longer in use.</li>
                    <li>Restore the icon of help notes.</li>
                  </ul>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1251">Markdown headings are now exported using ATX syntax (<code>#</code>) instead of the setext (<code>------</code>)</a>
                </li>
                <li>Add TypeScript note type by default by @pano9000 </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1229">Geotag: Colorable markers</a> by
                  @McSido </li>
              </ul>
              <h2>🌍 Internationalization</h2>
              <ul>
                <li>German language improvements by @greg1904 </li>
              </ul>
              <h2>🛠️ Technical updates</h2>
              <ul>
                <li>add time selector option widget by @pano9000 </li>
                <li>update dependency ws to v8.18.1</li>
                <li>update dependency typedoc to v0.27.8</li>
                <li>update electron-forge monorepo to v7.7.0</li>
                <li>update vitest monorepo to v3.0.6</li>
                <li>update dependency tsx to v4.19.3</li>
                <li>update TypeScript type definitions</li>
                <li>time selector add support for handling min required input by @pano9000 </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: gxYTO8fXtD3cGPtOONBv
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.427Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>💡 Key highlights</h2>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1091">Trilium can now export notes as PDF directly, on the desktop version.</a>
                </li>
                <li>RPM packages for Linux by @pano9000 </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1130">Flatpak packages for Linux</a> (not
                  yet published to FlatHub) by @pano9000 </li>
                <li>There is now an in-app help that is still work in progress, but it can
                  be triggered by pressing F1. On some note types (e.g. geo map) there is
                  a contextual help button.</li>
                <li>Zen Mode (minimal UI). See in-app help for more details.</li>
              </ul>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li><a href="https://github.com/zadam/trilium/issues/4696">js error Parsing error: The keyword 'const' is reserved</a> by
                  @lly-c232733 </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/973">Full Text Search button in quick launch search bar does not work</a> by
                  @SiriusXT </li>
                <li>An obscure bug when expanding a note with custom sort where some of the
                  notes did not have the attribute would cause notes to jump around.</li>
                <li><a href="https://github.com/zadam/trilium/issues/4892">Weight Tracker doesn't work on new install</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/117">Markdown export: Fix strikethrough</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1142">TypeScript code files are detected as video/mp2t</a> files
                  by @pano9000 </li>
                <li>disallow text selection in dropdown-menus by @pano9000</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1078">Password window remains after opening encrypted notes</a> by
                  @dousha</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1164">Error when using code blocks in Markdown code notes</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1177">Numbered bullet is different in Note Revision view</a>
                </li>
                <li>Missing <code>etapi.openapi.yaml</code>.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1100">Pressing Enter to "Add link" does not work anymore</a> (thanks
                  to @St0rml)</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/518">Cannot cancel sharing the root note or the root of a workspace when it's hoisted</a> by
                  @dousha </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1209">Enabling "Enable background effects" does not properly work with dark themes</a>
                </li>
              </ul>
              <h2>✨ Improvements</h2>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1074">Better styling for various widgets (buttons, input boxes) on the TriliumNext theme</a> &amp;
                  various TriliumNext theme improvements by @adoriandoran </li>
                <li>System tray icon improvements: translations, new buttons ("New note",
                  “Open today's journal note”, “Bookmarks” and “Recent Notes”), and icons.</li>
                <li>Custom Windows installer icon by @Sarah-Hussein </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1095">Geo map: it's now possible to add .gpx notes as children for the map. Look for the help button in the geo map for more information.</a>
                </li>
                <li>Geo map: Enable Retina detection for sharper tiles on supported devices.</li>
                <li>Electron: Add "Office" as category for Desktop file by @pano9000 </li>
                <li>Improvements to the note tooltip, including <a href="https://github.com/TriliumNext/Notes/issues/1063">making the note title clickable</a>.</li>
                <li>Render PDFs in full width by default.</li>
                <li>allow setting custom cookiePath by @pano9000 </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1144">Swagger UI endpoint</a> by
                  @perfectra1n </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1160">Add support for `mid:` URI</a>
                </li>
                <li>Raw files can now be served in shared tree by changing the URL instead
                  of setting an attribute to the note. See documentation on Shared Notes
                  in the in-app help (press F1).</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1156">allow setting custom session cookie expiration</a> by
                  @pano9000 </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/1163">friendly number handling for note erasure timeouts</a> by
                  @pano9000 </li>
              </ul>
              <h2>Mobile improvements</h2>
              <ul>
                <li>Configure launch bar now has an always visible tree instead of the sidebar.
                  It's far from perfect, but it should be more usable than the previous implementation.</li>
                <li>The note title is now smaller.</li>
                <li>Added back a few launcher bar items:
                  <ul>
                    <li>New Note</li>
                    <li>Calendar</li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/1105">Open Today's Journal Note</a>
                    </li>
                  </ul>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1161">Recent changes are now available as well as a launch bar item</a>.</li>
                <li>Fixed switching and dragging tabs not working.</li>
              </ul>
              <h2>🌍 Internationalization</h2>
              <ul>
                <li>Spanish improvements by @hasecilu </li>
              </ul>
              <h2>🛠️ Technical improvements</h2>
              <ul>
                <li>Remove dependency on <code>semver</code>.</li>
                <li>Update test dependencies.</li>
                <li>make desktop.ejs easier to read by @pano9000 </li>
                <li>server/utils: add tests and smaller refactors / fixes by @pano9000 </li>
                <li>refactor: electron forge config by @pano9000 </li>
                <li>improve server build release file names by @pano9000 </li>
                <li>Improved the development experience by setting up caches (server &amp;
                  Electron) &amp; auto-reload for Electron</li>
                <li>protected_session: input improvements by @pano9000 </li>
                <li>remove unused jasmine by @pano9000 </li>
                <li>update dependency electron to v34.2.0</li>
                <li>update dependency prettier to v3.5.1</li>
                <li>update dependency mind-elixir to v4.3.7</li>
                <li>update dependency marked to v15.0.7</li>
                <li>update dependency typedoc to v0.27.7</li>
                <li>update dependency compression to v1.8.0</li>
                <li>update dependency webpack to v5.98.0</li>
                <li>update node.js to v22.14.0</li>
                <li>simplify login function and get rid of deprecated usage of expires by
                  @pano9000 </li>
                <li>Automated OpenAPI spec generation by @FliegendeWurst </li>
                <li>remove leftover @types/jasmine by @pano9000 </li>
                <li>fix and enable ex-flaky tests in services/search.spec.ts by @pano9000 </li>
                <li>npm scripts namespacing by @pano9000 </li>
                <li>"unpack" log messages before printing by @pano9000 </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: GPRUrhKmUyOJbK0hNNIk
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.430Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>💡 Key highlights</h2>
              <ul>
                <li>…</li>
              </ul>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li>….</li>
              </ul>
              <h2>✨ Improvements</h2>
              <ul>
                <li>…</li>
              </ul>
              <h2>🌍 Internationalization</h2>
              <ul>
                <li>…</li>
              </ul>
              <h2>🛠️ Technical updates</h2>
              <ul>
                <li>…</li>
              </ul>
              <p> </p>
            </div>
          </div>
        </div>
      </div>


blobId: ofUEHF2J0R2vuJnBmZiu
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.432Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1107">Full text search not working if there are empty mindmaps</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1087">Shortcut for Clipboard Pasting not working on Mac</a>
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: Ixon6LJP2Xmo56ZfVmwP
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.446Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>💡 Key highlights</h2>
              <ul>
                <li>We now provide binaries to run the server on Linux on ARM without Docker
                  (e.g. on a Raspberry Pi, thanks to @perfectra1n ).</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/1017">Introducing a map note type</a>
                  </p>
                </li>
                <li>
                  <p>Add ability to set Trilium configuration variables via ENV variables by
                    @pano9000 and @perfectra1n </p>
                </li>
                <li>Quite a few mobile improvements have been done (<strong>kindly waiting for bug reports</strong>)
                  <ul>
                    <li>On mobile the horizontal layout (with the launcher bar displayed at the
                      top of the screen instead of on the left side) is now enforced.
                      <ul>
                        <li>This allows for more real estate for the content of the note and simplifies
                          the mobile layout.</li>
                      </ul>
                    </li>
                    <li>The launch bar has also been moved at the bottom, to be inline with modern
                      application layouts.</li>
                    <li>Restructured the tree as a sidebar which is triggered via a button on
                      the left side of the title bar.</li>
                    <li>The sidebar can also be triggered by swiping to the right on the left
                      side of the screen. <i>Still some quirks to address on both iOS and Android due to their weird back button gesture</i>.</li>
                    <li>Improved the positioning of the bottom bar and of the editor toolbar.</li>
                    <li>Tabs have been enabled. Currently we are using the same implementation
                      as on desktop, which might have a few quirks on mobile.</li>
                    <li>Jump to note is now available.</li>
                    <li>The mobile view now has its own launch bar configuration with its own
                      launch bar buttons. For now only a few have been enabled. <strong>Feel free to request any button from the desktop should you require it.</strong>
                    </li>
                    <li>Now it's possible to insert footnotes in CKEditor, thanks to a fork of
                      <a href="https://github.com/ThomasAitken/ckeditor5-footnotes">ThomasAitken/ckeditor5-footnotes</a>.</li>
                    <li>It's also possible to create inline Mermaid diagrams into text notes.</li>
                  </ul>
                </li>
                <li>The launcher bar can now be placed at the top instead of the left of the
                  screen, with a full-width tab bar. See <a href="https://github.com/TriliumNext/Notes/pull/654">#654</a> for
                  more information.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/661">A new theme is introduced called “TriliumNext"</a> by
                  @adoriandoran and @eliandoran. Settings on this theme are now displayed
                  in a card layout. Redesigned tree action buttons.</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/702">Native title bar buttons</a> when
                    native title bar is off for Windows and macOS.</p>
                </li>
                <li>
                  <p>On Windows, on the TriliumNext theme there are window transparency effects
                    if running under Windows, see <a href="https://github.com/TriliumNext/Notes/pull/717">Mica (Windows transparency effects)</a> for
                    screenshots. Unfortunately, it is plagued by a few bugs with Electron (the
                    library we are using for the desktop application), see the link for more
                    information.</p>
                </li>
                <li>
                  <p>Updated Docker builds to Node 22.<strong> Be on the lookout for any potential issues, especially for less-tested platforms such as ARM.</strong>
                  </p>
                </li>
              </ul>
              <h2>New in this release (v0.91.5)</h2>
              <h3>🐞 Bugfixes</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1003">Import Dialog "Safe Import" Tooltip is cut off</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1058">Backend Log is not showing on mobile view</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/94">initial server setup form cannot be sent with enter key</a> by
                  @pano9000 </li>
              </ul>
              <h3>✨ Improvements</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/905">Preserve highlighted text's background color when printing</a>
                </li>
              </ul>
              <h3>🌍 Internationalization</h3>
              <ul>
                <li>…</li>
              </ul>
              <h3>🛠️ Technical updates</h3>
              <ul>
                <li>update dependency @types/node to v22.12.0</li>
                <li>Use new type field for GitHub issues by @pano9000 </li>
                <li>chore(client/ts): port setup entrypoint by @pano9000 </li>
                <li>refactor(server/utils): turn isMac/isWin/isElectron/isDev into boolean
                  by @pano9000 </li>
                <li>chore(issue_templates): add simple Task template by @pano9000 </li>
              </ul>
              <h2>From v0.91.4-beta</h2>
              <h3>🐞 Bugfixes</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/963">Share: Fix going from child note to parent share root</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/976">Context Menu Keyboard Commands wrap to next line</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/685">Keyboard shortcuts in tree context menu are not in line with menu item</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/967">Canvas/Excalidraw note slows down considerably with many images</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/969">tab context menu on mobile is not accessible</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/988">Code Notes Settings: the "Available MIME Type" list gets corrupted</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/990">Tree Panel: the preferred width resets under certain conditions</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/986">Mind map: the branching side preference is not persisted</a>
                </li>
                <li>HTML Import Strips away "valid" h1 tags by @pano9000 </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/1029">share.js broken on share pages</a> by
                  @pano9000 </li>
              </ul>
              <h3>✨ Improvements</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/974">Add space between "delete all revisions" and ? buttons on Note revision dialog</a>
                </li>
                <li>Improved launch bar on mobile: context menu to move between available
                  and visible, or reset the configuration.</li>
                <li>Enable fixed editing toolbar by default for new users.</li>
              </ul>
              <h3>🌍 Internationalization</h3>
              <ul>
                <li>Translated some missing messages in Romanian.</li>
              </ul>
              <h3>⬆️ Technical improvements</h3>
              <ul>
                <li><strong>Reached zero vulnerabilities in dependencies according to </strong><code><strong>npm audit</strong></code>
                </li>
                <li>Update Electron to 34</li>
                <li>update dependency fs-extra to v11.3.0</li>
                <li>update dependency force-graph to v1.49.0</li>
                <li>update dependency katex to v0.16.21</li>
                <li>update dependency better-sqlite3 to v11.8.1</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/961">set more secure csrf related settings</a> by
                  @pano9000 </li>
                <li>get rid of ts-node by @pano9000</li>
                <li>Fix default ivLength in dump-db tool by @Nriver </li>
                <li>add vitest as test framework and port current tests (&amp; various test
                  improvements) by @pano9000 </li>
                <li>get rid of Webpack Critical dependency warning by @pano9000 </li>
                <li>fix flaky getPlatformAppDataDir test on Windows by @pano9000</li>
                <li>refactor and add tests for `services/import/mime` by @pano9000  </li>
                <li>refactor: compress images by @j9t </li>
                <li>Bump Electron to v34.0.1</li>
                <li>Bump i18next-http-backend to v3.0.2</li>
                <li>Bump i18next to v24.2.2</li>
                <li>Bump electron-forge monorepo to v7.6.1</li>
                <li>Bump @mind-elixir/node-menu to v1.0.4 </li>
                <li>Docker: update node.js to v22.13.1</li>
                <li>webpack: add Configuration type</li>
                <li>webpack: add missing share.js entry point</li>
                <li>npm audit fix by @pano9000 </li>
                <li>port desktop and mobile entrypoints by @pano9000 </li>
              </ul>
              <h2>From v0.91.3-beta</h2>
              <h3>🐞 Bugfixes</h3>
              <ul>
                <li>Prevent HTML from rendering in launcher bar.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/783">Calendar overflows off right of view when in mobile view</a>
                </li>
                <li>Note tree context menu not shown on long press on iOS.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/785">Advanced tree menu is only accessible in the mobile view via long-press</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/881">NotFoundError after trying to paste filepath into note, restart required</a>
                </li>
                <li>login: fix "flash of unstyled content" by @pano9000</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/920">Limit search function doesn't work</a>
                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/908">fix ck-editor checkboxes not showing checkmark while printing</a> by
                    @pano9000</p>
                </li>
              </ul>
              <h3>✨ Improvements</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/830">Syntax Highlighting for Batch scripts</a>
                </li>
                <li>Mobile improvements
                  <ul>
                    <li>Translucent top bar mobile layout on iOS</li>
                    <li>Display formatting toolbar above keyboard.</li>
                  </ul>
                </li>
                <li>Fonts
                  <ul>
                    <li>Grouped the font selection by font type (sans-serif, monospace, etc.).</li>
                    <li>Added an option to use the system font (e.g. “Segoe UI” for Windows).</li>
                  </ul>
                </li>
                <li>Display the content of JSON attachments and improve the style of attachment
                  code blocks.</li>
                <li>Translucent top bar on desktop layout for iPad</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/666">'Show Help' and 'About Trillium Notes' menu options are now available in the mobile view</a>
                </li>
                <li>Back/forward buttons have been enabled for web builds as well, mostly
                  for mobile view.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/891">support for RFC 5870 geo-URIs</a> by
                  @0Raptor</li>
                <li>login: add Trilium icon and improve style by @pano9000</li>
                <li>allow disabling mention autocomplete by pressing escape (forward port
                  of @zadam’s work)</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/903">Restyle the help dialog</a> by
                    @adoriandoran</p>
                </li>
                <li>
                  <p>Added back ESLint support for backend notes</p>
                </li>
                <li>
                  <p>Exporting JavaScript code blocks in text notes to Markdown now sets the
                    right language tag.</p>
                </li>
              </ul>
              <h3>🌍 Internationalization</h3>
              <ul>
                <li>Spanish translation improvements by @hasecilu</li>
                <li>Chinese translation improvements by @Nriver</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/857">make &lt;kbd&gt; tags translatable</a> by
                  @pano9000</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/859">make duplicate notes suffix translatable</a> by
                  @pano9000</li>
                <li>improve translatability of database_backed_up_to string by @pano9000</li>
                <li>translate some buttons in the note tree</li>
                <li>translate a few note map buttons</li>
              </ul>
              <h3>⬆️ Technical Improvements</h3>
              <ul>
                <li>Library updates
                  <ul>
                    <li>force-graph to v1.47.2</li>
                    <li>@highlightjs/cdn-assets to v11.11.1</li>
                    <li>typedoc to v0.27.6</li>
                    <li>jquery.fancytree to v2.38.4</li>
                    <li>
                      <p>katex to v0.16.19</p>
                    </li>
                    <li>
                      <p>@types/node to v22.10.5</p>
                    </li>
                    <li>marked to v15.0.5</li>
                    <li>mind-elixir to v4.3.6</li>
                    <li>better-sqlite3 to v11.8.0</li>
                    <li>CKEditor to 41.3.2</li>
                    <li>jsdom to v26</li>
                    <li>i18next to v24.2.1</li>
                    <li>
                      <p>draggabilly to v3.0.0</p>
                    </li>
                    <li>
                      <p>electron to 33.3.1.</p>
                    </li>
                    <li>
                      <p>Node.js for Docker containers: v22.13.0</p>
                    </li>
                    <li>
                      <p>ts-loader: v9.5.2</p>
                    </li>
                  </ul>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/866">use existing randomSecureToken function</a> by
                    @pano9000</p>
                </li>
                <li>use named exports for the utils functions by @pano9000</li>
                <li>use Set instead of Arrays for faster lookups by @pano9000</li>
                <li>remove unused 'request' by @pano9000</li>
                <li>utils/formatDownloadTitle: simplify function by @pano9000</li>
                <li>
                  <p>remove unused tree-kill dependency by @pano9000</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/892">Add timezone and localtime mounts to docker-compose</a> by
                  @perfectra1n</li>
                <li>login: simplify JS by @pano9000</li>
                <li>set password: various smaller fixes by @pano9000</li>
                <li>use ejs partial for injecting window.glob by @pano9000</li>
                <li>add prettier as devDep and scripts by @pano9000</li>
                <li>add override for *.json tab width to match .editorconfig by @pano9000</li>
                <li>
                  <p>update deprecated electron packages by @pano9000</p>
                </li>
                <li>
                  <p>Add server logging for CKEditor state changes by @process</p>
                </li>
                <li>
                  <p>refactor(data_dir): simplify logic and make code robust and testable by
                    @pano9000</p>
                </li>
                <li>
                  <p>replace csurf with csrf-csrf by @pano9000</p>
                </li>
                <li>
                  <p>refactor(backend_log): improve getBackendLog by @pano9000</p>
                </li>
                <li>fix(views): replace deprecated meta tag by @pano9000</li>
              </ul>
              <h2>From v0.91.2-beta</h2>
              <h3>🐞 Bugfixes</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/812">Can not toggle notes by clicking on the note's icon in the navigation bar</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/798">Cannot arrow down to "full search" when no search results are returned in quick search</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/795">Toolbar tooltips no longer shown</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/570">Two help pages will be opened when the help button is clicked</a>
                </li>
              </ul>
              <h3>✨ Improvements</h3>
              <ul>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/799">fix typo Trillium</a> by
                    @pano9000</p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/787">Libraries in Excalidraw are broken</a> by
                    @CobriMediaJulien </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/800">Color scheme selection</a> by
                    @adoriandoran</p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/802">Style Next: Restyle the "Jump to Note" dialog</a> by
                    @adoriandoran</p>
                </li>
                <li>
                  <p>Exporting a Markdown file will now try to preserve syntax highlighting</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/779">Auto-show left panel when configuring launchbar</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/813">Accessibility: explicitly associate label and input elements</a> by
                  @pano9000 </li>
              </ul>
              <h3>🌍 Internationalization</h3>
              <ul>
                <li>Spanish improvements by @hasecilu</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/801">localize hardcoded English aria-labels</a> by
                    @pano9000</p>
                </li>
                <li>
                  <p>Translate new note title</p>
                </li>
              </ul>
              <h3>⬆️ Library updates</h3>
              <ul>
                <li>typedoc: v0.27.5</li>
                <li>highlightjs: v11.11.0</li>
                <li>marked: v15.0.4</li>
                <li>express-rate-limit to v7.5.0</li>
                <li>chokidar: 4.0.3</li>
                <li>katex: v0.16.18</li>
                <li>sanitize-html: v2.14.0</li>
                <li>webpack-cli: v5.1.4 → v6.0.1</li>
                <li>i18next: v24.2.0</li>
                <li>@braintree/sanitize-url: v7.1.1</li>
              </ul>
              <h2>From v0.91.1-beta</h2>
              <h3>🐞 Bugfixes</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/668">Syntax highlight in code blocks only in edit mode</a>
                </li>
                <li>To do lists not preserved on safe import.</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/757">File type video with emoji in name will break the preview</a>
                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/732">Attribute "jump to" for internal links not working anymore</a>
                  </p>
                </li>
              </ul>
              <h3>✨ Improvements</h3>
              <ul>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/653">Add label definition type for standalone time</a> by
                    @mm21</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/670">Remove resizer from backend log text area</a> by
                  @meichthys</li>
                <li>Use CodeMirror for backend log</li>
                <li>Support for ELK layout in Mermaid diagrams (sponsored by @perfectra1n).
                  See the relevant “ELK layout engine” in <a class="reference-link" href="#root/xKNWRXC24L5y/moBMU5tfa7Xx/Tshj61stDt8g/tPQgGfUs7ewD">[missing note]</a> for
                  more information.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/678">Make exact matches rise higher up in search</a> by
                  @perfectra1n</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/538">Change layout of promoted attributes</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/659">Add full text search in autocomplete</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/598">Importing single HTML file: prefer html title over filename</a> by
                  @maphew</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/692">Support page breaks for printing</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/601">user configurable list of allowed html tags in import</a> by
                  @maphew</li>
                <li>General HTML support; now the editor supports more HTML tags and displays
                  them appropriately.
                  <ul>
                    <li>Currently the import function is the only way to benefit from them, or
                      modifying the source code manually by changing the note type.</li>
                  </ul>
                </li>
                <li>Change default icons for “Go to Previous Note” and “Go to next note” launcher
                  buttons.</li>
                <li>Move toggle sidebar button near tab bar on horizontal layout.</li>
                <li>Mind map notes now are full-width by default (same as Canvas, for example).</li>
                <li>Tabs can now display the icon notes instead of only workspace icons (this
                  is the default behaviour of the TrilumNext theme, can be added to any other
                  theme via <code>--tab-note-icons: true;</code> to <code>:root</code>).</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/700">New Features for note map</a> by
                  @CobriMediaJulien</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/694">Add supported link protocols</a> by
                  @SiriusXT</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/723">add Mind Elixir plugin @mind-elixir/node-menu</a>
                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/741">Format dates and times</a> by
                    @adoriandoran</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/758">Expose cheerio in backend script api</a> by
                  @kleutzinger </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/759">Format note paths</a> by
                    @adoriandoran</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/767">add remark about UFW issues</a> by
                  @pano9000</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/739">Code Block language support for Terraform (HCL)</a>
                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/729">Display the fixed toolbar on multiple lines</a> (adjustable
                    in settings)</p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/713">Hide <code>internalLink</code> from <code>Jump To Note</code> dialog</a>
                  </p>
                </li>
              </ul>
              <h3>🌍 Internationalization</h3>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/673">Chinese translation improvements (&amp; some new messages translated)</a> by
                  @Nriver</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/677">Add translation for doc notes</a> by
                  @Nriver</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/695/files">Spanish improvements</a> by
                  @hasecilu</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/698">Traditional Chinese support</a> by
                  @dwong33</li>
                <li>Translate import toast messages.</li>
                <li>Translate hidden notes (including options).</li>
                <li>Romanian improvements.</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/740">Brazillian Portuguese</a> by
                    @Nertonm work in progress (only server translations for now)</p>
                </li>
                <li>
                  <p>Translate note autocomplete.</p>
                </li>
              </ul>
              <h3>⬆️ Library updates</h3>
              <ul>
                <li>i18next, i18next-http-backend, i18next-fs-backend</li>
                <li>force-graph v1.47.0</li>
                <li>express 4.2.12</li>
                <li>mermaid 11.4.1</li>
                <li>axios 1.7.9</li>
                <li>katex 0.16.14</li>
                <li>https-proxy-agent 7.0.6</li>
                <li>better-sqlite3 11.6.0</li>
                <li>electron 31.3.1 -&gt; 33.2.1</li>
                <li>jimp 0.22.12 -&gt; 1.6.0</li>
                <li>mind-elixir 4.3.3</li>
                <li>Development tools
                  <ul>
                    <li>electron-forge</li>
                    <li>Docker Node.js updated to v20.18.1</li>
                    <li>GitHub Actions workflow actions</li>
                    <li>webpack v5.97.1</li>
                    <li>TypeScript + types</li>
                    <li>yargs</li>
                    <li>helmet</li>
                    <li>marked 15.0.3</li>
                    <li>is-svg 5.1.0</li>
                    <li>image-type 5.2.0</li>
                    <li>eslint v9.16.0</li>
                    <li>jsdom v25.0.1</li>
                    <li>compression v1.7.5</li>
                  </ul>
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: ehSqSz5xzbqHnpFwx0vX
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.451Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>To do before release:</p>
          <ul class="todo-list">
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled" /><span class="todo-list__label__description">Ensure Excalidraw works on desktop build.</span>
              </label>
            </li>
          </ul>
          <h2>💡 Key highlights</h2>
          <ul>
            <li>We now provide binaries to run the server on Linux on ARM without Docker
              (e.g. on a Raspberry Pi, thanks to @perfectra1n ).</li>
            <li>
              <p><a href="https://github.com/TriliumNext/Notes/pull/1017">Introducing a map note type</a>
              </p>
            </li>
            <li>
              <p>Add ability to set Trilium configuration variables via ENV variables by
                @pano9000 and @perfectra1n </p>
            </li>
          </ul>
          <h2>🐞 Bugfixes</h2>
          <ul>
            <li><a href="https://github.com/TriliumNext/Notes/pull/963">Share: Fix going from child note to parent share root</a>
            </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/976">Context Menu Keyboard Commands wrap to next line</a>
            </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/685">Keyboard shortcuts in tree context menu are not in line with menu item</a>
            </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/967">Canvas/Excalidraw note slows down considerably with many images</a>
            </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/969">tab context menu on mobile is not accessible</a>
            </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/988">Code Notes Settings: the "Available MIME Type" list gets corrupted</a>
            </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/990">Tree Panel: the preferred width resets under certain conditions</a>
            </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/986">Mind map: the branching side preference is not persisted</a>
            </li>
            <li>HTML Import Strips away "valid" h1 tags by @pano9000 </li>
            <li><a href="https://github.com/TriliumNext/Notes/issues/1029">share.js broken on share pages</a> by
              @pano9000 </li>
          </ul>
          <h2>✨ Improvements</h2>
          <ul>
            <li><a href="https://github.com/TriliumNext/Notes/issues/974">Add space between "delete all revisions" and ? buttons on Note revision dialog</a>
            </li>
            <li>Improved launch bar on mobile: context menu to move between available
              and visible, or reset the configuration.</li>
            <li>Enable fixed editing toolbar by default for new users.</li>
          </ul>
          <h2>🌍 Internationalization</h2>
          <ul>
            <li>Translated some missing messages in Romanian.</li>
          </ul>
          <h2>⬆️ Technical improvements</h2>
          <ul>
            <li><strong>Reached zero vulnerabilities in dependencies according to </strong><code><strong>npm audit</strong></code>
            </li>
            <li>Update Electron to 34</li>
            <li>update dependency fs-extra to v11.3.0</li>
            <li>update dependency force-graph to v1.49.0</li>
            <li>update dependency katex to v0.16.21</li>
            <li>update dependency better-sqlite3 to v11.8.1</li>
            <li><a href="https://github.com/TriliumNext/Notes/pull/961">set more secure csrf related settings</a> by
              @pano9000 </li>
            <li>get rid of ts-node by @pano9000</li>
            <li>Fix default ivLength in dump-db tool by @Nriver </li>
            <li>add vitest as test framework and port current tests (&amp; various test
              improvements) by @pano9000 </li>
            <li>get rid of Webpack Critical dependency warning by @pano9000 </li>
            <li>fix flaky getPlatformAppDataDir test on Windows by @pano9000</li>
            <li>refactor and add tests for `services/import/mime` by @pano9000  </li>
            <li>refactor: compress images by @j9t </li>
            <li>Bump Electron to v34.0.1</li>
            <li>Bump i18next-http-backend to v3.0.2</li>
            <li>Bump i18next to v24.2.2</li>
            <li>Bump electron-forge monorepo to v7.6.1</li>
            <li>Bump @mind-elixir/node-menu to v1.0.4 </li>
            <li>Docker: update node.js to v22.13.1</li>
            <li>webpack: add Configuration type</li>
            <li>webpack: add missing share.js entry point</li>
            <li>npm audit fix by @pano9000 </li>
            <li>port desktop and mobile entrypoints by @pano9000 </li>
          </ul>
        </div>
      </div>


blobId: GBWvNScYcB7huUwYBUcb
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.457Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <h2>💡 Key highlights</h2>
              <ul>
                <li>Quite a few mobile improvements have been done (<strong>kindly waiting for bug reports</strong>)
                  <ul>
                    <li>On mobile the horizontal layout (with the launcher bar displayed at the
                      top of the screen instead of on the left side) is now enforced.
                      <ul>
                        <li>This allows for more real estate for the content of the note and simplifies
                          the mobile layout.</li>
                      </ul>
                    </li>
                    <li>The launch bar has also been moved at the bottom, to be inline with modern
                      application layouts.</li>
                    <li>Restructured the tree as a sidebar which is triggered via a button on
                      the left side of the title bar.</li>
                    <li>The sidebar can also be triggered by swiping to the right on the left
                      side of the screen. <i>Still some quirks to address on both iOS and Android due to their weird back button gesture</i>.</li>
                    <li>Improved the positioning of the bottom bar and of the editor toolbar.</li>
                    <li>Tabs have been enabled. Currently we are using the same implementation
                      as on desktop, which might have a few quirks on mobile.</li>
                    <li>Jump to note is now available.</li>
                    <li>The mobile view now has its own launch bar configuration with its own
                      launch bar buttons. For now only a few have been enabled. <strong>Feel free to request any button from the desktop should you require it.</strong>
                    </li>
                    <li>Now it's possible to insert footnotes in CKEditor, thanks to a fork of
                      <a href="https://github.com/ThomasAitken/ckeditor5-footnotes">ThomasAitken/ckeditor5-footnotes</a>.</li>
                    <li>It's also possible to create inline Mermaid diagrams into text notes.</li>
                  </ul>
                </li>
              </ul>
              <h2>Known issues</h2>
              <ul>
                <li>On mobile, opening in a new tab activates the new tab but does not refresh
                  the tab bar.</li>
              </ul>
              <h2>🐞 Bugfixes</h2>
              <ul>
                <li>Prevent HTML from rendering in launcher bar.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/783">Calendar overflows off right of view when in mobile view</a>
                </li>
                <li>Note tree context menu not shown on long press on iOS.</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/785">Advanced tree menu is only accessible in the mobile view via long-press</a>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/881">NotFoundError after trying to paste filepath into note, restart required</a>
                </li>
                <li>login: fix "flash of unstyled content" by @pano9000</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/920">Limit search function doesn't work</a>
                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/908">fix ck-editor checkboxes not showing checkmark while printing</a> by
                    @pano9000</p>
                </li>
              </ul>
              <h2>✨ Improvements</h2>
              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/830">Syntax Highlighting for Batch scripts</a>
                </li>
                <li>Mobile improvements
                  <ul>
                    <li>Translucent top bar mobile layout on iOS</li>
                    <li>Display formatting toolbar above keyboard.</li>
                  </ul>
                </li>
                <li>Fonts
                  <ul>
                    <li>Grouped the font selection by font type (sans-serif, monospace, etc.).</li>
                    <li>Added an option to use the system font (e.g. “Segoe UI” for Windows).</li>
                  </ul>
                </li>
                <li>Display the content of JSON attachments and improve the style of attachment
                  code blocks.</li>
                <li>Translucent top bar on desktop layout for iPad</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/666">'Show Help' and 'About Trillium Notes' menu options are now available in the mobile view</a>
                </li>
                <li>Back/forward buttons have been enabled for web builds as well, mostly
                  for mobile view.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/891">support for RFC 5870 geo-URIs</a> by
                  @0Raptor</li>
                <li>login: add Trilium icon and improve style by @pano9000</li>
                <li>allow disabling mention autocomplete by pressing escape (forward port
                  of @zadam’s work)</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/903">Restyle the help dialog</a> by
                    @adoriandoran</p>
                </li>
                <li>
                  <p>Added back ESLint support for backend notes</p>
                </li>
                <li>
                  <p>Exporting JavaScript code blocks in text notes to Markdown now sets the
                    right language tag.</p>
                </li>
              </ul>
              <h2>🌍 Internationalization</h2>
              <ul>
                <li>Spanish translation improvements by @hasecilu</li>
                <li>Chinese translation improvements by @Nriver</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/857">make &lt;kbd&gt; tags translatable</a> by
                  @pano9000</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/859">make duplicate notes suffix translatable</a> by
                  @pano9000</li>
                <li>improve translatability of database_backed_up_to string by @pano9000</li>
                <li>translate some buttons in the note tree</li>
                <li>translate a few note map buttons</li>
              </ul>
              <h2>⬆️ Technical Improvements</h2>
              <ul>
                <li>Library updates
                  <ul>
                    <li>force-graph to v1.47.2</li>
                    <li>@highlightjs/cdn-assets to v11.11.1</li>
                    <li>typedoc to v0.27.6</li>
                    <li>jquery.fancytree to v2.38.4</li>
                    <li>
                      <p>katex to v0.16.19</p>
                    </li>
                    <li>
                      <p>@types/node to v22.10.5</p>
                    </li>
                    <li>marked to v15.0.5</li>
                    <li>mind-elixir to v4.3.6</li>
                    <li>better-sqlite3 to v11.8.0</li>
                    <li>CKEditor to 41.3.2</li>
                    <li>jsdom to v26</li>
                    <li>i18next to v24.2.1</li>
                    <li>
                      <p>draggabilly to v3.0.0</p>
                    </li>
                    <li>
                      <p>electron to 33.3.1.</p>
                    </li>
                    <li>
                      <p>Node.js for Docker containers: v22.13.0</p>
                    </li>
                    <li>
                      <p>ts-loader: v9.5.2</p>
                    </li>
                  </ul>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/866">use existing randomSecureToken function</a> by
                    @pano9000</p>
                </li>
                <li>use named exports for the utils functions by @pano9000</li>
                <li>use Set instead of Arrays for faster lookups by @pano9000</li>
                <li>remove unused 'request' by @pano9000</li>
                <li>utils/formatDownloadTitle: simplify function by @pano9000</li>
                <li>
                  <p>remove unused tree-kill dependency by @pano9000</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/892">Add timezone and localtime mounts to docker-compose</a> by
                  @perfectra1n</li>
                <li>login: simplify JS by @pano9000</li>
                <li>set password: various smaller fixes by @pano9000</li>
                <li>use ejs partial for injecting window.glob by @pano9000</li>
                <li>add prettier as devDep and scripts by @pano9000</li>
                <li>add override for *.json tab width to match .editorconfig by @pano9000</li>
                <li>
                  <p>update deprecated electron packages by @pano9000</p>
                </li>
                <li>
                  <p>Add server logging for CKEditor state changes by @process</p>
                </li>
                <li>
                  <p>refactor(data_dir): simplify logic and make code robust and testable by
                    @pano9000</p>
                </li>
                <li>
                  <p>replace csurf with csrf-csrf by @pano9000</p>
                </li>
                <li>
                  <p>refactor(backend_log): improve getBackendLog by @pano9000</p>
                </li>
                <li>fix(views): replace deprecated meta tag by @pano9000</li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: v30qj1p7OsIYP8toGB4Z
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.461Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>🐞 Bugfixes</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/812">Can not toggle notes by clicking on the note's icon in the navigation bar</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/798">Cannot arrow down to "full search" when no search results are returned in quick search</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/795">Toolbar tooltips no longer shown</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/570">Two help pages will be opened when the help button is clicked</a>

                </li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/799">fix typo Trillium</a> by
                    @pano9000</p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/787">Libraries in Excalidraw are broken</a> by
                    @CobriMediaJulien </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/800">Color scheme selection</a> by
                    @adoriandoran</p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/802">Style Next: Restyle the "Jump to Note" dialog</a> by
                    @adoriandoran</p>
                </li>
                <li>
                  <p>Exporting a Markdown file will now try to preserve syntax highlighting</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/779">Auto-show left panel when configuring launchbar</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/813">Accessibility: explicitly associate label and input elements</a> by
                  @pano9000 </li>
              </ul>
               <h2>🌍 Internationalization</h2>

              <ul>
                <li>Spanish improvements by @hasecilu</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/801">localize hardcoded English aria-labels</a> by
                    @pano9000</p>
                </li>
                <li>
                  <p>Translate new note title</p>
                </li>
              </ul>
               <h2>⬆️ Library updates</h2>

              <ul>
                <li>typedoc: v0.27.5</li>
                <li>highlightjs: v11.11.0</li>
                <li>marked: v15.0.4</li>
                <li>express-rate-limit to v7.5.0</li>
                <li>chokidar: 4.0.3</li>
                <li>katex: v0.16.18</li>
                <li>sanitize-html: v2.14.0</li>
                <li>webpack-cli: v5.1.4 → v6.0.1</li>
                <li>i18next: v24.2.0</li>
                <li>@braintree/sanitize-url: v7.1.1</li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: s2UZ8cDPGGYBYkNYs8by
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.467Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>💡 Key highlights</h2>

              <ul>
                <li>The launcher bar can now be placed at the top instead of the left of the
                  screen, with a full-width tab bar. See <a href="https://github.com/TriliumNext/Notes/pull/654">#654</a> for
                  more information.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/661">A new theme is introduced called “TriliumNext"</a> by
                  @adoriandoran and @eliandoran. Settings on this theme are now displayed
                  in a card layout. Redesigned tree action buttons.</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/702">Native title bar buttons</a> when
                    native title bar is off for Windows and macOS.</p>
                </li>
                <li>
                  <p>On Windows, on the TriliumNext theme there are window transparency effects
                    if running under Windows, see <a href="https://github.com/TriliumNext/Notes/pull/717">Mica (Windows transparency effects)</a> for
                    screenshots. Unfortunately, it is plagued by a few bugs with Electron (the
                    library we are using for the desktop application), see the link for more
                    information.</p>
                </li>
                <li>
                  <p>Updated Docker builds to Node 22.<strong> Be on the lookout for any potential issues, especially for less-tested platforms such as ARM.</strong>

                  </p>
                </li>
              </ul>
               <h2>🐞 Bugfixes</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/668">Syntax highlight in code blocks only in edit mode</a>

                </li>
                <li>To do lists not preserved on safe import.</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/757">File type video with emoji in name will break the preview</a>

                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/732">Attribute "jump to" for internal links not working anymore</a>

                  </p>
                </li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/653">Add label definition type for standalone time</a> by
                    @mm21</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/670">Remove resizer from backend log text area</a> by
                  @meichthys</li>
                <li>Use CodeMirror for backend log</li>
                <li>Support for ELK layout in Mermaid diagrams (sponsored by @perfectra1n).
                  See the relevant “ELK layout engine” in <a class="reference-link" href="#root/xKNWRXC24L5y/moBMU5tfa7Xx/Tshj61stDt8g/tPQgGfUs7ewD">Mermaid diagrams</a> for
                  more information.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/678">Make exact matches rise higher up in search</a> by
                  @perfectra1n</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/538">Change layout of promoted attributes</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/659">Add full text search in autocomplete</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/598">Importing single HTML file: prefer html title over filename</a> by
                  @maphew</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/692">Support page breaks for printing</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/601">user configurable list of allowed html tags in import</a> by
                  @maphew</li>
                <li>General HTML support; now the editor supports more HTML tags and displays
                  them appropriately.
                  <ul>
                    <li>Currently the import function is the only way to benefit from them, or
                      modifying the source code manually by changing the note type.</li>
                  </ul>
                </li>
                <li>Change default icons for “Go to Previous Note” and “Go to next note” launcher
                  buttons.</li>
                <li>Move toggle sidebar button near tab bar on horizontal layout.</li>
                <li>Mind map notes now are full-width by default (same as Canvas, for example).</li>
                <li>Tabs can now display the icon notes instead of only workspace icons (this
                  is the default behaviour of the TrilumNext theme, can be added to any other
                  theme via <code>--tab-note-icons: true;</code> to <code>:root</code>).</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/700">New Features for note map</a> by
                  @CobriMediaJulien</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/694">Add supported link protocols</a> by
                  @SiriusXT</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/723">add Mind Elixir plugin @mind-elixir/node-menu</a>

                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/741">Format dates and times</a> by
                    @adoriandoran</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/758">Expose cheerio in backend script api</a> by
                  @kleutzinger </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/759">Format note paths</a> by
                    @adoriandoran</p>
                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/767">add remark about UFW issues</a> by
                  @pano9000</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/739">Code Block language support for Terraform (HCL)</a>

                  </p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/729">Display the fixed toolbar on multiple lines</a> (adjustable
                    in settings)</p>
                </li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/issues/713">Hide <code>internalLink</code> from <code>Jump To Note</code> dialog</a>

                  </p>
                </li>
              </ul>
               <h2>🌍 Internationalization</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/673">Chinese translation improvements (&amp; some new messages translated)</a> by
                  @Nriver</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/677">Add translation for doc notes</a> by
                  @Nriver</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/695/files">Spanish improvements</a> by
                  @hasecilu</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/698">Traditional Chinese support</a> by
                  @dwong33</li>
                <li>Translate import toast messages.</li>
                <li>Translate hidden notes (including options).</li>
                <li>Romanian improvements.</li>
                <li>
                  <p><a href="https://github.com/TriliumNext/Notes/pull/740">Brazillian Portuguese</a> by
                    @Nertonm work in progress (only server translations for now)</p>
                </li>
                <li>
                  <p>Translate note autocomplete.</p>
                </li>
              </ul>
               <h2>⬆️ Library updates</h2>

              <ul>
                <li>i18next, i18next-http-backend, i18next-fs-backend</li>
                <li>force-graph v1.47.0</li>
                <li>express 4.2.12</li>
                <li>mermaid 11.4.1</li>
                <li>axios 1.7.9</li>
                <li>katex 0.16.14</li>
                <li>https-proxy-agent 7.0.6</li>
                <li>better-sqlite3 11.6.0</li>
                <li>electron 31.3.1 -&gt; 33.2.1</li>
                <li>jimp 0.22.12 -&gt; 1.6.0</li>
                <li>mind-elixir 4.3.3</li>
                <li>Development tools
                  <ul>
                    <li>electron-forge</li>
                    <li>Docker Node.js updated to v20.18.1</li>
                    <li>GitHub Actions workflow actions</li>
                    <li>webpack v5.97.1</li>
                    <li>TypeScript + types</li>
                    <li>yargs</li>
                    <li>helmet</li>
                    <li>marked 15.0.3</li>
                    <li>is-svg 5.1.0</li>
                    <li>image-type 5.2.0</li>
                    <li>eslint v9.16.0</li>
                    <li>jsdom v25.0.1</li>
                    <li>compression v1.7.5</li>
                  </ul>
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: b8Had5OpRko0BKiC14yU
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.470Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>💡 Key highlights</h2>

              <ul>
                <li>…</li>
              </ul>
               <h2>🐞 Bugfixes</h2>

              <ul>
                <li>….</li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li>…</li>
              </ul>
               <h2>🌍 Internationalization</h2>

              <ul>
                <li>…</li>
              </ul>
               <h2>⬆️ Library updates</h2>

              <ul>
                <li>…</li>
              </ul>
              <p> </p>
            </div>
          </div>
        </div>
      </div>


blobId: 2dXhIKjt76bx53qSv4Nf
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.476Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>💡 Key highlights</h2>

              <ul>
                <li>Now it is possible to have a fixed toolbar for editing text notes instead
                  of the standard floating one, see <a href="https://github.com/TriliumNext/Notes/pull/571">Classic editor for text notes (with fixed toolbar)</a> for
                  more information.</li>
                <li>Syntax highlight in code blocks in editable and read-only text notes (via
                  Highlight.js), heavily based on <a href="https://github.com/antoniotejada">antoniotejada</a>'s
                  <a href="https://github.com/antoniotejada/Trilium-SyntaxHighlightWidget">Trilium-SyntaxHighlightWidget</a>.</li>
              </ul>
               <h2>Changes since the last beta release</h2>

               <h3>🐞 Bugfixes</h3>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/583">Shell (Bash) Syntax Highlight</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/593">0 Max content width causes editor issues</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/603">Share icon not visible in note icon picker</a>

                </li>
              </ul>
               <h3>✨ Improvements</h3>

              <ul>
                <li>Add find &amp; replace button to fixed toolbar</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/589">Add more link protocol support</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/576">Add a text replacement feature to the find_widget</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/587">Replace the editor type combo box with radio buttons</a> by
                  @adoriandoran</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/609">Add box icons to note menu &amp; attachments</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/615">Improve the "Existing backups" section</a> by
                  @adoriandoran</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/585">Trigger full text search when Ctrl + Enter is pressed in note autocomplete</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/618">Improve context menus</a> (+
                  <a href="https://github.com/TriliumNext/Notes/issues/613">Replace (?) with information icon</a>) by @adoriandoran</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/619">Add Options Launcher</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/565">Change note clone icon indicator from star to link icon</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/651">Add "Reopen last tab" and "Copy tab to new window" to tab management</a> by
                  @SiriusXT</li>
              </ul>
               <h3>🌍 Internationalization</h3>

              <ul>
                <li>Improved Spanish translations by @hasecilu</li>
                <li>Improved German translations by @j13055</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/612">Improve note revision wording and consistency</a> by
                  @meichthys </li>
              </ul>
               <h3>⬆️ Library updates and technical improvements</h3>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/607">Add renovate GitHub Action and JSON config</a> by
                  @perfectra1n </li>
              </ul>
               <h2>From <code>v0.90.11-beta</code></h2>

               <h3>🐞 Bugfixes</h3>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/568">Double input after spaces on Android</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/122">Hyperlinks with custom protocols not working</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/525">Internal Link: Two Tooltips are displayed</a>

                </li>
                <li>Fixed loading of syntax highlighting themes for server and Docker builds.</li>
              </ul>
               <h3>✨ Improvements</h3>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/531">Insert inline images in text notes</a> (also
                  grouped the image alignment buttons in subcategories since there were too
                  many of them).</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/545">Explicitly manage the "latest" tag, and have it point to the same tag as "stable"</a> by
                  @perfectra1n</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/559">Make attachments open in a new tab/browser</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/555">mouse scroll wheel direction for zoom level</a> by
                  @rom1dep</li>
                <li>Apply syntax highlight to preview of code notes as well.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/574">More reliably check for version updates</a> by
                  @perfectra1n</li>
                <li>README improvements by @perfectra1n</li>
              </ul>
               <h3>🌍 Internationalization</h3>

              <ul>
                <li>Preliminary support for the German language by @j13055 </li>
                <li>Improved French translations by @Potjoe-97</li>
                <li>Improved Spanish translations by @hasecilu</li>
              </ul>
               <h3>⬆️ Library updates</h3>

              <ul>
                <li>mind-elixir: 4.2.4 -&gt; 4.3.1</li>
                <li>client: force-graph: 1.45.0 -&gt; 1.46.0</li>
              </ul>
               <h2>From <code>v0.90.10-beta</code></h2>

               <h3>🐞 Bugfixes</h3>

              <ul>
                <li>Code note overlapping with note list.</li>
                <li>Fix error when running a script in 0.90.9-beta.</li>
                <li>Font section in Appearance settings blinking when settings were being
                  updated.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/541">Crop fileName and prevent cutting into the extension</a> /
                  Canvas note exported to html can't be view due to title name is 13-15 digits
                  long by @SiriusXT</li>
                <li>Duplicate note count in delete relation modal.</li>
                <li>Docnotes (e.g. launcher configuration descriptions) not showing on Electron/desktop
                  builds.</li>
              </ul>
               <h3>✨ Improvements</h3>

              <ul>
                <li>Adjustable word-wrap for code blocks in text notes.</li>
                <li>Adjustable theme for code blocks in text notes, plus slightly improved
                  design.</li>
                <li>The application should now be more highly tolerant to errors caused by
                  custom widgets and scripts, not causing the UI to also crash (see <a href="https://github.com/TriliumNext/Notes/issues/511">#511</a>).</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/542">Close tabs to the right</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/534">Automatically trigger autocomplete on focus</a> by
                  @SiriusXT</li>
              </ul>
               <h3>🌍 Internationalization</h3>

              <ul>
                <li>Translate weekday and month names for daily notes.</li>
                <li>Update server translations when switching language.</li>
                <li>Translate search note prefix.</li>
                <li>Translate sync test messages.</li>
              </ul>
               <h3>⬆️ Library updates</h3>

              <ul>
                <li>mind-elixir: 4.2.3 → 4.2.4</li>
                <li>mermaid: 11.3.0 → 11.4.0</li>
                <li>i18next: 23.16.2 -&gt; 23.16.4</li>
                <li>and other internal development tooling updates.</li>
              </ul>
               <h2>From <code>v0.90.9-beta</code></h2>

               <h3>🐞 Bugfixes</h3>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/503">Promoted boolean attributes no long showing checkbox when the value is true</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/500">Import of .htm keeps htm in title while html does not</a>

                </li>
              </ul>
               <h3>✨ Improvements</h3>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/504">Syntax highlighting in read-only mode code notes</a> (also
                  for “View source”).</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/505">Server 404 logs are now one-line instead of a full stack trace</a>

                </li>
              </ul>
               <h3>🌍 Internationalization</h3>

              <ul>
                <li>Translated the toast notifications, errors and confirmation boxes.</li>
                <li>Translated the launcher context menu.</li>
              </ul>
               <h3>⬆️ Library updates</h3>

              <ul>
                <li>i18next: 23.16.0 -&gt; 23.16.2</li>
                <li>mind-elixir: 4.2.0 -&gt; 4.2.2</li>
                <li>vanilla-js-wheel-zoom: 9.0.2 -&gt; 9.0.4</li>
                <li>cookie-parser: 1.4.6 → 1.4.7</li>
                <li>image-type: 4.1.0 → 5.2.0</li>
                <li>express, express-rate-limit, express-session updated to latest.</li>
                <li>cookie-parser: 1.4.6 → 1.4.7</li>
                <li>marked: 14.1.2 → 14.1.3</li>
                <li>sanitize-html: 2.13.0 → 2.13.1</li>
                <li>force-graph: 1.43.5 → 1.45.0</li>
                <li>and others (jasmine, debounce)</li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: 4WVBWaMJHxDJUkXhzoO7
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.480Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>💡 Key highlights</h2>

              <ul>
                <li>Now it is possible to have a fixed toolbar for editing text notes instead
                  of the standard floating one, see <a href="https://github.com/TriliumNext/Notes/pull/571">Classic editor for text notes (with fixed toolbar)</a> for
                  more information.</li>
              </ul>
               <h2>🐞 Bugfixes</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/568">Double input after spaces on Android</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/122">Hyperlinks with custom protocols not working</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/525">Internal Link: Two Tooltips are displayed</a>

                </li>
                <li>Fixed loading of syntax highlighting themes for server and Docker builds.</li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/531">Insert inline images in text notes</a> (also
                  grouped the image alignment buttons in subcategories since there were too
                  many of them).</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/545">Explicitly manage the "latest" tag, and have it point to the same tag as "stable"</a> by
                  @perfectra1n</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/559">Make attachments open in a new tab/browser</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/555">mouse scroll wheel direction for zoom level</a> by
                  @rom1dep</li>
                <li>Apply syntax highlight to preview of code notes as well.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/574">More reliably check for version updates</a> by
                  @perfectra1n</li>
                <li>README improvements by @perfectra1n</li>
              </ul>
               <h2>🌍 Internationalization</h2>

              <ul>
                <li>Preliminary support for the German language by @j13055 </li>
                <li>Improved French translations by @Potjoe-97</li>
                <li>Improved Spanish translations by @hasecilu</li>
              </ul>
               <h2>⬆️ Library updates</h2>

              <ul>
                <li>mind-elixir: 4.2.4 -&gt; 4.3.1</li>
                <li>client: force-graph: 1.45.0 -&gt; 1.46.0</li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: t5pzfcbLUEIxekKhiJoz
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.483Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>💡 Key highlights</h2>

              <ul>
                <li>Syntax highlight in code blocks in editable and read-only text notes (via
                  Highlight.js), heavily based on <a href="https://github.com/antoniotejada">antoniotejada</a>'s
                  <a href="https://github.com/antoniotejada/Trilium-SyntaxHighlightWidget">Trilium-SyntaxHighlightWidget</a>.</li>
              </ul>
               <h2>🐞 Bugfixes</h2>

              <ul>
                <li>Code note overlapping with note list.</li>
                <li>Fix error when running a script in 0.90.9-beta.</li>
                <li>Font section in Appearance settings blinking when settings were being
                  updated.</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/541">Crop fileName and prevent cutting into the extension</a> /
                  Canvas note exported to html can't be view due to title name is 13-15 digits
                  long by @SiriusXT</li>
                <li>Duplicate note count in delete relation modal.</li>
                <li>Docnotes (e.g. launcher configuration descriptions) not showing on Electron/desktop
                  builds.</li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li>Adjustable word-wrap for code blocks in text notes.</li>
                <li>Adjustable theme for code blocks in text notes, plus slightly improved
                  design.</li>
                <li>The application should now be more highly tolerant to errors caused by
                  custom widgets and scripts, not causing the UI to also crash (see <a href="https://github.com/TriliumNext/Notes/issues/511">#511</a>).</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/542">Close tabs to the right</a> by
                  @SiriusXT</li>
                <li><a href="https://github.com/TriliumNext/Notes/pull/534">Automatically trigger autocomplete on focus</a> by
                  @SiriusXT</li>
              </ul>
               <h2>🌍 Internationalization</h2>

              <ul>
                <li>Translate weekday and month names for daily notes.</li>
                <li>Update server translations when switching language.</li>
                <li>Translate search note prefix.</li>
                <li>Translate sync test messages.</li>
              </ul>
               <h2>⬆️ Library updates</h2>

              <ul>
                <li>mind-elixir: 4.2.3 → 4.2.4</li>
                <li>mermaid: 11.3.0 → 11.4.0</li>
                <li>i18next: 23.16.2 -&gt; 23.16.4</li>
                <li>and other internal development tooling updates.</li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: AOkn3EipiKMJYfCvAWP6
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.488Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <p>Finally, syntax highlighting was added as a feature for code blocks:</p>
              <figure class="image">
                <img src="api/images/tMqXaihh0YEf/1_Syntax highlighting &amp; word.png" />
                </figure>
                 <h2>Context</h2>

                <p>In order to achieve the syntax highlight, the Highlight.js library is
                  being used. Do note that support for syntax highlighting in code blocks
                  is not a supported feature of the text editor we are using CKEditor), but
                  rather a hack which makes use of the highlights API (used for highlighting
                  search results for example). Nevertheless, we haven't noticed any major
                  issues during the development of the feature, but feel free to report any
                  issues you might have.</p>
                <p>Most of the work to achieve the syntax highlight itself was already done
                  by <a href="https://github.com/antoniotejada">antoniotejada</a> in <a href="https://github.com/antoniotejada/Trilium-SyntaxHighlightWidget">https://github.com/antoniotejada/Trilium-SyntaxHighlightWidget</a>.
                  On our side we added customization but also additional functionality.</p>
                 <h2>Migrating from existing syntax highlight plugins</h2>

                <p>If you are already using a syntax highlighting plugin such as the <a href="https://github.com/antoniotejada/Trilium-SyntaxHighlightWidget">Trilium-SyntaxHighlightWidget</a> we
                  are basing off of, it is important to disable that plugin before upgrading
                  in order for it not to conflict with our implementation.</p>
                <p>Should you encounter any issues after the migration, try running Trilium
                  in safe mode.</p>
                 <h2>New section in settings</h2>

                <p>In order to configure this new feature, a section has been added in Options
                  → Appearance to control the syntax highlighting. There the color scheme
                  can be chosen, from a builtin selection of themes from Highlight.js.</p>
                <p>It is also now possible to disable the word wrapping for code blocks,
                  which can make them easier to read for large amounts of code. Word wrapping
                  has now been disabled by default.</p>
                <p>It is also possible to disable the syntax highlighting by selecting “No
                  syntax highlighting” in the “Color scheme” option.</p>
                <figure class="image">
                  <img src="api/images/syZEwEpy7KPm/Syntax highlighting &amp; word.png" />
                </figure>
                 <h2>Using the syntax highlight in auto mode</h2>

                <p>Provided the syntax highlighting is enabled in the settings, simply create
                  a code block within a text note and it will try to automatically detect
                  the language (using the Highlight.js library):</p>
                <figure class="image">
                  <img src="api/images/7tvfshnSnkM3/2_Syntax highlighting &amp; word.png" />
                </figure>
                 <h2>Adjusting the language manually</h2>

                <p>Should the automatic syntax highlight not work well enough, it is possible
                  to manually adjust the language of the code block:</p>
                <figure class="image">
                  <img src="api/images/jkwowWmGQ2Kc/3_Syntax highlighting &amp; word.png" />
                </figure>
                 <h2>Adding support for new languages</h2>

                <p>By going to settings → Code Notes → Available MIME types in the dropdown,
                  it is possible to adjust the languages that are used for code blocks as
                  well.</p>
                <p>Note that not all languages that are present in this list (which is meant
                  for code blocks, using CodeMirror as editor) are supported by our syntax
                  highlight library. In this case you will simply see no syntax highlighting
                  when you select the language.</p>
                <p>If syntax highlighting is not supported for a given language, feel free
                  to open an issue and we will look whether it is possible to integrate it.</p>
                 <h2>Automatic disable of syntax highlighting</h2>

                <p>Note that when editing a text note, syntax highlighting is automatically
                  disabled if the code block is too big (somewhere around 500 lines). This
                  value is currently not configured.</p>
                <p>For read-only text notes, this limitation is not applied.</p>
            </div>
          </div>
        </div>
      </div>


blobId: 975CTSRy4ntmiyDsE8pJ
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.492Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>🐞 Bugfixes</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/503">Promoted boolean attributes no long showing checkbox when the value is true</a>

                </li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/500">Import of .htm keeps htm in title while html does not</a>

                </li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/504">Syntax highlighting in read-only mode code notes</a> (also
                  for “View source”).</li>
                <li><a href="https://github.com/TriliumNext/Notes/issues/505">Server 404 logs are now one-line instead of a full stack trace</a>

                </li>
              </ul>
               <h2>🌍 Internationalization</h2>

              <ul>
                <li>Translated the toast notifications, errors and confirmation boxes.</li>
                <li>Translated the launcher context menu.</li>
              </ul>
               <h2>⬆️ Library updates</h2>

              <ul>
                <li>i18next: 23.16.0 -&gt; 23.16.2</li>
                <li>mind-elixir: 4.2.0 -&gt; 4.2.2</li>
                <li>vanilla-js-wheel-zoom: 9.0.2 -&gt; 9.0.4</li>
                <li>cookie-parser: 1.4.6 → 1.4.7</li>
                <li>image-type: 4.1.0 → 5.2.0</li>
                <li>express, express-rate-limit, express-session updated to latest.</li>
                <li>cookie-parser: 1.4.6 → 1.4.7</li>
                <li>marked: 14.1.2 → 14.1.3</li>
                <li>sanitize-html: 2.13.0 → 2.13.1</li>
                <li>force-graph: 1.43.5 → 1.45.0</li>
                <li>and others (jasmine, debounce)</li>
              </ul>
            </div>
          </div>
        </div>
      </div>


blobId: MS3GiXaCOsEq1J2khJIi
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.495Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>💡 Key highlights</h2>

              <ul>
                <li>A new note type was introduced called “Mind Map” using the MindElixir
                  library.</li>
                <li>Sync version has been increased from 32 to 33 to prevent issues with mindmap
                  notes. This means that the server also needs to be updated to this version,
                  otherwise sync will be refused.</li>
                <li>Internationalization support (Spanish, Chinese, Romanian, French).</li>
                <li>Various bugfixes (see below).</li>
              </ul>
               <h2>New to v0.90.8</h2>

               <h2>🐞 Bugfixes</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/issues/485">There are horizontal lines under all hyperlinks</a>

                </li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li><a href="https://github.com/TriliumNext/Notes/pull/489">Introduce <code>stable</code> tag on containers</a> by
                  @perfectra1n</li>
              </ul>
               <h3>🌍 Internationalization</h3>

              <ul>
                <li>Added French translations by @Potjoe-97</li>
                <li>Translation improvements for Spanish by @hasecilu </li>
                <li>Translation improvements for Chinese by @Nriver</li>
                <li>Improved coverage for Romanian.</li>
              </ul>
               <h3>⬆️ Library updates</h3>

              <ul>
                <li>mind-elixir: 4.1.5 -&gt; 4.2.0</li>
                <li>i18next: 23.15.2 -&gt; 23.16.0</li>
              </ul>
               <h2>From v0.90.7-beta</h2>

              <section class="include-note" data-note-id="IUFNm5bKJvqP" data-box-size="full"> </section>
               <h2>From v0.90.6-beta</h2>

              <ul>
                <li>Adds back the <code>amd64</code> container image</li>
              </ul>
               <h2>From v0.90-5-beta</h2>

              <section class="include-note" data-note-id="BhOmUN22ksCU" data-box-size="full"> </section>
            </div>
          </div>
        </div>
      </div>


blobId: PCQJr7C2ydB68NUhkm9e
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.500Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                   <h2>⚠️ Important notes</h2>

                  <ul>
                    <li>0.90.5-beta &amp; 0.90.6-beta have an incompatibility with older sync
                      servers if using mind maps, causing them to get turned to a file. If you
                      are impacted by this, see <a href="https://github.com/TriliumNext/Notes/issues/467#issuecomment-2402853189">mindmap note suddenly show with file note</a>.</li>
                    <li>Sync version has been increased from 32 to 33 to prevent issues with mindmap
                      notes. This means that the server also needs to be updated to this version,
                      otherwise sync will be refused.</li>
                  </ul>
                   <h2>🐞 Bugfixes</h2>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/297">Insert Math appears to be broken</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/472">Override the z-index of Bootstrap tooltips</a> by
                      <a href="https://github.com/dousha">dousha</a>
                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/417">Clicking an entry in the calendar opens the note twice</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/467">mindmap note suddenly show with file note</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/458">Import md with jpeg: broken jpeg</a> by
                      <a href="https://github.com/perfectra1n"><code>perfectra1n</code>

                        </a>
                    </li>
                  </ul>
                   <h2>✨ Improvements</h2>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/392">Icon improvements</a> by <code>@SiriusXT</code>.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/389">Open in file manager of Trilium's data directory</a> by <code>@SiriusXT</code>.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/414">i18n Fallback to English for null characters</a> by <code>@SiriusXT</code>.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/402#top">Use matrix strategy for CI/CD</a> (Alpine
                      is back!) by <code>perfectra1n</code>.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/432">Floating buttons can be displayed again after being closed</a> by <code>@SiriusXT</code>.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/391">Revisions number limit</a> by
                      <a href="https://github.com/SiriusXT">SiriusXT</a>.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/451">Searching with orderBy doesn't work with dated attributes</a> by
                      <a href="https://github.com/jaimeferj">jaimeferj</a>.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/452">Use the electron Clipboard module when using "Copy image to clipboard"</a> by
                      @perfectra1n.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/458">MIME type not being used when creating new note correctly, upon zip import</a> by
                      @perfectra1n.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/465">fix blurry PWA icon</a> by
                      <a href="https://github.com/quantum5">quantum5</a>
                    </li>
                  </ul>
                   <h2>🌍 Internationalization</h2>

                  <ul>
                    <li>Translated more of the client (e.g. note types, tree context menu, switches
                      in the ribbon).</li>
                    <li>Started translating the server (e.g. first setup, keyboard actions, shared
                      pages).</li>
                    <li>Improved coverage for Spanish by <a href="https://github.com/hasecilu">hasecilu</a>.</li>
                    <li>Improved coverage for Chinese by <a href="https://github.com/Nriver/">Nriver</a>.</li>
                    <li>Improved coverage for Romanian.</li>
                  </ul>
                   <h2>Library updates</h2>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/381">Upgrade bootstrap from v4 to v5</a> by
                      @JYC333
                      <ul>
                        <li>This is a heavy UI library update, so there might be quirks here and there.</li>
                        <li>Various improvements and bugfixes by @JYC333 and @SiriusXT</li>
                      </ul>
                    </li>
                    <li>Mermaid: 10.9.1 → 11.3.0</li>
                    <li>Mind Elixir: 4.0.5 → 4.1.5</li>
                    <li>JSDOM: 24.1.1 → 25.0.0</li>
                    <li>Day.js: 1.11.12 → 1.11.13</li>
                    <li>ESLint: 9.9.0 → 9.10.0</li>
                    <li>Marked: 13.0.2 → 14.1.2</li>
                    <li>Ini: 4.1.3 -&gt; 5.0.0</li>
                    <li>Axios: 1.7.2 → 1.7.7</li>
                    <li>i18next: 23.14.0 → 23.15.2</li>
                    <li>express 4.19.2 → 4.21.0</li>
                    <li>better-sqlite3: 11.1.2 → 11.3.0</li>
                    <li>and other development tools.</li>
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: 4XxfKjyupjy6VCXczoyh
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.503Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                  <p>This is a Docker-only re-release of <a href="https://github.com/TriliumNext/Notes/releases/tag/v0.90.6-beta">v0.90.5-beta</a> that <strong>adds back the amd64 container image</strong> which
                    was previously not available due to a race condition on our build mechanism.
                    For now, this means that the Alpine container mentioned in the previous
                    release is no longer available, as we have fallen back to Debian Slim.</p>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: shJwnzmGlNHXGdvbbtDY
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.510Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                  <p>This release brings a few quality-of-life improvements, as well as bugfixes.
                    The main highlight, however, is the increased support for localization
                    as well as a new note type.</p>
                   <h2>🌍 Internationalization</h2>

                  <p>Preliminary support for internationalization has been added, thanks to
                    the efforts of <code>@Nriver</code>. More specifically, the following languages
                    now have a partial translation:</p>
                  <ul>
                    <li>Spanish by <code>@hasecilu</code>

                    </li>
                    <li>Chinese by <code>@Nriver</code>

                    </li>
                    <li>Romanian.</li>
                  </ul>
                  <p>Note that only the client has been translated so far and there are still
                    a lot of tasks to handle before the application is fully translated.</p>
                   <h2>💡 New note type: Mind map</h2>

                  <p>Mind maps are usually a fast method to write down ideas and do brainstorming
                    with a team. TriliumNext introduces this new note type with the help of
                    <a href="https://mind-elixir.com/">Mind Elixir</a>, an open-source library.</p>
                  <p>Note that the integration is still in its infancy, so there might be bugs
                    and a lack of feature until it is stabilized. The library itself supports
                    quite a few features that are not implemented yet in Trilium: math expressions
                    using KaTeX, images, links. Those might be implemented along the way, provided
                    they are needed by users.</p>
                  <figure class="image">
                    <img src="api/attachments/d42gQCHHzYsj/image/v0.90.5-beta_image.png" />
                  </figure>
                  <blockquote>
                    <p><strong>Note</strong>: For the note type to fully work (such as shared
                      notes), it is ideal to update the server instance as well, if you are using
                      one.</p>
                  </blockquote>
                   <h2>⚙️ Builds</h2>

                  <p>The internal build tooling has been updated, resulting in the following
                    changes:</p>
                  <ul>
                    <li>For macOS users there is now a <code>.dmg</code> installation method as
                      well. <code>@JYC333</code>

                      <ul>
                        <li>There is also an ARM-native version for macOS that can be used, however
                          it will require <a href="https://github.com/TriliumNext/Notes/issues/329">additional steps to get it running</a> due
                          to the lack of notarization (to bypass the “TriliumNext Notes.app” is damaged
                          error).</li>
                      </ul>
                    </li>
                    <li>For both Windows and Linux we now have <code>amd64</code> builds as well.
                      <ul>
                        <li>Please note these versions are not being actively tested due to lack of
                          equipment, so feel free to raise any issues you might be encountering.</li>
                      </ul>
                    </li>
                  </ul>
                  <p>On the Docker side, <a href="https://github.com/TriliumNext/Notes/pull/366">brought back Alpine-based Docker containers for amd64</a> by <code>@perfectrain</code>.</p>
                   <h3>🐞 Bugfixes</h3>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/331">v0.90.4 docker does not read USER_UID and USER_GID from environment</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/318">Invalid CSRF token on Android phone</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/341">Excess spacing in lists</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/350">scrollbar-color makes the scrollbar appear natively styled</a>

                    </li>
                    <li>Invisible scrollbar on Firefox</li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/358">Issue with note title text box border</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/365">Focus not set to input field when clicking <code>Include Note</code> from Block Editor</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/377">Fix a bug of find widget</a> by <code>@SiriusXT</code>

                    </li>
                    <li>
                      <p><a href="https://github.com/TriliumNext/Notes/issues/368">'A JavaScript error occurred in the main process' when launching Trilium</a> (improved
                        error handling).</p>
                    </li>
                    <li>
                      <p><a href="https://github.com/TriliumNext/Notes/issues/375">Note Tooltip isn't removed when clicking on internal trilium link in read-only mode</a>

                      </p>
                    </li>
                    <li>
                      <p><a href="https://github.com/TriliumNext/Notes/issues/384">Calendar dropdown won't close if click/right-click other button that open notes from launcher bar</a>

                      </p>
                    </li>
                  </ul>
                   <h3>✨ Improvements</h3>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/374">Improved the calendar button in the launch bar</a>,
                      adding support for easier month and year selection.</li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/247">Make first day of week configurable</a> (supports
                      Sunday and Monday)
                      <ul>
                        <li>Can be adjusted in Options → Appearance → Localization → First day of
                          the week.</li>
                        <li>The option is synced with the server and the client updates immediately.</li>
                      </ul>
                    </li>
                    <li>Removed hard-coded libraries such as FancyTree and Bootstrap. This will
                      later allow us to upgrade to the latest versions. <code>@JYC333</code>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/345">Hide Electron-specific settings in the web version</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/348">Add a toggle to promote the current note to a template</a>

                    </li>
                    <li>Disable share toggle when in options</li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/373">Open New window from taskbar</a> by <code>@SiriusXT</code>

                    </li>
                    <li>Pressing F2 to edit the branch prefix will now work only in the note tree
                      to avoid issues with other interactive elements such as the mind map, but
                      also since the option itself is not the most used ones to require a global
                      shortcut.</li>
                  </ul>
                   <h2>New Contributors</h2>

                  <ul>
                    <li><a href="https://github.com/JYC333">@JYC333</a> made their first contribution
                      in <a href="https://github.com/TriliumNext/Notes/pull/294">#294</a>

                    </li>
                    <li><a href="https://github.com/hasecilu">@hasecilu</a> made their first contribution
                      in <a href="https://github.com/TriliumNext/Notes/pull/349">#349</a>

                    </li>
                    <li><a href="https://github.com/SiriusXT">@SiriusXT</a> made their first contribution
                      in <a href="https://github.com/TriliumNext/Notes/pull/377">#377</a>

                    </li>
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: bvjb6yFvsaV7uyJDm5Yy
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.517Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                  <p>This release focuses mostly on improving the experience with the Docker
                    containers.</p>
                   <h2>Docker ARM builds</h2>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/302">ARM builds for Docker were reintroduced</a> and
                      are available on both <a href="https://hub.docker.com/r/triliumnext/notes">Docker Hub</a> and
                      <a href="https://github.com/TriliumNext/Notes/pkgs/container/notes">GHCR</a>starting with this release.
                        <ul>
                          <li>Note that only <code>ARMv7</code> and <code>ARM64/v8</code> architectures
                            are supported for now.</li>
                          <li><code>ARMv6</code> support was dropped due to incompatibility issues with
                            Node 20.</li>
                        </ul>
                    </li>
                  </ul>
                   <h2>🐞 Bugfixes</h2>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/296">Docker container marked as not healthy</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/304">Find/Replace dialog doesn't match theme</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/311">Tray icon is missing on windows</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/308">Error when Duplicating subtree of note that contains broken internal trilium link</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/313">Update available points to Trilium download instead of TriliumNext</a>

                    </li>
                  </ul>
                   <h2>Additional changes</h2>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/309">Update <code>docker-compose.yml</code></a> by
                      slashtechno</li>
                    <li>Updated links throughout the application to point to the rendered <a href="https://triliumnext.github.io/Docs">TriliumNext Wiki</a>

                    </li>
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: 2xqTVVsJsj0DMdAVdwpg
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.537Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                  <p>This is the first public release of TriliumNext considered stable.</p>
                   <h2>❔ Why TriliumNext?</h2>

                  <p>TriliumNext has started as a fork of <a href="https://github.com/zadam/trilium">Trilium Notes</a> at
                    the beginning of 2024. The reason for the work is that the upstream project
                    has entered <a href="https://github.com/zadam/trilium/issues/4620">maintenance phase</a> and
                    we would like to extend the application.</p>
                  <p>The work so far has focused more on the technical aspects because most
                    of the work has been done by @zadam and handing over a project of this
                    size is non-trivial. Some more technical work will be done in the upcoming
                    versions after which the project can focus on improving the user experience
                    as much as possible.</p>
                  <p>As a short overview of what's planned next from a user-facing point of
                    view:</p>
                  <ul>
                    <li>Support for multiple languages.</li>
                    <li>Improving the existing theme and decluttering the UI.</li>
                    <li>Mobile improvements.</li>
                    <li>Exploring additional editors such as a MarkDown-based editor.</li>
                  </ul>
                   <h2>⬆️ Porting from Trilium Notes?</h2>

                  <p>There is no change in the database structure.</p>
                  <p>TriliumNext Notes can be run instead of the original Trilium Notes and
                    it should work out of the box, since it will reuse the same database.</p>
                  <p>It should also be possible to downgrade back to Trilium Notes if required,
                    without any changes or loss of data.</p>
                  <p>Similarly goes for the server, it should work out of the box. It is possible
                    to mix and match between Trilium Notes and TriliumNext Notes.</p>
                   <h2>🐞 How stable is the version</h2>

                  <p>Generally you should not encounter any breaking bugs as the prior versions
                    have been tested and daily-driven for a few weeks now.</p>
                  <p>Should you encounter any issue, feel free to report them on <a href="https://github.com/TriliumNext/Notes/issues">our GitHub issues</a>.</p>
                   <h2>✨ Key highlights</h2>

                  <ul>
                    <li>Fixed (from v0.90.2-beta)
                      <ul>
                        <li>Fixed <a href="https://github.com/TriliumNext/Notes/issues/281">Error importing zip file</a>

                        </li>
                        <li>Fixed Alt+Left and Alt+Right navigation would not work under Electron.</li>
                        <li>Added a fresh new icon to represent our ongoing effort to improve Trilium.</li>
                      </ul>
                    </li>
                    <li>v0.90.2-beta
                      <ul>
                        <li>Fixed some issues with the sync.</li>
                        <li>Ported the server from Common.js to ES modules.</li>
                        <li>Updated the CKEditor from 41.0.0 to 41.4.2.</li>
                        <li>Updated Electron from 25.9.8 (marked as end-of-life) to 31.2.1.</li>
                        <li>Started adding support for internationalization (<a href="https://github.com/TriliumNext/Notes/pull/248">#248</a>).
                          The application will soon be able to be translated into multiple languages.</li>
                        <li>Improved error management for scripting</li>
                      </ul>
                    </li>
                    <li>v0.90.1-beta
                      <ul>
                        <li>Introduced a Windows installer instead of the .zip installation. </li>
                        <li>Bug fixes related to the TypeScript port of the server.</li>
                      </ul>
                    </li>
                    <li>v0.90.0-beta
                      <ul>
                        <li>On a technical side, the server was rewritten in TypeScript. This should
                          improve the stability of both current and future developments thanks to
                          the language's type safety. It will also make the development slightly
                          easier.</li>
                      </ul>
                    </li>
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: T7LIbIUgXfPUOCwm4HXQ
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.541Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                   <h2>🐞 Bugfixes</h2>

                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/266">(Bug report) Initial sync doesn't finish</a>

                    </li>
                  </ul>
                   <h2>✨ Technical Improvements</h2>

                  <p>Important changes:</p>
                  <ul>
                    <li>The biggest change is that the server has been ported from Common.js to
                      ES Modules. Note that a change of this proportion is bound to cause some
                      quirks throughout the application, bug reports are welcome.</li>
                    <li>Updated Electron from 25.9.8 to 31.2.1 (<a href="https://github.com/TriliumNext/Notes/pull/231">#231</a>)</li>
                  </ul>
                  <p>Additionally:</p>
                  <ul>
                    <li>Updated CKEditor from 41.0.0 to 41.4.2.</li>
                    <li>Started adding support for internationalization (<a href="https://github.com/TriliumNext/Notes/pull/248">#248</a>).
                      The application will soon be able to be translated into multiple languages.</li>
                    <li>Improved error management for scripting:
                      <ul>
                        <li>If a critical unexpected error occurs from a widget, a toast is shown
                          explaining the situation and advising to enter safe mode, as opposed to
                          a blank page.</li>
                        <li>If a basic widget fails to render, a toast is shown instead of crashing
                          the application.</li>
                      </ul>
                    </li>
                    <li>Toast messages now support newlines (by adding a <code>\n</code> to the
                      message) for slightly better formatting.</li>
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: 25zzJQE2J3q54V0CmBv2
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.551Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                  <p>The key highlight of this version is the large number of library updates,
                    bringing them to the latest version.</p>
                   <h2>⚙️ Windows Installer</h2>

                  <p>A Squirrel-based installer for the Windows 64-bit platform is now provided
                    with each release.</p>
                  <p>Simply download the installer and run it and the application should be
                    installed automatically.</p>
                   <h2>🐞 Bugfixes</h2>

                  <p>The following regressions due to the conversion to TypeScript has been
                    solved, compared to v0.90.0:</p>
                  <ul>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/211">Searching note content fails</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/pull/227">Canvas: "Copy image reference to clipboard" no longer working</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/238">v.0.90.0-beta random errors when loading notes</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/244">Frontend JS code exeution error</a>

                    </li>
                    <li><a href="https://github.com/TriliumNext/Notes/issues/210">Sync failed: Cannot read properties of undefined (reading 'utcDateChanged')</a>

                    </li>
                  </ul>
                   <h2>⬆️ Library updates</h2>

                   <h3>Client-side library updates</h3>

                  <figure class="table" style="width:50%">
                    <table>
                      <thead>
                        <tr>
                          <th>Library</th>
                          <th>Old version</th>
                          <th>New version</th>
                        </tr>
                      </thead>
                      <tbody>
                        <tr>
                          <th><code>axios</code>

                          </th>
                          <td>1.6.7</td>
                          <td>1.7.2</td>
                        </tr>
                        <tr>
                          <th><code>excalidraw</code>

                          </th>
                          <td>0.17.3</td>
                          <td>0.17.6</td>
                        </tr>
                        <tr>
                          <th><code>katex</code>

                          </th>
                          <td>0.16.9</td>
                          <td>0.16.11</td>
                        </tr>
                        <tr>
                          <th><code>mermaid</code>

                          </th>
                          <td>10.9.0</td>
                          <td>10.9.1</td>
                        </tr>
                        <tr>
                          <th><code>react</code>, <code>react-dom</code>

                          </th>
                          <td>18.2.0</td>
                          <td>18.3.1</td>
                        </tr>
                      </tbody>
                    </table>
                  </figure>
                   <h3>Server-side library updates</h3>

                  <figure class="table" style="width:50%">
                    <table>
                      <thead>
                        <tr>
                          <th>Library</th>
                          <th>Old version</th>
                          <th>New version</th>
                        </tr>
                      </thead>
                      <tbody>
                        <tr>
                          <th><code>sanitize-url</code>

                          </th>
                          <td>6.0.4</td>
                          <td>7.1.0</td>
                        </tr>
                        <tr>
                          <th><code>archiver</code>

                          </th>
                          <td>7.0.0</td>
                          <td>7.0.1</td>
                        </tr>
                        <tr>
                          <th><code>marked</code>

                          </th>
                          <td>12.0.0</td>
                          <td>13.0.2</td>
                        </tr>
                        <tr>
                          <th><code>sanitize-html</code>

                          </th>
                          <td>1.6.7</td>
                          <td>1.7.2</td>
                        </tr>
                        <tr>
                          <th><code>turndown</code>

                          </th>
                          <td>7.1.2</td>
                          <td>7.2.0</td>
                        </tr>
                        <tr>
                          <th><code>yauzl</code>

                          </th>
                          <td>3.1.2</td>
                          <td>3.1.3</td>
                        </tr>
                        <tr>
                          <th><code>express</code>

                          </th>
                          <td>4.18.3</td>
                          <td>4.19.2</td>
                        </tr>
                        <tr>
                          <th><code>express-rate-limit</code>

                          </th>
                          <td>7.2.0</td>
                          <td>7.3.1</td>
                        </tr>
                        <tr>
                          <th><code>jsdom</code>

                          </th>
                          <td>24.0.0</td>
                          <td>24.1.0</td>
                        </tr>
                        <tr>
                          <th><code>ws</code>

                          </th>
                          <td>8.16.0</td>
                          <td>8.18.0</td>
                        </tr>
                        <tr>
                          <th><code>ejs</code>

                          </th>
                          <td>3.1.9</td>
                          <td>3.1.10</td>
                        </tr>
                        <tr>
                          <th><code>dayjs</code>

                          </th>
                          <td>1.11.10</td>
                          <td>1.11.12</td>
                        </tr>
                        <tr>
                          <th><code>semver</code>

                          </th>
                          <td>7.6.0</td>
                          <td>7.6.3</td>
                        </tr>
                        <tr>
                          <th><code>async-mutex</code>

                          </th>
                          <td>0.4.1</td>
                          <td>0.5.0</td>
                        </tr>
                        <tr>
                          <th><code>https-proxy-agent</code>

                          </th>
                          <td>7.0.4</td>
                          <td>7.0.5</td>
                        </tr>
                        <tr>
                          <th><code>sax</code>

                          </th>
                          <td>1.3.0</td>
                          <td>1.4.1</td>
                        </tr>
                        <tr>
                          <th><code>ini</code>

                          </th>
                          <td>3.0.1</td>
                          <td>4.1.3</td>
                        </tr>
                        <tr>
                          <th><code>debounce</code>

                          </th>
                          <td>1.2.1</td>
                          <td>2.1.0</td>
                        </tr>
                      </tbody>
                    </table>
                  </figure>
                   <h2>✨ Technical improvements</h2>

                  <ul>
                    <li>Updated from Node 18.8.2 to 20.15.1.</li>
                    <li>Reduced the binary size (see <a href="https://github.com/TriliumNext/Notes/pull/252">#252</a>).</li>
                    <li>Removed redundant <code>open</code> dependency.</li>
                    <li>Updated internal tooling (<code>rimraf</code>, <code>webpack</code>, <code>nodemon</code>, <code>jsdoc</code>).</li>
                    <li>Updated TypeScript to latest.</li>
                  </ul>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: k2W21H08RXiGqx5W3GD3
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.561Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
              <div class="content">
                <div class="ck-content">
                  <p><strong>Note:</strong> This version is currently not meant for public use,
                    but for internal testing. The reason is that it might be quite unstable.
                    Nevertheless, feel free to test if you understand the risks.</p>
                   <h3>What's new compared to the latest version of Trilium Notes (0.63.7)?</h3>

                  <p>Theoretically, nothing. This version is based on Trilium Notes 0.63.7,
                    but it introduces a significant refactoring of the code: the server has
                    been ported from JavaScript to TypeScript.</p>
                  <p>To the end user, nothing should change, except that some things might
                    have been broken in the process.</p>
                  <p>For the first release of TriliumNext, we simply need to check if there
                    are any regressions by using it in day-to-day activities. Feel free to
                    <a href="https://github.com/TriliumNext/Notes/issues/new/choose">report any issues</a>.</p>
                   <h3>What do I need to do in order to start?</h3>

                  <p>For the desktop application, simply download it from the releases page
                    and extract it in a similar fashion to how the original Trilium Notes is
                    installed.</p>
                  <p>Regarding data, please note that <strong>TriliumNext Notes shares the same database as Trilium Notes.</strong> A
                    manual database backup is strongly encouraged:</p>
                  <ul>
                    <li>On Windows, open Windows Explorer and type <code>%appdata%</code> in the
                      address bar. Look for <code>trilium-data</code> and simply copy and paste
                      it.</li>
                    <li>On Linux, the data directory is in <code>~/.local/share/trilium-data</code>.</li>
                  </ul>
                  <p>Generally your existing notes should be quite safe (there are no database
                    migrations or API changes, only the consistency checks could have been
                    impacted), haven't noticed any issues when testing.</p>
                  <p>Additionally, since the sync version has not changed either, you should
                    be able to mix the client and the server between Trilium Notes and TriliumNext
                    Notes.</p>
                  <p>The server is also packaged and available in the release. For the Docker
                    build, the Docker image is built automatically and is available on GitHub's
                    Docker registry.</p>
                   <h3>Why v0.90.0</h3>

                  <p>The current release from <a href="https://github.com/zadam/trilium/releases/tag/v0.63.7">zadam/trilium</a> is
                    0.63.7.</p>
                  <p>If we reset the version number to 0.1, there are a few downsides:</p>
                  <ul>
                    <li>This might cause issues with migration and updates checking.</li>
                    <li>The fact that TriliumNext 0.1.0 is based off of Trilium 0.63.7 can be
                      rather confusing.</li>
                  </ul>
                  <p>At the same time we would not want to bump directly to the next version
                    as we would directly enter in conflict with future releases of Trilium.
                    As such, we are bumping it to 0.90 instead.</p>
                  <p> </p>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>


blobId: SebJ4hSYXe42m740RDbK
dateModified: 2025-03-09 12:10:59.391+0200
utcDateModified: 2025-03-09 10:10:59.566Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div class="content">
            <div class="ck-content">
               <h2>💡 Key highlights</h2>

              <ul>
                <li>…</li>
              </ul>
               <h2>🐞 Bugfixes</h2>

              <ul>
                <li>….</li>
              </ul>
               <h2>✨ Improvements</h2>

              <ul>
                <li>A highly experimental change in layout that may or may not be well received:
                  <ul>
                    <li>Promoted attributes are now always displayed, instead of being in the
                      ribbon.
                      <ul>
                        <li>They are placed in the scrollable area, so they will not take vertical
                          space when scrolling.</li>
                      </ul>
                    </li>
                    <li>The title was moved to the scrollable area as well.
                      <ul>
                        <li>The title is redundant when scrolling since it's visible in the tab (with
                          the exception of split pages where it's more difficult to tell which note,
                          but seems in line with other editors).</li>
                      </ul>
                    </li>
                    <li>The ribbon was moved from the top to the bottom.
                      <ul>
                        <li>This was done because since now the title is no longer scrollable, the
                          ribbon being placed <i>before</i> the title would look strange.</li>
                        <li>This also has the added benefit that the text no longer shifts downward
                          when a tab is selected.</li>
                        <li>Do note that there is a long-term plan to remove the ribbon entirely to
                          reduce the complexity of the UI.</li>
                      </ul>
                    </li>
                    <li>The idea is that Trilium's layout has grown old and it needs to be aligned
                      with the modern standards of note taking applications, by reducing clutter
                      and mental workload through simplicity.</li>
                  </ul>
                </li>
              </ul>
               <h2>🌍 Internationalization</h2>

              <ul>
                <li>…</li>
              </ul>
               <h2>⬆️ Library updates</h2>

              <ul>
                <li>…</li>
              </ul>
              <p> </p>
            </div>
          </div>
        </div>
      </div>


blobId: aHIQeO8zXCH6L8NJ98yZ
dateModified: 2025-03-09 12:14:48.793+0200
utcDateModified: 2025-03-09 10:14:48.793Z
content:
  <ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Integrate titles of the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Set <code>#shareAlias</code> for all the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Recreate structure of notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Add icons to the notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Merge images into their corresponding notes</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Review and delete each note from Pikapod</span></label></li></ul><h2>Content changes</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/poXkQfguuA0U">Desktop Installation</a></span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Mention Windows installation.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate Fedora documentation</span></label></li></ul></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/Hdf1kG6Kvcl1">Link map</a>&nbsp;– it's empty</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/QEAPj01N5f7w">Links</a>&nbsp;- extremely old GIFs.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Broken images</span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/fKYGY3OOo5d1">Canvas Note</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/l0tKav7yLHGF">Day Notes</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/aCE9SFyzUrod">Home</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/VbjZvtUek0Ln">Theme Gallery</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/9sRHySam5fXb">Workspace</a></span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description"><a class="reference-link" href="#root/krkLW8AwcYf2/iRwzGnHPzonm">Relation Map</a></span></label></li></ul></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Check for <code>%%{WARNING}%%.</code>.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate&nbsp;<a class="reference-link" href="#root/x1DxoyI27DXY/MGHZEjw7PAIZ">Syntax highlighting &amp; word wrapping for code blocks</a>&nbsp;into documentation.</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Document each note type</span></label><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Text</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Code</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Saved Search</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Relation Map</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Note Map</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Render Note</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Book</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Mermaid Diagram</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Canvas</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Web View</span></label></li><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Mind Map</span></label></li><li><label class="todo-list__label"><input type="checkbox" checked="checked" disabled="disabled"><span class="todo-list__label__description">Geo Map</span></label></li></ul></li></ul><h2>Generic improvements</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Add some promoted attributes for when the page was last reviewed.</span></label></li></ul><h2>Development improvements</h2><ul class="todo-list"><li><label class="todo-list__label"><input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Integrate <a href="https://trilium.rocks/xecUJ8eL3pvM">Trilium Rocks theme</a>.</span></label></li></ul>


blobId: PF7NugJzQQyzxFHgRvFN
dateModified: 2025-03-09 12:17:23.282+0200
utcDateModified: 2025-03-09 10:17:23.294Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Disallow adding child notes</h2>
          <ol>
            <li>To enforce at server level go to <code>services/notes.ts</code> and look
              for the <code>getAndValidateParent</code> method.  Look for the <code>params.ignoreForbiddenParents</code> if
              statement and add it there.</li>
            <li>To hide the plus button in the note tree, go to <code>widgets/note_tree</code> in
              the client and look for <code>enhanceTitle</code>. Look for the if statement
              which starts with <code>!["search", "launcher"].includes(note.type)</code>.</li>
            <li>To disable it from the contextual menu, go to <code>tree_context_menu</code> and
              look for the <code>getMenuItems</code> method. There look for the <code>insertNoteAfter</code> and <code>insertChildNote</code> actions
              and look at their <code>enabled</code> conditions. If adding a big note type
              with lots of child notes, see the pattern of optinos &amp; help (rename
              and augment the <code>notOptionsOrHelp</code> variable.</li>
          </ol>
        </div>
      </div>


blobId: mEHnIpAPCo6BpeKyoMdJ
dateModified: 2025-03-09 12:18:22.910+0200
utcDateModified: 2025-03-09 10:18:22.928Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p> </p>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Date</th>
                  <th>Server coverage (statements)</th>
                  <th>Client coverage (statements)</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td>2025-02-26 19:54</td>
                  <td>28.25%</td>
                  <td>0.5%</td>
                </tr>
                <tr>
                  <td>2025-02-26 20:34 (password-protected share API test)</td>
                  <td>39.47%</td>
                  <td> </td>
                </tr>
                <tr>
                  <td>2025-02-26 20:45 (excluding files)</td>
                  <td>41.33%</td>
                  <td> </td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: X7d0sVV9KBzRjDmSPHk0
dateModified: 2025-03-09 12:18:22.910+0200
utcDateModified: 2025-03-09 10:18:22.932Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Unit testing and integration testing</h2>
          <p>Using <code>vitest</code>, there are some unit and integration tests done
            for both the client and the server.</p>
          <p>These tests can be found by looking for the corresponding <code>.spec.ts</code> in
            the same directory as the source file.</p>
          <figure class="table">
            <table>
              <tbody>
                <tr>
                  <td>
                    <p>To run the server-side tests:</p><pre><code class="language-text-x-trilium-auto">npm run server:test</code></pre>
                    <p>To view the code coverage for the server:</p><pre><code class="language-text-x-trilium-auto">npm run server:coverage</code></pre>
                    <p>Afterwards, a friendly HTML report can be found in <code>/coverage/index.html</code>.</p>
                  </td>
                  <td>
                    <p>To run the client-side tests:</p><pre><code class="language-text-x-trilium-auto">npm run client:test</code></pre>
                    <p>To view the code coverage for the client:</p><pre><code class="language-text-x-trilium-auto">npm run client:coverage</code></pre>
                    <p>Afterwards, a friendly HTML report can be found in <code>/src/public/app/coverage/index.html</code>.</p>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
          <p>To run both client and server-side tests:</p><pre><code class="language-text-x-trilium-auto">npm run test</code></pre>
          <p>Note that some integration tests rely on an in-memory database in order
            to function. </p>
          <h3>REST API testing for the server</h3>
          <p>Some original work was done by Zadam in <code>/test-etapi</code>, using <code>.http</code> files.</p>
          <p>New effort using <code>vitest</code> and <code>supertest</code> to initialize
            the Express server and run assertions without having to make actual requests
            to the server.</p>
          <p>An important aspect is that we have access to the Express <code>app</code> which
            allows for interesting assertions such as checking the state of the server,
            registering debug middleware and so on.</p>
          <p>One example is <code>src/share/routes.spec.ts</code>.</p>
          <p>These integration tests are run alongside unit tests.</p>
          <h2>End-to-end testing</h2>
          <ul>
            <li>This tests both the client and the server, by running the server and then
              using Playwright to query the state of the page.</li>
            <li>These can be found in <code>/e2e</code>.</li>
          </ul>
        </div>
      </div>


blobId: lkBxJJIUSn8Z5Bdhve2E
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.668Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>In the past some libraries have been copy-pasted (and adapted if needed)
            to the repository. However, new libraries must be obtained exclusively
            through npm.</p>
          <p>The first step is to install the desired library. As an example we are
            going to install <code>i18next</code>:</p><pre><code class="language-text-plain">npm i i18next</code></pre>
          <h3>Step 1. Understanding the structure of the import</h3>
          <p>After installing the dependency, it's important to know how it's structured.
            You can do this by looking at the directory structure of the newly imported
            dependency:</p><pre><code class="language-text-plain">$ tree node_modules/i18next
  node_modules/i18next
  ├── dist
  │   ├── cjs
  │   │   └── i18next.js
  │   ├── esm
  │   │   ├── i18next.bundled.js
  │   │   ├── i18next.js
  │   │   └── package.json
  │   └── umd
  │       ├── i18next.js
  │       └── i18next.min.js
  ├── i18next.js
  ├── i18next.min.js
  ├── index.d.mts
  ├── index.d.ts
  ├── index.js
  ├── index.v4.d.ts
  ├── LICENSE
  ├── package.json
  ├── README.md
  └── typescript
      ├── helpers.d.ts
      ├── options.d.ts
      ├── t.d.ts
      └── t.v4.d.ts</code></pre>
          <p>Generally you should be looking for a <code>.min.js</code> file. Note that
            the <code>esm</code> and <code>cjs</code> variants generally don't work, we
            are looking for the classic, no module dependency.</p>
          <h3>Step 2. Exposing the library from the server</h3>
          <p>The library must be delivered by the server and this is done via <code>src/routes/assets.ts</code>.
            In the <code>register</code> function, add a new entry near the bottom of
            the function:</p><pre><code class="language-application-javascript-env-frontend">app.use(`/${assetPath}/node_modules/i18next/`, persistentCacheStatic(path.join(srcRoot, "..", 'node_modules/i18next/')));</code></pre>
          <h3>Step 3. Adding it to the library loader</h3>
          <p>The library loader is a client module which is in charge of downloading
            the library from the server and importing it. The loader is located in <code>src/public/app/services/library_loader.js</code>.</p>
          <p>To add a new library, start by creating a constant for it, with the value
            pointing to the minified JS identified at the first step:</p><pre><code class="language-application-javascript-env-frontend">const I18NEXT = {
      js: [
          "node_modules/i18next/i18next.min.js"
      ]
  };</code></pre>
          <p>Then add it to the <code>export default</code> section:</p><pre><code class="language-text-x-diff"> export default {
       requireCss,
       requireLibrary,
       CKEDITOR,
       CODE_MIRROR,
       ESLINT,
       RELATION_MAP,
       PRINT_THIS,
       CALENDAR_WIDGET,
       KATEX,
       WHEEL_ZOOM,
       FORCE_GRAPH,
       MERMAID,
       EXCALIDRAW,
  -    MARKJS
  +    MARKJS,
  +    I18NEXT
   }</code></pre>
          <h3>Step 4. Using the library</h3>
          <p>To import the library, simply use the following mechanism:</p><pre><code class="language-text-x-diff">import library_loader from "./library_loader.js";

  await library_loader.requireLibrary(library_loader.I18NEXT);</code></pre>
          <p>Make sure to replace <code>I18NEXT</code> with the library that was created
            at the previous steps.</p>
          <p>Note that because we are not using a module management mechanism such
            as ES Modules or Common.js modules, the <code>requireLibrary</code> method
            does not actually return anything.&nbsp;</p>
          <p>To benefit from the library, it must export on its own an object in <code>window</code>.</p>
          <p>In the case of <code>i18next</code>, it sets <code>window.i18next</code> and
            that can be used directly:</p><pre><code class="language-text-x-diff">i18next.init({});</code></pre>
          <h3>Step 5. Adding Electron support</h3>
          <p>For Electron, the <code>node_modules</code> are copied as a separate step
            by <code>bin/copy-dist.ts</code>.</p>
          <p>Scroll all the way down to the <code>nodeModulesFolder</code> and append
            an entry for the newly added libraries.</p>
        </div>
      </div>


blobId: yGV5gxIWllRVRaI0a6z0
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.673Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The current build scripts are a bit complicated and maintaining them is
            not easy.</p>
          <p><a href="https://www.electronforge.io/">Electron Forge</a> seems more mature
            and has a boatload of features, including Flatpak, snaps, Windows installers
            &amp; more.</p>
          <p>Have a look also at the <a href="https://www.electronforge.io/config/plugins">Plugins</a> section
            since there are quite a few interesting things there as well.</p>
          <p>Afterwards consider running a new round of&nbsp;<a class="reference-link"
            href="#root/GAP7blNiSoX3/ftdNqJtBT1RD">Reducing binary size</a>, especially
            taking into consideration removing of the unnecessary locales.</p>
        </div>
      </div>


blobId: 7usChgXEaeeA3nlUnjFi
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.677Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Development notes are published on <a href="https://triliumnext.github.io/Notes">triliumnext.github.io/Notes</a> by
            the CI using GitHub Pages.</p>
          <p>The GitHub Pages deployment works by taking the files from the Notes repository,
            in the <code>docs</code> directory.</p>
          <h2>How it works</h2>
          <p>There is a script that uses <code>wget</code> to download all the files
            from a share, that means:</p>
          <ol>
            <li>You must have a local instance of Trilium Notes server.</li>
            <li>You must have the documentation imported, up to date and shared.</li>
          </ol>
          <p>Note that currently the documentation source file is not distributed (the
            note export), until a way is found to automate this process. Contact <code>eliandoran</code> should
            you require to obtain a copy of the documentation.</p>
          <h2>Setting up <code>.env</code> file</h2>
          <p>Go to <code>bin/docs</code> and copy <code>.env.example</code> to <code>.env</code> and
            edit it:</p>
          <ol>
            <li>Change the <code>SHARE_PROTOCOL</code> to either <code>http</code> or <code>https</code> depending
              on your setup.</li>
            <li>Change <code>SHARE_HOST</code> to match the domain name or the URL to the
              host (without the protocol or any slashes).</li>
          </ol>
          <p>Generally <code>ROOT_NOTE_ID</code> should not be changed since the note
            ID must match if the files were imported correctly.</p>
          <h2>Triggering a build</h2>
          <p>Run:</p><pre><code class="language-text-plain">./bin/docs/prepare.sh</code></pre>
          <p>This will attempt to download all the notes from the share URL and put
            them in <code>docs</code>, rewritten for GitHub Pages.</p>
          <p>Commit the results and follow the normal development process to push them.</p>
        </div>
      </div>


blobId: 4YtotXZIGrJfyZpbBIkX
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.680Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>As always, install the dependencies for the first time (and re-run whenever
            there are errors about missing dependencies):</p><pre><code class="language-text-x-sh">npm install</code></pre>
          <h2>Run server</h2>
          <p>Run with default settings:</p><pre><code class="language-text-x-sh">npm run start-server</code></pre>
          <p>Run with custom port:</p><pre><code class="language-text-x-sh">TRILIUM_PORT=8082 npm run start-server</code></pre>
          <h2>Run Electron</h2>
          <p>Rebuild <code>better-sqlite3</code> dependency:</p><pre><code class="language-text-x-sh">npm run switch-electron</code></pre>
          <p>Then run Electron:</p><pre><code class="language-text-x-sh">npm run start-electron</code></pre>
          <p>To run Electron using the same data directory as the production version:</p><pre><code class="language-text-x-sh">npm run start-electron-no-dir</code></pre>
          <p>When done, switch back the <code>better-sqlite3</code> dependency:</p><pre><code class="language-text-x-sh">npm run switch-server</code></pre>
          <h2>Quick switch</h2>
          <p>To start Electron without running <code>switch-electron</code> first:</p><pre><code class="language-text-x-sh">npm run qstart-electron</code></pre>
          <p>Similarly, to start the server without running <code>switch-server</code> first:</p><pre><code class="language-text-x-sh">npm run qstart-server</code></pre>
          <h2>Safe mode</h2>
          <p>Safe mode is off by default, to enable it temporarily on a Unix shell,
            prepend the environment variable setting:</p><pre><code class="language-text-x-sh">TRILIUM_SAFE_MODE=1 npm run start-server</code></pre>
          <p>To have the same behaviour on Windows, we would need to alter <code>package.json</code>:</p><pre><code class="language-text-x-diff">-"start-electron": "npm run prepare-dist &amp;&amp; cross-env TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./dist/electron-main.js --inspect=5858 .",
  +"start-electron": "npm run prepare-dist &amp;&amp; cross-env TRILIUM_SAFE_MODE=1 TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./dist/electron-main.js --inspect=5858 .",</code></pre>
          <h2>Running on NixOS</h2>
          <p>When doing development, the Electron binary retrieved from NPM is not
            going to be compatible with NixOS, resulting in errors when trying to run
            it. To bypass this, there is a special command to run electron using <code>nix-shell</code>:</p><pre><code class="language-text-x-sh">npm run start-electron-nix</code></pre>
          <p>Similarly to the original command, to use the same data directory as the
            production version:</p><pre><code class="language-text-x-sh">npm run start-electron-no-dir-nix</code></pre>
        </div>
      </div>


blobId: 0nXbHuFBAhp3VokEAk4I
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.683Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>In the project root:</p>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Platform</th>
                  <th>Architecture</th>
                  <th>Application</th>
                  <th>Build command</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th rowspan="2">macOS</th>
                  <td>x86_64</td>
                  <td>Desktop / Electron app</td>
                  <td><code>./bin/build-mac-x64.sh</code>
                  </td>
                </tr>
                <tr>
                  <td>ARM 64</td>
                  <td>Desktop / Electron app</td>
                  <td><code>./bin/build-mac-arm64.sh</code>
                  </td>
                </tr>
                <tr>
                  <th rowspan="2">Linux</th>
                  <td rowspan="2">x86_64</td>
                  <td>Desktop / Electron app</td>
                  <td><code>./bin/build-linux-x64.sh</code>
                  </td>
                </tr>
                <tr>
                  <td>Server</td>
                  <td><code>./bin/build-server.sh</code>
                  </td>
                </tr>
                <tr>
                  <th>Windows</th>
                  <td>x86_64</td>
                  <td>Desktop / Electron app</td>
                  <td><code>./bin/build-win-x64.sh</code>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
          <p>Under NixOS the following <code>nix-shell</code> is needed:</p><pre><code class="language-text-plain">nix-shell -p jq</code></pre>
          <p>For Linux builds:</p><pre><code class="language-text-plain">nix-shell -p jq fakeroot dpkg</code></pre>
          <p>The resulting build will be in the <code>dist</code> directory under the
            project root.</p>
          <h3>Testing the Linux builds under NixOS</h3>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Desktop client</th>
                  <th>Server</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><pre><code class="language-text-plain">$ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
  [nix-shell] cd dist/trilium-linux-x64
  [nix-shell] steam-run ./trilium</code></pre>
                  </td>
                  <td><pre><code class="language-text-plain">$ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
  [nix-shell] cd dist/trilium-linux-x64-server
  [nix-shell] steam-run ./trilium.sh</code></pre>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: DcO20GdRYVjJYzSsUpeV
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.722Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>On NixOS:</p><pre><code class="language-text-plain">nix-shell -p dpkg fakeroot jq nodejs_20</code></pre>
          <p>Then simply run from project root:</p><pre><code class="language-text-plain">./bin/release.sh 1.2.3</code></pre>
          <p>where <code>1.2.3</code> is the desired release version.</p>
          <p>If a version ends with <code>-beta</code>, it will automatically be marked
            as pre-release in GitHub.</p>
          <p>This will automatically generate a release in GitHub if everything goes
            according to plan.</p>
          <p>Note that the Windows installer is not automatically uploaded yet, it
            has to be taken from the <a href="#root/q5aZp0hpSoeF">main workflow of the CI from the <code>develop</code> branch</a>.</p>
          <p>Make sure to check test the artifacts of the release.</p>
        </div>
      </div>


blobId: dDWDRo8Y7FscsZ0TTzn1
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.726Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The main workflow of the CI:</p>
          <ul>
            <li>Builds the Docker image and publishes in the GitHub Docker registry.</li>
            <li>Builds using a portion of the <a href="#root/5jt68zVszBwg">delivery script</a> artifacts
              for the following platforms:
              <ul>
                <li>Windows <code>x86_64</code> as .zip file</li>
                <li>Windows <code>x86_64</code> installer (using Squirrel)</li>
                <li>macOS <code>x86_64</code> and <code>aarch64</code>.</li>
                <li>Linux <code>x86_64</code>
                </li>
                <li>Linux server <code>x86_64</code>.</li>
              </ul>
            </li>
          </ul>
          <p>The main workflow of the CI runs on <code>develop</code> branches as well
            as any branch that starts with <code>feature/update_</code>.</p>
          <h2>Downloading the artifacts from the main branch</h2>
          <p>Simply go to the <a href="https://github.com/TriliumNext/Notes"><code>develop</code> branch on GitHub</a> and
            look at the commit bar:</p>
          <figure class="image">
            <img style="aspect-ratio:896/59;" src="api/attachments/urAF60E7bW1K/image/Main_image.png" width="896" height="59">
          </figure>
          <p>Press the green checkmark (or red cross if something went bad). Then look
            at the list of jobs and their status:</p>
          <figure class="image">
            <img style="aspect-ratio:616/445;" src="api/attachments/PWK1sVyZ9u8Z/image/1_Main_image.png" width="616"
            height="445">
          </figure>
          <p>Then look for any of the entires that starts with “Main” and press the
            “Details” link next to it. It doesn't really matter which platform you'll
            choose as the artifacts are available on the same page.</p>
          <p>&nbsp;</p>
        </div>
      </div>


blobId: VhjwgagZOtRAfSpt46Sr
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.736Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>&nbsp;</p>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:14.74%;">
                  <col style="width:10.69%;">
                    <col style="width:18.67%;">
                      <col style="width:24.71%;">
                        <col style="width:31.19%;">
              </colgroup>
              <thead>
                <tr>
                  <th>Dependency</th>
                  <th>Name in <code>library_loader</code>
                  </th>
                  <th>Things to check for a basic sanity check</th>
                  <th>&nbsp;</th>
                  <th>Protected by unit tests</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><code>better-sqlite3</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>See&nbsp;<a class="reference-link" href="#root/waLL76ZTUcgy">bettersqlite binaries</a>.</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>jsdom</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Note map</li>
                      <li>Clipper</li>
                      <li>Note similarity</li>
                    </ul>
                  </td>
                  <td>Protected by typings, should catch any potential changes in API.</td>
                  <td>Yes</td>
                </tr>
                <tr>
                  <td><code>async-mutex</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Sync</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>axios</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Can't be directly tested, as it's exposed only via the backend script
                        API.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>sax</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>EverNote imports</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>
                    <ul>
                      <li><code>ws</code>
                      </li>
                      <li><code>debounce</code>
                      </li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Check any action is reported from server to client (e.g. delete a note).</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>ejs</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Onboarding / first setup</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>dayjs</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Day notes</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>semver</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Application should start.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>https-proxy-agent</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>???</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>sax</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>EverNote import</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>ini</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Affects config, generally if the application starts then it should be
                        OK.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>jsplumb</code>
                  </td>
                  <td><code>RELATION_MAP</code>
                  </td>
                  <td>
                    <ul>
                      <li>Relation map note type</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>jquery.mark.es6</code>
                  </td>
                  <td><code>MARKJS</code>
                  </td>
                  <td>
                    <ul>
                      <li>In search, when highlighting the text that matched.</li>
                      <li>In search in HTML, which might not actually be used since it seems to
                        have been replaced by CKEditor's own find &amp; replace dialog.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>knockout.js</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Used in rendering the login and main layout of the application.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>normalize.min.css</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Used in shared notes.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>wheel-zoom.min.js</code>
                  </td>
                  <td><code>WHEEL_ZOOM</code>
                  </td>
                  <td>
                    <ul>
                      <li>When opening a image that is in attachment.</li>
                      <li>When opening a stand-alone image note.</li>
                      <li>When zooming in a mermaid chart.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>fancytree</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>The note tree should be fully functional.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>bootstrap</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Check mostly the on-boarding pages, when there is no database.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>electron-debug</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Run electron using <code>npm run start-electron</code> and check that the
                        debug hotkeys are still working (Ctrl+Shift+I on Windows/Linux, Cmd+Alt+I
                        for dev tools, Cmd/Ctrl+R for reload).</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>electron-dl</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>eslint</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td><code>marked</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Importing a markdown note.</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>Yes</td>
                </tr>
                <tr>
                  <td><code>force-graph</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>
                    <ul>
                      <li>Note map</li>
                    </ul>
                  </td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: WtBdRl8qHusdPrapwyeR
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.740Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h3>The native node bindings</h3>
          <p><code>better-sqlite3</code> has native Node bindings. With updates of <code>better-sqlite3</code>,
            but also of Electron and Node.js versions, these bindings need to be updated.</p>
          <p>Note that Electron and Node.js versions need different versions of these
            bindings, since Electron usually packs a different version of Node.js.</p>
          <p>During development, <code>npm install</code> tries to build or reuse prebuilt
            natives for the current Node.js version. This makes <code>npm run start-server</code> work
            out of the box. Trying to run <code>npm run start-electron</code> with these
            versions generally causes an error such as this:</p><pre><code class="language-text-plain">Uncaught Exception:
  Error: The module '/Users/elian/Projects/Notes/node_modules/better-sqlite3/build/Release/better_sqlite3.node'
  was compiled against a different Node.js version using
  NODE_MODULE_VERSION 108. This version of Node.js requires
  NODE_MODULE_VERSION 116. Please try re-compiling or re-installing
  the module (for instance, using `npm rebuild` or `npm install`).</code></pre>
          <h3>How the natives are handled</h3>
          <p>Locally, this can be fixed by rebuilding the binaries, which is what <code>npm run switch-electron</code> does,
            which uses <code>electron-rebuild</code> under the hood.</p>
          <p>When the deliveries are built (see&nbsp;<a class="reference-link" href="#root/5jt68zVszBwg">Build deliveries locally</a>),
            it is not feasible to rebuild the dependencies since we are building for
            multiple platforms. Luckily, <code>better-sqlite3</code> provides these prebuilt
            binaries from us, available as artifacts on <a href="https://github.com/WiseLibs/better-sqlite3/releases/">their GitHub releases page</a>.&nbsp;</p>
          <p>The build script manages the natives for <code>better-sqlite3</code> by
            keeping a copy of the <code>.node</code> file for every platform in <code>bin/better-sqlite3</code>.</p>
          <p>Whenever the version of <code>better-sqlite3</code> changes, the <code>.node</code> files
            must also be renewed based on their releases page. To simplify this process,
            a script was created in <code>bin/better-sqlite3/update.sh</code>.</p>
          <h2>How to update the natives</h2>
          <p>The update script needs to know the version of Electron or Node.js for
            which to download the prebuilt binaries.</p>
          <p>If you get errors during download, check on the <a href="https://github.com/WiseLibs/better-sqlite3/releases/">releases page</a> to
            ensure that this particular combination of Electron/Node actually exists
            for the given release.</p>
          <p>To determine the <code>NODE_MODULE_VERSION</code> that is required, look
            for <code>This version of Node.js requires</code>
            <br><code>NODE_MODULE_VERSION</code> in the error when starting Trilium via:</p>
          <ul>
            <li><code>npm run start-electron</code> (or run any Electron <a href="#root/5jt68zVszBwg">delivery</a>),
              case in which the <span style="color:#c0bfbc;"><code>ELECTRON_VERSION</code> variable needs to be changed.</span>
            </li>
            <li><span style="color:#c0bfbc;"><code>npm run start-server</code></span> (or
              run the Linux server delivery), case in which the <code>NODE_VERSION</code> variable
              needs to be changed.</li>
          </ul>
          <p>Check which files got changed after running the update script and for
            each platform that got changed, test it locally via&nbsp;<a class="reference-link"
            href="#root/5jt68zVszBwg">Build deliveries locally</a>&nbsp;or
            via the CI.</p>
        </div>
      </div>


blobId: XVbfnA5npe7284x1ix36
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.743Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p><code>better-sqlite3</code> requires a native module in order to work.
            In order to ease the installation process, prebuilt binaries are provided
            by the library developers.</p>
          <p>Trilium Next started with version <a href="https://github.com/WiseLibs/better-sqlite3/releases/tag/v8.4.0">8.4.0</a> for <code>better-sqlite3</code>
          </p>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:30.24%;">
                  <col style="width:18.47%;">
                    <col style="width:26.73%;">
                      <col style="width:24.56%;">
              </colgroup>
              <tbody>
                <tr>
                  <td><code>better-sqlite3</code> version</td>
                  <td>SQLite version</td>
                  <td>Node.js prebuilds</td>
                  <td>Electron.js prebuilds</td>
                </tr>
                <tr>
                  <td>8.4.0</td>
                  <td rowspan="4">&lt;3.43.0</td>
                  <td>v20</td>
                  <td>???</td>
                </tr>
                <tr>
                  <td>8.5.0</td>
                  <td>v20</td>
                  <td>v25</td>
                </tr>
                <tr>
                  <td>8.5.1</td>
                  <td>&nbsp;</td>
                  <td rowspan="4">v26</td>
                </tr>
                <tr>
                  <td>8.5.2</td>
                  <td>v20 (macOS + arm64)</td>
                </tr>
                <tr>
                  <td>8.6.0</td>
                  <td>3.43.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>8.7.0</td>
                  <td>3.43.1</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.0.0</td>
                  <td>3.43.2</td>
                  <td>&nbsp;</td>
                  <td rowspan="4">v27</td>
                </tr>
                <tr>
                  <td>9.1.0</td>
                  <td rowspan="2">3.44.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.1.1</td>
                  <td>macOS + Alpine</td>
                </tr>
                <tr>
                  <td>9.2.0</td>
                  <td rowspan="2">3.44.2</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.2.1 / 9.2.2</td>
                  <td>&nbsp;</td>
                  <td rowspan="4">v28</td>
                </tr>
                <tr>
                  <td>9.3.0</td>
                  <td>3.45.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.4.0</td>
                  <td rowspan="6">3.45.1</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.4.1</td>
                  <td>Windows arm, arm64</td>
                </tr>
                <tr>
                  <td>9.4.2</td>
                  <td>&nbsp;</td>
                  <td>&lt;v29</td>
                </tr>
                <tr>
                  <td>9.4.3</td>
                  <td>&nbsp;</td>
                  <td>&lt;v29</td>
                </tr>
                <tr>
                  <td>9.4.4</td>
                  <td>&nbsp;</td>
                  <td rowspan="3">v29</td>
                </tr>
                <tr>
                  <td>9.4.5</td>
                  <td>Better prebuilds</td>
                </tr>
                <tr>
                  <td>9.5.0</td>
                  <td>3.45.2</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.6.0</td>
                  <td rowspan="2">3.45.3</td>
                  <td>&nbsp;</td>
                  <td rowspan="4">v30</td>
                </tr>
                <tr>
                  <td>10.0.0</td>
                  <td>v22</td>
                </tr>
                <tr>
                  <td>10.1.0</td>
                  <td rowspan="2">3.46.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>11.0.0</td>
                  <td>&gt;21</td>
                </tr>
                <tr>
                  <td>11.1.0 (prerelease)</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                  <td rowspan="3">v31</td>
                </tr>
                <tr>
                  <td>11.1.1</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>11.1.2</td>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: CO8hr6Zik4LXpnKkQY0v
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.745Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:45.3%;">
                  <col style="width:16.83%;">
                    <col style="width:37.87%;">
              </colgroup>
              <thead>
                <tr>
                  <th><code>better-sqlite3</code> version
                    <br><a href="https://github.com/WiseLibs/better-sqlite3/releases">Change log</a>
                  </th>
                  <th>SQLite version
                    <br><a href="https://www.sqlite.org/changes.html">Change log</a>
                  </th>
                  <th>Compatibility with upstream Trilium</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td>8.4.0</td>
                  <td>&lt;3.43.0</td>
                  <td>Compatible, same version.</td>
                </tr>
                <tr>
                  <td>8.6.0</td>
                  <td>3.43.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>8.7.0</td>
                  <td>3.43.1</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.0.0</td>
                  <td>3.43.2</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.1.0 + 9.1.1</td>
                  <td>3.44.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.2.0 + 9.2.1 + 9.2.2</td>
                  <td>3.44.2</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.3.0</td>
                  <td>3.45.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.4.0, 9.4.1, 9.4.2, 9.4.3, 9.4.4, 9.4.5</td>
                  <td>3.45.1</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.5.0</td>
                  <td>3.45.2</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>9.6.0 / 10.0.0</td>
                  <td>3.45.3</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>10.1.0 / 11.0.0 / 11.1.1 / 11.1.2 / 11.2.0 / 11.2.1</td>
                  <td>3.46.0</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>11.3.0</td>
                  <td>3.46.1</td>
                  <td>&nbsp;</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: ksfJajnHIe57wBT9C9UA
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.751Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>During the initial development of Trilium Notes, internationalisation
            was not considered as it was meant to be an English-only product.</p>
          <p>As the application and the user base grows, it makes sense to be able
            to reach out as many people as possible by providing translations in their
            native language.</p>
          <p>The library used is <a href="https://www.i18next.com/">i18next</a>.</p>
          <h2>Where are the translations?</h2>
          <p>The translations are formatted as JSON files and they are located in <code>src/public/translations</code>.
            For every supported locale, there is a subdirectory in which there is a <code>translation.json</code> file
            (e.g. <code>src/public/translations/en/translation.json</code>).</p>
          <h3>Message keys</h3>
          <p>One important aspect is the fact that we are using a key-based approach.
            This means that each message is identified by an ID rather than a natural-language
            message (such as the default approach in gettext).</p>
          <p>The key-based approach allows a hierarchical structure. For example, a
            key of <code>about.title</code> would be added in <code>translation.json</code> as
            follows:</p><pre><code class="language-application-json">{
  	"about": {
  		"title": "About TriliumNext Notes"
  	}
  } </code></pre>
          <p>Follow the&nbsp;<a class="reference-link" href="#root/jmdNDjhIzbIx">Guidelines</a>&nbsp;when
            creating a new message.</p>
          <h3>Adding a new locale</h3>
          <p>To add a new locale, go to <code>src/public/translations</code> with your
            favorite text editor and copy the <code>en</code> directory.</p>
          <p>Rename the copy to the ISO code (e.g. <code>fr</code>, <code>ro</code>)
            of the language being translated.</p>
          <p>Translations with a country-language combination, using their corresponding
            ISO code (e.g. <code>fr_FR</code>, <code>fr_BE</code>), has not been tested
            yet.</p>
          <h3>Changing the language</h3>
          <p>Since the internationalisation process is in its early stages, there is
            no user-facing way to switch the language.</p>
          <p>To change the language manually, edit <code>src/public/app/services/i18n.js</code> and
            look for the line containing <code>lng: "en"</code>. Replace <code>en</code> with
            the desired language code (from the ones available in <code>src/public/translations</code>).</p>
          <h2>Client-side translations</h2>
          <h3>Component-level translations</h3>
          <p>Most of the client translations are present in the various widgets and
            layouts.</p>
          <p>Translation support has to be added manually for every file.</p>
          <p>The first step is to add the translation import with a relative import.
            For example, if we are in the <code>src/public/app/widgets/dialogs</code> directory,
            the import would look as follows:</p><pre><code class="language-application-javascript-env-frontend">import { t } from "../../services/i18n.js";</code></pre>
          <p>Afterwards, simply replace the hard-coded message with:</p><pre><code class="language-application-javascript-env-frontend">${t("msgid")}</code></pre>
          <p>where <code>msgid</code> is the key of the message being translated.</p>
          <h3>Variables</h3>
          <p>In the translation, enclose the variables with <code>{{</code> and <code>}}</code>:</p><pre><code class="language-text-plain">{
      "key": "{{what}} is {{how}}"
  }</code></pre>
          <p>Then pass the arguments when reading the translation:</p><pre><code class="language-text-plain">t('key', { what: 'i18next', how: 'great' })</code></pre>
          <h3>Template-level translations</h3>
          <p>Templates are <code>.ejs</code> files present in <code>src/views</code>,
            these are used to prepare the root layout for desktop, mobile applications
            as well as setup (onboarding) and the shared notes view.</p>
          <p>Due to using a different approach, it is not possible yet to translate
            those files.</p>
          <h2>Server-side translations</h2>
          <p>Currently the server-side messages are not translatable. They will be
            added as a separate step.</p>
          <h2>Locale/language selection</h2>
          <p>The language is stored as an option which is synchronized across all devices
            and the user is able to adjust it via Options → Appearance → Locale.</p>
          <p>The options shown to the user are currently hard-coded in <code>src/routes/api/options.ts</code>,
            where there is a <code>getSupportedLocales()</code> function. The <code>id</code> field
            must match the corresponding directory in <code>src/public/translations</code> and
            the <code>name</code> must be the localized name of the language (so the
            name must be in that language, not in English).</p>
        </div>
      </div>


blobId: DY9TLDIcq23PHU8BTGOJ
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.753Z
content:
  <div class="content">
         

        <div class="ck-content">
          <ul>
            <li>Use hierarchy whenever appropriate, try to group the messages by:
              <ul>
                <li>Modals (e.g. <code>about.foo</code>, <code>jump_to_note.foo</code>)</li>
              </ul>
            </li>
            <li>Don't duplicate messages that are very widely used.
              <ul>
                <li>One such example is <code>aria-label="Close"</code> which should go to a
                  single message such as <code>modal.close</code> instead of being duplicated
                  in every modal.</li>
              </ul>
            </li>
            <li>On the other hand, don't overly generalise messages. A <code>close</code> message
              that is used whenever the “Close” word is encountered is not a good approach
              since it can potentially cause issues due to lack of context.</li>
            <li>Use <a href="https://www.i18next.com/translation-function/interpolation">variable interpolation</a> whenever
              appropriate.
              <ul>
                <li>If you see multiple messages joined together only to apply add a variable
                  such as a user-inputted value, try to join those messages together into
                  a single message containing a variable.</li>
                <li>So instead of <code>“Number of updates: “ + numUpdates + “.”</code> use <code>$(t("number_updates", { numUpdates }))</code> where
                  the message translation would appear as <code>Number of updates: {{numUpdates}}.</code>
                </li>
              </ul>
            </li>
          </ul>
        </div>
      </div>


blobId: BV960M5pex2TXr6hOHEi
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.756Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p><a href="https://github.com/lokalise/i18n-ally"><code>i18n-ally</code></a> is
            a VS Code extension that aids in internationalization.</p>
          <p>It is currently integrated in the project and offers features such as:</p>
          <ul>
            <li>Highlight, autocomplete translations.</li>
            <li>Display translations inline.</li>
            <li>Extract messages into translation.</li>
          </ul>
          <h3>Extracting messages into translation</h3>
          <ol>
            <li>Open any .js file and select an untranslated string inside a template
              (<code>TPL</code>).</li>
            <li>Press Ctrl+P and look for “i18n Ally: Extract text into i18n messages”</li>
            <li>Select the first template.</li>
            <li>Select the path of translation, taking into consideration the&nbsp;
              <a
              class="reference-link" href="#root/jmdNDjhIzbIx">Guidelines</a>&nbsp;(e.g. <code>jump_to_note.search-for-note-by-its-name</code>).</li>
          </ol>
        </div>
      </div>


blobId: ev5eDgV5MSEjRTwoGmLk
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.759Z
content:
  <div class="content">
         

        <div class="ck-content">
          <ul>
            <li>Server-side translations are managed by the same library as the client,
              i18next.</li>
            <li>The translation files reside in the <code>/translations</code> directory,
              following the same convention as the client (<code>translations/{{lng}}/{{ns}}.json</code>),
              where the namespace is <code>server.json</code>. So for the Spanish translations
              we have <code>translations/es/server.json</code>.</li>
            <li>Loading of translations is managed by <a href="https://github.com/i18next/i18next-fs-backend">i18next-fs-backend</a> which
              loads the translations directly from the file system (unlike HTTP requests
              like the client), at the path mentioned previously (relative to <code>package.json</code>).</li>
          </ul>
          <h2>How to translate a string</h2>
          <p>Unlike the client which uses a dedicated client service, the i18next library
            on the server is used directly, as such:</p><pre><code class="language-application-javascript-env-frontend">import { t } from "i18next";

  const translatedString = t("message.id");</code></pre>
          <h2>What should be translated</h2>
          <ul>
            <li>Avoid translating server-side logs, as those are supposed to be for debugging
              and as such there is no benefit in translating them.</li>
            <li>Translate any user-facing message that comes from the server, such as
              error messages shown in the Electron application, or information such as
              keyboard shortcuts, note titles, etc.</li>
          </ul>
        </div>
      </div>


blobId: 4mS2juYTP6u8jvG5GnB3
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.761Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Server live reload</h2>
          <p>If running the server using <code>npm run start-server</code>, the server
            will watch for changes in <code>src/public</code> and trigger a frontend
            reload if that occurs.</p>
          <h2>Electron live reload</h2>
          <p>Similarly, <code>npm run start-electron</code> supports live refresh &nbsp;as
            well.</p>
          <p>However, a core difference is that Electron watches <code>dist/src/public</code> instead
            of <code>src/public</code> since Electron runs on its own copy of the files.</p>
          <p>To ameliorate that, a separate watch script has been implemented which
            automatically copies files from <code>src/public</code> to <code>dist/src/public</code> whenever
            a change is detected. To run it:</p><pre><code class="language-text-plain">npm run </code></pre>
          <h2>Technical details</h2>
          <ul>
            <li>This mechanism is managed at server level by watching for changes in<code>services/ws.ts</code>.</li>
          </ul>
        </div>
      </div>


blobId: 8XKJ0OwpnCbjNXKIDLaP
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.763Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Server-side</h2>
          <ul>
            <li>There are three themes embedded in the application:
              <ul>
                <li><code>light</code>, located in <code>src\public\stylesheets\theme-light.css</code>
                </li>
                <li><code>dark</code>, located in <code>src\public\stylesheets\theme-dark.css</code>
                </li>
                <li><code>next</code>, located in <code>src\public\stylesheets\theme-next.css</code>.</li>
              </ul>
            </li>
            <li>The default theme is set only once, when the database is created and is
              managed by <code>options_init#initNotSyncedOptions</code>.
              <ul>
                <li>In the original implementation: On Electron, the choice between <code>light</code> and <code>dark</code> is
                  done based on the OS preference. Otherwise, the theme is always <code>dark</code>.</li>
                <li>Now, we always choose <code>next</code> as the default theme.</li>
              </ul>
            </li>
            <li>The theme is served via <code>src\routes\index.ts</code>, in the <code>getThemeCssUrl</code> method.</li>
          </ul>
          <h2>Client-side</h2>
          <ul>
            <li>The predefined themes are hard-coded in the client in <code>src\public\app\widgets\type_widgets\options\appearance\theme.js</code>.</li>
            <li>The user-defined themes are obtained via a call to the server: <code>options/user-themes</code>.</li>
            <li>The theme retrieval is done via a request.</li>
          </ul>
        </div>
      </div>


blobId: X49BYQmVGMry9Vms4n4b
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.767Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Entity hashing is done in <code>content_hash#getEntityHashes</code>.</p>
          <ul>
            <li>It works by looking at the <code>entity_changes</code> table and going through
              each of the entity names/types:
              <ul>
                <li><code>blobs</code>
                </li>
                <li><code>attributes</code>
                </li>
                <li><code>revisions</code>
                </li>
                <li><code>attachments</code>
                </li>
                <li><code>notes</code>
                </li>
                <li><code>branches</code>
                </li>
                <li><code>etapi_tokens</code>
                </li>
                <li><code>options</code>
                </li>
              </ul>
            </li>
            <li>For some reason <code>note_reordering</code> entities are ignored specifically.</li>
            <li>All the rows in <code>entity_changes</code> are then ordered alphabetically,
              based on their <code>entityId</code>.</li>
            <li>Every entity row is then grouped by <code>entityName</code> and then by
              sector. The sector is defined as the first character of the <code>id</code>.</li>
            <li>The hash is altered to add the <code>isErased</code> value as well since
              the hash of deleted entries is not updated.</li>
            <li>For each sector, the hash is calculated using <code>utils.hash</code>,
              using SHA1 encoded as Base64.</li>
          </ul>
        </div>
      </div>


blobId: 1BedfcvvJ4ZoaZ8lGNzG
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.770Z
content:
  <div class="content">
         

        <div class="ck-content">
          <ul>
            <li>Provides context about when the build was made and the corresponding Git
              revision.</li>
            <li>The information is displayed to the client when going in the about dialog.</li>
            <li>The build information is hard-coded in <code>src/services/build.ts</code>.
              This file is generated automatically via <code>npm run update-build-info</code> which
              itself is run automatically whenever making a build in the CI, or a <a href="#root/5jt68zVszBwg">local delivery</a>.</li>
          </ul>
        </div>
      </div>


blobId: BhwuNrgG8nIkowIr2dFl
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.775Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:21.13%;">
                  <col style="width:8.03%;">
                    <col style="width:7.85%;">
                      <col style="width:9.86%;">
                        <col style="width:53.13%;">
              </colgroup>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>attachmentId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Unique ID (e.g. <code>qhC1vzU4nwSE</code>)</td>
                </tr>
                <tr>
                  <th><code>ownerId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The unique ID of a row in&nbsp;<a class="reference-link" href="#root/IGBPgB2RHETG">notes</a>.</td>
                </tr>
                <tr>
                  <th><code>role</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The role of the attachment: <code>image</code> for images that are attached
                    to a note.</td>
                </tr>
                <tr>
                  <th><code>mime</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The MIME type of the attachment (e.g. <code>image/png</code>)</td>
                </tr>
                <tr>
                  <th><code>title</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The title of the attachment.</td>
                </tr>
                <tr>
                  <th><code>isProtected</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td><code>1</code> if the entity is <a href="#root/Dg4uPB2H4fOz">protected</a>, <code>0</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>position</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td>Not sure where the position is relevant for attachments (saw it with values
                    of 10 and 0).</td>
                </tr>
                <tr>
                  <th><code>blobId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>The corresponding <code>blobId</code> from the&nbsp;<a class="reference-link"
                    href="#root/ju37hnZip2p5">blobs</a>&nbsp;table.</td>
                </tr>
                <tr>
                  <th><code>dateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Localized modification date (e.g. <code>2023-11-08 18:43:44.204+0200</code>)</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>utcDateScheduledForErasure</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <th><code>isDeleted</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td><code>1</code> if the entity is <a href="#root/6HX57T5uKCPC">deleted</a>, <code>0</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>deleteId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>&nbsp;</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: KyplH3HACPrqRNhEJsrQ
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.777Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>attributeId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Unique Id of the attribute (e.g. <code>qhC1vzU4nwSE</code>), can also have
                    a special unique ID for&nbsp;<a class="reference-link" href="#root/NnChTzAIFTCX">Special notes</a>&nbsp;(e.g. <code>_lbToday_liconClass</code>).</td>
                </tr>
                <tr>
                  <th><code>noteId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The ID of the <a href="#root/IGBPgB2RHETG">note</a> this atttribute belongs to</td>
                </tr>
                <tr>
                  <th><code>type</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The type of attribute (<code>label</code> or <code>relation</code>).</td>
                </tr>
                <tr>
                  <th><code>name</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The name/key of the attribute.</td>
                </tr>
                <tr>
                  <th><code>value</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td><code>""</code>
                  </td>
                  <td>
                    <ul>
                      <li>For <code>label</code> attributes, a free-form value of the attribute.</li>
                      <li>For <code>relation</code> attributes, the ID of the <a href="#root/IGBPgB2RHETG">note</a> the
                        relation is pointing to.</li>
                    </ul>
                  </td>
                </tr>
                <tr>
                  <th><code>position</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td>The position of the attribute compared to the other attributes. Some predefined
                    attributes such as <code>originalFileName</code> have a value of 1000.</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>isDeleted</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td><code>1</code> if the entity is <a href="#root/6HX57T5uKCPC">deleted</a>, <code>0</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>deleteId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <th><code>isInheritable</code>
                  </th>
                  <td>Integer</td>
                  <td>Nullable</td>
                  <td>0</td>
                  <td>&nbsp;</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: Tjnhbw8oqquPMwhbjgV9
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.780Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>blobId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The unique ID of the blob (e.g. <code>XXbfAJXqWrYnSXcelLFA</code>).</td>
                </tr>
                <tr>
                  <th><code>content</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>
                    <p>The content of the blob, can be either:</p>
                    <ul>
                      <li>text (for plain text notes or HTML notes).</li>
                      <li>binary (for images and other types of attachments)</li>
                    </ul>
                  </td>
                </tr>
                <tr>
                  <th><code>dateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Localized modification date (e.g. <code>2023-11-08 18:43:44.204+0200</code>)</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: o0npGwTkKNWPM8Bs47q8
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.782Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>branchId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The ID of the branch, in the form of <code>a_b</code> where <code>a</code> is
                    the <code>parentNoteId</code> and <code>b</code> is the <code>noteId</code>.</td>
                </tr>
                <tr>
                  <th><code>noteId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The ID of the <a href="#root/IGBPgB2RHETG">note</a>.</td>
                </tr>
                <tr>
                  <th><code>parentNoteId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The ID of the parent <a href="#root/IGBPgB2RHETG">note</a> the note belongs to.</td>
                </tr>
                <tr>
                  <th><code>notePosition</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The position of the branch within the same level of hierarchy, the value
                    is usually a multiple of 10.</td>
                </tr>
                <tr>
                  <th><code>prefix</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>The <a href="#root/XYuZNL1Z3eao">branch prefix</a> if any, or <code>NULL</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>isExpanded</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td>Whether the branch should appear expanded (its children shown) to the
                    user.</td>
                </tr>
                <tr>
                  <th><code>isDeleted</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td><code>1</code> if the entity is <a href="#root/6HX57T5uKCPC">deleted</a>, <code>0</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>deleteId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: oyk3tZy9idvVMHsIEt98
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.786Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>id</code>
                  </th>
                  <td>Integer</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>A sequential numeric index of the entity change.</td>
                </tr>
                <tr>
                  <th><code>entityName</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>The type of entity being changed (<code>attributes</code>, <code>branches</code>, <code>note_reordering</code>,
                    etc.)</td>
                </tr>
                <tr>
                  <th><code>entityId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>The ID of the entity being changed.</td>
                </tr>
                <tr>
                  <th><code>hash</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>TODO: Describe how the hash is calculated</td>
                </tr>
                <tr>
                  <th><code>isErased</code>
                  </th>
                  <td>Integer</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>TODO: What does this do?</td>
                </tr>
                <tr>
                  <th><code>changeId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>TODO: What does this do?</td>
                </tr>
                <tr>
                  <th><code>componentId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>TODO: What does this do?</td>
                </tr>
                <tr>
                  <th><code>instanceId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>TODO: What does this do?</td>
                </tr>
                <tr>
                  <th><code>isSynced</code>
                  </th>
                  <td>Integer</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>TODO: What does this do?</td>
                </tr>
                <tr>
                  <th><code>utcDateChanged</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td>&nbsp;</td>
                  <td>Date of the entity change in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: GJxcIAoDiOt1tDAMobD8
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.789Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>etapiTokenId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>A unique ID of the token (e.g. <code>aHmLr5BywvfJ</code>).</td>
                </tr>
                <tr>
                  <th><code>name</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The name of the token, as is set by the user.</td>
                </tr>
                <tr>
                  <th><code>tokenHash</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The token itself.</td>
                </tr>
                <tr>
                  <th><code>utcDateCreated</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Creation date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>isDeleted</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td><code>1</code> if the entity is <a href="#root/6HX57T5uKCPC">deleted</a>, <code>0</code> otherwise.</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: Tii526VieHKeyTwoqtsH
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.793Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>noteId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The unique ID of the note (e.g. <code>2LJrKqIhr0Pe</code>).</td>
                </tr>
                <tr>
                  <th><code>title</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td><code>"note"</code>
                  </td>
                  <td>The title of the note, as defined by the user.</td>
                </tr>
                <tr>
                  <th><code>isProtected</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td><code>1</code> if the entity is <a href="#root/Dg4uPB2H4fOz">protected</a>, <code>0</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>type</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td><code>"text"</code>
                  </td>
                  <td>The type of note (i.e. <code>text</code>, <code>file</code>, <code>code</code>, <code>relationMap</code>, <code>mermaid</code>, <code>canvas</code>).</td>
                </tr>
                <tr>
                  <th><code>mime</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td><code>"text/html"</code>
                  </td>
                  <td>The MIME type of the note (e.g. <code>text/html</code>).. Note that it
                    can be an empty string in some circumstances, but not null.</td>
                </tr>
                <tr>
                  <th><code>isDeleted</code>
                  </th>
                  <td>Integer</td>
                  <td>Nullable</td>
                  <td>0</td>
                  <td><code>1</code> if the entity is <a href="#root/6HX57T5uKCPC">deleted</a>, <code>0</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>deleteId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td><code>null</code>
                  </td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <th><code>dateCreated</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Localized creation date (e.g. <code>2023-11-08 18:43:44.204+0200</code>)</td>
                </tr>
                <tr>
                  <th><code>dateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Localized modification date (e.g. <code>2023-11-08 18:43:44.204+0200</code>)</td>
                </tr>
                <tr>
                  <th><code>utcDateCreated</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Creation date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>blobId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>The corresponding ID from&nbsp;<a class="reference-link" href="#root/ju37hnZip2p5">blobs</a>.
                    Although it can theoretically be <code>NULL</code>, haven't found any such
                    note yet.</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: cS0DQAI7YN8DfN9jkpEi
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.797Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>name</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The name of option (e.g. <code>maxContentWidth</code>)</td>
                </tr>
                <tr>
                  <th><code>value</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The value of the option.</td>
                </tr>
                <tr>
                  <th><code>isSynced</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td><code>0</code> if the option is not synchronized and thus can differ between
                    clients, <code>1</code> if the option is synchronized.</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: nLEN5DgUqMs4eHWiVWAl
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.800Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>noteId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Unique ID of the note (e.g. <code>yRRTLlqTbGoZ</code>).</td>
                </tr>
                <tr>
                  <th><code>notePath</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The path (IDs) to the <a href="#root/IGBPgB2RHETG">note</a> from root to the note
                    itself, separated by slashes.</td>
                </tr>
                <tr>
                  <th><code>utcDateCreated</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Creation date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: PGDnJXQKiljnasvTsTNF
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.805Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Column Name</th>
                  <th>Data Type</th>
                  <th>Nullity</th>
                  <th>Default value</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th><code>revisionId</code>
                  </th>
                  <td>TextText</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Unique ID of the revision (e.g. <code>0GjgUqnEudI8</code>).</td>
                </tr>
                <tr>
                  <th><code>noteId</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>ID of the <a href="#root/IGBPgB2RHETG">note</a> this revision belongs to.</td>
                </tr>
                <tr>
                  <th><code>type</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td><code>""</code>
                  </td>
                  <td>The type of note (i.e. <code>text</code>, <code>file</code>, <code>code</code>, <code>relationMap</code>, <code>mermaid</code>, <code>canvas</code>).</td>
                </tr>
                <tr>
                  <th><code>mime</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td><code>""</code>
                  </td>
                  <td>The MIME type of the note (e.g. <code>text/html</code>).</td>
                </tr>
                <tr>
                  <th><code>title</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>The title of the note, as defined by the user.</td>
                </tr>
                <tr>
                  <th><code>isProtected</code>
                  </th>
                  <td>Integer</td>
                  <td>Non-null</td>
                  <td>0</td>
                  <td><code>1</code> if the entity is <a href="#root/Dg4uPB2H4fOz">protected</a>, <code>0</code> otherwise.</td>
                </tr>
                <tr>
                  <th><code>blobId</code>
                  </th>
                  <td>Text</td>
                  <td>Nullable</td>
                  <td><code>null</code>
                  </td>
                  <td>The corresponding ID from&nbsp;<a class="reference-link" href="#root/ju37hnZip2p5">blobs</a>.
                    Although it can theoretically be <code>NULL</code>, haven't found any such
                    note yet.</td>
                </tr>
                <tr>
                  <th><code>utcDateLastEdited</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td><strong>Not sure how it differs from modification date.</strong>
                  </td>
                </tr>
                <tr>
                  <th><code>utcDateCreated</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Creation date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>utcDateModified</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Modification date in UTC format (e.g. <code>2023-11-08 16:43:44.204Z</code>)</td>
                </tr>
                <tr>
                  <th><code>dateLastEdited</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td><strong>Not sure how it differs from modification date.</strong>
                  </td>
                </tr>
                <tr>
                  <th><code>dateCreated</code>
                  </th>
                  <td>Text</td>
                  <td>Non-null</td>
                  <td>&nbsp;</td>
                  <td>Localized creatino date (e.g. <code>2023-08-12 15:10:04.045+0300</code>)</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: UHg7IN1jYJ1tsVYLN7E6
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.809Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The following entities can be made protected, via their <code>isProtected</code> flag:</p>
          <ul>
            <li><a class="reference-link" href="#root/duw4MXvDJMWD">attachments</a>
            </li>
            <li><a class="reference-link" href="#root/IGBPgB2RHETG">notes</a>
            </li>
            <li><a class="reference-link" href="#root/JxUVp60zWDIy">revisions</a>
            </li>
          </ul>
        </div>
      </div>


blobId: 3UjpwGAL4cFgaHHGsKZm
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.857Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The note type is defined by the <code>type</code> column in&nbsp;<a class="reference-link"
            href="#root/IGBPgB2RHETG">notes</a>.</p>
          <p>Possible types:</p>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:9.01%;">
                  <col style="width:10.33%;">
                    <col style="width:29.72%;">
                      <col style="width:23.85%;">
                        <col style="width:27.09%;">
              </colgroup>
              <thead>
                <tr>
                  <th>Note Type</th>
                  <th><code>type</code> value</th>
                  <th>Corresponding MIME type</th>
                  <th>Content of the note's blob</th>
                  <th>Relevant attributes</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <th>Text</th>
                  <td><code>text</code>
                  </td>
                  <td>&nbsp;</td>
                  <td>The HTML of the note.</td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <th><a href="https://github.com/zadam/trilium/wiki/Relation-map">Relation Map&nbsp;</a>
                  </th>
                  <td><code>relationMap</code>
                  </td>
                  <td><code>application/json</code>
                  </td>
                  <td>
                    <p>A JSON describing the note:</p><pre><code class="language-text-plain">{
      "notes": [
          {
              "noteId": "gFQDL11KEm9G",
              "x": 142,
              "y": 405
          },
          {
              "noteId": "8GcjEKyrrCgl",
              "x": 100.10406374385552,
              "y": 757.0364424520196
          }
      ],
      "transform": {
          "scale": 0.3,
          "x": 480.29766098682165,
          "y": 116.83892021963081
      }
  }</code></pre>
                  </td>
                  <td>None</td>
                </tr>
                <tr>
                  <th><a href="https://github.com/zadam/trilium/wiki/Scripts">Render Note</a>
                  </th>
                  <td><code>render</code>
                  </td>
                  <td><code>text/html</code> or blank.</td>
                  <td>An empty blob.</td>
                  <td><code>~renderNote</code> pointing to the HTML note to render.</td>
                </tr>
                <tr>
                  <th>Canvas</th>
                  <td><code>canvas</code>
                  </td>
                  <td><code>application/json</code>
                  </td>
                  <td><pre><code class="language-text-plain">{
  	"appState": {},
  	"elemenets": {},
  	"files": {},
  	"type": "excalidraw",
  	"version": 2
  }</code></pre>
                  </td>
                  <td>None</td>
                </tr>
                <tr>
                  <th>Mermaid Diagram</th>
                  <td><code>mermaid</code>
                  </td>
                  <td><code>text/mermaid</code> or <code>text/plain</code>
                  </td>
                  <td>The plain text content of the Mermaid diagram.</td>
                  <td>None</td>
                </tr>
                <tr>
                  <th>Book</th>
                  <td><code>book</code>
                  </td>
                  <td><code>text/html</code> or blank.</td>
                  <td>An empty blob.</td>
                  <td>
                    <ul>
                      <li><code>#viewType</code> which can be either <code>grid</code> or <code>list</code>.</li>
                      <li><code>#expanded</code>
                      </li>
                    </ul>
                    <p>both options are shown to the user via the “Book Properties” ribbon widget.</p>
                  </td>
                </tr>
                <tr>
                  <th>Web View</th>
                  <td><code>webView</code>
                  </td>
                  <td>blank</td>
                  <td>An empty blob.</td>
                  <td><code>#webViewSrc</code> pointing to an URL to render.</td>
                </tr>
                <tr>
                  <th>Code</th>
                  <td><code>code</code>
                  </td>
                  <td>Depends on the language (e.g. <code>text/plain</code>, <code>text/x-markdown</code>, <code>text/x-c++src</code>).</td>
                  <td>The plain text content.</td>
                  <td>&nbsp;</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: WL2UZ5GiP71F0mWXENJ3
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.861Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Safe mode is triggered by setting the <code>TRILIUM_SAFE_MODE</code> environment
            variable to a truthy value, usually <code>1</code>.</p>
          <p>In each artifact there is a <code>trilium-safe-mode.sh</code> (or <code>.bat</code>)
            script to enable it.</p>
          <p>What it does:</p>
          <ul>
            <li>Disables <code>customWidget</code> launcher types in <code>app/widgets/containers/launcher.js</code>.</li>
            <li>Disables the running of <code>mobileStartup</code> or <code>frontendStartup</code> scripts.</li>
            <li>Displays the root note instead of the previously saved session.</li>
            <li>Disables the running of <code>backendStartup</code>, <code>hourly</code>, <code>daily</code> scripts
              and checks for the hidden subtree.</li>
          </ul>
        </div>
      </div>


blobId: MBG0scetLqUeXnqM1IEJ
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.868Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Icons are stored in <code>images</code> and in <code>images/app-icons</code>.</p>
          <h2>Favicon</h2>
          <p>The favicon is served dynamically via <code>serve-favicon</code>, using
            the icon in <code>images/app-icons/win/icon.ico</code>.</p>
          <h2>Declarative generation of icons</h2>
          <p>All the icons are now built off of the SVGs in the <code>images</code> directory
            using the <code>bin/create-icons.sh</code> script.</p>
          <h2>Main images</h2>
          <p>These are stored in <code>images</code>:</p>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Resolution</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><code>icon-black.svg</code>
                  </td>
                  <td>53x40</td>
                  <td>Used by the global menu button when not hovered.</td>
                </tr>
                <tr>
                  <td><code>icon-color.svg</code>
                  </td>
                  <td>53x40</td>
                  <td>Used by the global menu when hovered.</td>
                </tr>
                <tr>
                  <td><code>icon-grey.svg</code>
                  </td>
                  <td>53x40</td>
                  <td>Used by the dark theme, in place of <code>icon-black.svg</code>.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>App icons</h2>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Resolution</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><code>ios/apple-touch-icon.png</code>
                  </td>
                  <td>180x180</td>
                  <td>Used as <code>apple-touch-icon</code>, but only in <code>login.ejs</code> and <code>set_password.ejs</code> for
                    some reason.</td>
                </tr>
                <tr>
                  <td><code>mac/icon.icns</code>
                  </td>
                  <td>512x512</td>
                  <td>Provided as <code>--icon</code> to <code>electron-packager</code> for <code>mac-arm64</code> and <code>mac-x64</code> 
                    <a
                    href="#root/5jt68zVszBwg">builds</a>.</td>
                </tr>
                <tr>
                  <td><code>png/128x128.png</code>
                  </td>
                  <td>128x128</td>
                  <td>Used in <code>linux-x64</code>  <a href="#root/5jt68zVszBwg">build</a>,
                    to provide an <code>icon.png</code>.</td>
                </tr>
                <tr>
                  <td><code>png/256x256-dev.png</code>
                  </td>
                  <td rowspan="2">256x256</td>
                  <td>Used by the Electron window icon, if in dev mode.</td>
                </tr>
                <tr>
                  <td><code>png/256x256.png</code>
                  </td>
                  <td>Used by the Electron window icon, if not in dev mode.</td>
                </tr>
                <tr>
                  <td><code>win/icon.ico</code>
                  </td>
                  <td>
                    <ul>
                      <li>ICO 16x16</li>
                      <li>ICO 32x32</li>
                      <li>ICO 48x48</li>
                      <li>ICO 64x64</li>
                      <li>ICO 128x128</li>
                      <li>PNG 256x256</li>
                    </ul>
                  </td>
                  <td>
                    <ul>
                      <li>Used by the <code>win-x64</code>  <a href="#root/5jt68zVszBwg">build</a>.</li>
                      <li>Used by Squirrel Windows installer for: setup icon, app icon, control
                        panel icon</li>
                      <li>Used as the favicon.</li>
                    </ul>
                  </td>
                </tr>
                <tr>
                  <td><code>win/setup-banner.gif</code>
                  </td>
                  <td>640x480</td>
                  <td>Used by the Squirrel Windows installer during the installation process.
                    Has only one frame.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>Additional locations where the branding is used</h2>
          <ul>
            <li>In the client, more specifically in <code>src/public/app/widgets/buttons/global_menu.js</code>,
              where the SVG content of the icon is directly embedded to allow styling
              via CSS.</li>
            <li>In the&nbsp;<a class="reference-link" href="#root/N864ORbFlbUC">Demo document</a>,
              as an attachment.</li>
            <li>In the&nbsp;<a class="reference-link" href="#root/OeKBfN6JbMIq/MF99QFRe1gVy/xkj1bqW7zJwQ/t6mT72MfEzb2">CKEditor</a>&nbsp;build,
              look for <code>packages/ckeditor5-build-balloon-block/src/icons/trilium.svg</code>.
              Make sure not to have any <code>fill</code> overrides in the SVG as the wrong
              color will be used.</li>
          </ul>
        </div>
      </div>


blobId: C9iQPs8vzEk2Z1v6WHLn
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.872Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The following icons were removed:</p>
          <h2>Main images</h2>
          <p>These are stored in <code>images</code>:</p>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Resolution</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><code>icon-black.png</code>
                  </td>
                  <td>36x36</td>
                  <td>Does not appear to be used.</td>
                </tr>
                <tr>
                  <td><code>icon-color.png</code>
                  </td>
                  <td>36x36</td>
                  <td>Used only by some tests in <code>test-etapi</code>.</td>
                </tr>
                <tr>
                  <td><code>icon-grey.png</code>
                  </td>
                  <td>36x36</td>
                  <td>Does not appear to be used.</td>
                </tr>
                <tr>
                  <td><code>icon.svg</code>
                  </td>
                  <td>210x297</td>
                  <td>Does not appear to be used.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>App icons</h2>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Resolution</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><code>png/16x16-bw.png</code>
                  </td>
                  <td rowspan="2">16x16</td>
                  <td rowspan="7">Do not appear to be used.</td>
                </tr>
                <tr>
                  <td><code>png/16x16.png</code>
                  </td>
                </tr>
                <tr>
                  <td><code>png/24x24.png</code>
                  </td>
                  <td>24x24</td>
                </tr>
                <tr>
                  <td><code>png/32x32.png</code>
                  </td>
                  <td>32x32</td>
                </tr>
                <tr>
                  <td><code>png/48x48.png</code>
                  </td>
                  <td>48x48</td>
                </tr>
                <tr>
                  <td><code>png/64x64.png</code>
                  </td>
                  <td>64x64</td>
                </tr>
                <tr>
                  <td><code>png/96x96.png</code>
                  </td>
                  <td>96x96</td>
                </tr>
                <tr>
                  <td><code>png/512x512.png</code>
                  </td>
                  <td>512x512</td>
                  <td>Does not appear to be used.</td>
                </tr>
                <tr>
                  <td style="border-top:1px solid rgb(222, 226, 230);padding:0.75rem;"><code>win/setup-banner.xcf</code>
                  </td>
                  <td style="border-top:1px solid rgb(222, 226, 230);padding:0.75rem;">&nbsp;</td>
                  <td style="border-top:1px solid rgb(222, 226, 230);padding:0.75rem;">GIMP source for <code>win/setup-banner.gif</code>. Provided only for future
                    editing.</td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: yqK7SIMAEeqpYrilpfLE
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.876Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>&nbsp;</p>
          <p>Looks great in Finder:</p>
          <figure class="image">
            <img style="aspect-ratio:1972/728;" src="api/attachments/MGiHilLmJkM2/image/1_Icons on Mac_image.png" width="1972"
            height="728">
          </figure>
          <p>Looks great in Dock:</p>
          <figure class="image">
            <img style="aspect-ratio:1960/302;" src="api/attachments/maB5f1sqlw34/image/Icons on Mac_image.png" width="1960"
            height="302">
          </figure>
        </div>
      </div>


blobId: Ph8xoMBnGLElAwQCF0PS
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:55.910Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Slightly blurry in extended preview on Mac</p>
          <figure class="image">
            <img style="aspect-ratio:2406/1598;" src="api/attachments/LTIkbHYLuHyh/image/1_Slightly blurry icon on Ma.png"
            width="2406" height="1598">
          </figure>
          <p>In the screenshot, the icon is around 650px whereas the closest image
            we have is 512px, so that might explain the blur. Adding an <code>ic10</code> (<code>1024x1024</code>,
            aka <code>512x512@2x</code> to see what happens).</p>
          <p>Before:</p><pre><code class="language-text-plain">File: ../images/app-icons/mac/icon.icns
    ic09: 62069 bytes, png: 512x512</code></pre>
          <p>After:</p><pre><code class="language-text-plain">File: ../images/app-icons/mac/icon.icns
    icp4: 1140 bytes, png: 16x16
    icp5: 1868 bytes, png: 32x32
    ic07: 9520 bytes, png: 128x128
    ic09: 62069 bytes, png: 512x512
    ic10: 180442 bytes, png: 512x512@2x</code></pre>
          <p>Even with a 1024x1024 icon, the image is still blurry.</p>
          <p>Comparing the <code>.icns</code> file from the Electron build reveals that
            the <code>.icns</code> file has been tampered with:</p>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>The <code>electron.icns</code> from the resulting build</th>
                  <th>The icon source</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><pre><code class="language-text-plain">File: images/app-icons/mac/electron.icns
    icp4: 1140 bytes, png: 16x16
    icp5: 1868 bytes, png: 32x32
    ic07: 9520 bytes, png: 128x128
    ic09: 62069 bytes, png: 512x512
    ic10: 180442 bytes, png: 512x512@2x</code></pre>
                  </td>
                  <td><pre><code class="language-text-plain">File: images/app-icons/mac/icon.icns
    icp4: 1648 bytes, png: 16x16
    icp5: 4364 bytes, png: 32x32
    ic07: 26273 bytes, png: 128x128
    ic09: 206192 bytes, png: 512x512
    ic10: 716034 bytes, png: 512x512@2x</code></pre>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
          <p>The bluriness might come from the image itself: <a href="https://stackoverflow.com/questions/54030521/convert-svg-to-png-with-sharp-edges">https://stackoverflow.com/questions/54030521/convert-svg-to-png-with-sharp-edges</a>&nbsp;</p>
          <p>Rendering with Inkscape (left) vs ImageMagick (right):</p>
          <figure class="image">
            <img style="aspect-ratio:1234/528;" src="api/attachments/25AjJTitMObV/image/2_Slightly blurry icon on Ma.png"
            width="1234" height="528">
          </figure>
          <p>Now in macOS it's also rendering quite nicely:</p>
          <figure class="image">
            <img style="aspect-ratio:2470/1630;" src="api/attachments/8TF8ANOmH33X/image/Slightly blurry icon on Ma.png"
            width="2470" height="1630">
          </figure>
        </div>
      </div>


blobId: gtXKDriS7B3aHwUTOTWD
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.001Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:11.22%;">
                  <col style="width:88.78%;">
              </colgroup>
              <tbody>
                <tr>
                  <th>Before</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:1960/302;" src="api/attachments/27VbmHQe8jNt/image/2_Adaptive icon_image.png" width="1960"
                      height="302">
                    </figure>
                  </td>
                </tr>
                <tr>
                  <th>After</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:2116/302;" src="api/attachments/xzFpYwjN8R14/image/6_Adaptive icon_image.png" width="2116"
                      height="302">
                    </figure>
                  </td>
                </tr>
                <tr>
                  <th>With new scale</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:2116/302;" src="api/attachments/cH4zqfKx4oLh/image/5_Adaptive icon_image.png" width="2116"
                      height="302">
                    </figure>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>Scale</h2>
          <figure class="table" style="width:300px;">
            <table>
              <tbody>
                <tr>
                  <th>0.9</th>
                  <td style="background-color:hsl(0, 0%, 90%);">
                    <figure class="image">
                      <img style="aspect-ratio:128/128;" src="api/attachments/MMEDNXcfP7S7/image/Adaptive icon_image.png" width="128"
                      height="128">
                    </figure>
                  </td>
                </tr>
                <tr>
                  <th>0.85</th>
                  <td style="background-color:hsl(0, 0%, 90%);">
                    <figure class="image">
                      <img style="aspect-ratio:128/128;" src="api/attachments/zvMwg8B8Nkf5/image/1_Adaptive icon_image.png" width="128"
                      height="128">
                    </figure>
                  </td>
                </tr>
                <tr>
                  <th>0.8</th>
                  <td style="background-color:hsl(0, 0%, 90%);">
                    <figure class="image">
                      <img style="aspect-ratio:128/128;" src="api/attachments/5UwXDdE8lRdr/image/3_Adaptive icon_image.png" width="128"
                      height="128">
                    </figure>
                  </td>
                </tr>
                <tr>
                  <th>0.75</th>
                  <td style="background-color:hsl(0, 0%, 90%);">
                    <figure class="image">
                      <img style="aspect-ratio:128/128;" src="api/attachments/5aWSWVuL19A4/image/4_Adaptive icon_image.png" width="128"
                      height="128">
                    </figure>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
        </div>
      </div>


blobId: LzeAcsVZRdoX5XUBG4ye
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.135Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The demo document is an exported .zip that resides in <code>db/demo.zip</code>.</p>
          <p>During on-boarding, if the user selects that they are a new user then
            the <code>demo.zip</code> is imported into the root note.</p>
          <h2>Modifying the document</h2>
          <p>On a dev server, remove all your existing notes in order to ensure a clean
            setup. Right click → Import to note and select the .zip file in <code>db/demo.zip</code>.
            Make sure to disable “Safe import”.</p>
          <p>After making the necessary modifications, simply export the “Trilium Demo”
            note as “HTML in ZIP archive” and replace <code>db/demo.zip</code> with the
            newly exported one.</p>
          <h2>Testing the changes</h2><pre><code class="language-text-plain">rm -r data
  npm run start-server</code></pre>
          <p>And then do the on-boarding again.</p>
        </div>
      </div>


blobId: XJRuTZ3gSBfSrFC9oTkc
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.139Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>To run a Docker build:</p><pre><code class="language-text-plain">./bin/builder-docker.sh</code></pre>
          <p>To run the built Docker image:</p><pre><code class="language-text-plain">sudo docker run -p 8081:8080 triliumnext/notes:v0.90.6-beta</code></pre>
          <p>To enter a shell in the Docker container:</p><pre><code class="language-text-plain">sudo docker run -it --entrypoint=/bin/sh zadam/trilium:0.63-latest</code></pre>
        </div>
      </div>


blobId: 4KRm4SbmtmOBNZPRGyhW
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.143Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Read an option</h2>
          <p>Add the import to the service (make sure the relative path is correct):</p><pre><code class="language-application-javascript-env-frontend">import options from "../../services/options.js";</code></pre>
          <p>Them simply read the option:</p><pre><code class="language-application-javascript-env-frontend">this.firstDayOfWeek = options.getInt("firstDayOfWeek");</code></pre>
        </div>
      </div>


blobId: N7bYvoAnkSVSVl5JniY4
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.147Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>In the TPL:</p><pre><code class="language-text-html">&lt;div class="options-section"&gt;
      &lt;h4&gt;Background effects&lt;/h4&gt;

      &lt;p&gt;On the desktop application, it's possible to use a semi-transparent background tinted in the colors of the user's wallpaper to add a touch of color.&lt;/p&gt;

      &lt;div class="col-6 side-checkbox"&gt;
          &lt;label class="form-check"&gt;
              &lt;input type="checkbox" class="background-effects form-check-input" /&gt;
              Enable background effects (Windows 11 only)
          &lt;/label&gt;
      &lt;/div&gt;
  &lt;/div&gt;</code></pre>
          <p>In <code>doRender()</code>:</p><pre><code class="language-text-x-trilium-auto">doRender() {
  	this.$backgroundEffects = this.$widget.find("input.background-effects");

  	this.$backgroundEffects.on("change", () =&gt; this.updateCheckboxOption("backgroundEffects", this.$backgroundEffects));
  }</code></pre>
          <p>In <code>optionsLoaded(options)</code>:</p><pre><code class="language-text-x-trilium-auto">async optionsLoaded(options) {

      this.setCheckboxState(this.$backgroundEffects, options.backgroundEffects);

  }</code></pre>
        </div>
      </div>


blobId: VrpY4wGH5xyMTkI8TpXL
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.150Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Call <code>utils.reloadFrontendApp</code>, but make sure to wait for the
            option to be saved first.</p><pre><code class="language-text-x-trilium-auto">this.$backgroundEffects.on("change", async () =&gt; {

      await this.updateCheckboxOption("backgroundEffects", this.$backgroundEffects);

      utils.reloadFrontendApp("background effect change");

  });</code></pre>
        </div>
      </div>


blobId: JZ66sDSV54J3OagqzOtf
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.154Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Go to <code>src/public/app/widgets/type_widgets/options</code> and select
            a corresponding category, such as <code>appearance</code> and edit one of
            the JS files.</p>
          <p>For example, to create a select:</p>
          <p>First, modify the template (<code>TPL</code>), to add the new widget:</p><pre><code class="language-text-plain">&lt;div class="col-6"&gt;
      &lt;label&gt;First day of the week&lt;/label&gt;
      &lt;select class="first-day-of-week-select form-control"&gt;
          &lt;option value="0"&gt;Sunday&lt;/option&gt;
          &lt;option value="1"&gt;Monday&lt;/option&gt;
      &lt;/select&gt;
  &lt;/div&gt;</code></pre>
          <p>Secondly, create a reference to the new element in <code>doRender()</code>:</p><pre><code class="language-text-plain">this.$firstDayOfWeek = this.$widget.find(".first-day-of-week-select");</code></pre>
          <p>Then in <code>optionsLoaded</code> adjust the value to the one set in the
            database:</p><pre><code class="language-text-plain">this.$firstDayOfWeek.val(options.firstDayOfWeek);</code></pre>
          <p>To actually update the option, add a listener in <code>doRender</code>:</p><pre><code class="language-text-plain">this.$firstDayOfWeek.on("change", () =&gt; {
      this.updateOption("firstDayOfWeek", this.$firstDayOfWeek.val());
  });</code></pre>
        </div>
      </div>


blobId: iF9WERZLNX6wxYX1oIsB
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.158Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>To make a widget react to a change of a given option, simply add the following
            to the widget:</p><pre><code class="language-application-javascript-env-frontend">async entitiesReloadedEvent({loadResults}) {
      if (loadResults.getOptionNames().includes("firstDayOfWeek")) {
          // Do something.
      }        
  }</code></pre>
        </div>
      </div>


blobId: z7vn501TgGvlXwHQRYBI
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.162Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Step 1. Create the option</h2>
          <p>To add a new option with a set default, go to <code>options_init.ts</code> in
            the server and add a new entry in the <code>defaultOptions</code>.</p>
          <h2>Step 2. Make the option available to the client</h2>
          <p>By default options are not adjustable or visible to the client. To do
            so, modify <code>routes/api/options.ts</code> to add the newly added option
            to <code>ALLOWED_OPTIONS</code>.</p>
        </div>
      </div>


blobId: OVsqbAP32xgMQrFZmyXm
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.169Z
content:
  <div class="content">
         

        <div class="ck-content">
          <blockquote>
            <p><strong>Note</strong>: When adding or updating step titles/order, don't
              forget to update the corresponding list in&nbsp;<a class="reference-link"
              href="#root/vXCD0qqdny5c">Note type checklist</a>.</p>
          </blockquote>
          <h2>Step 1. Register the note type in the server</h2>
          <p>Go to <code>src\services\note_types.ts</code> and add a new entry in <code>noteTypes</code> with
            the type ID and the default MIME type.</p>
          <h2>Step 2. Register the note type in the client context menu</h2>
          <p>The client lists the available note types in <code>src\public\app\services\note_types.js</code>.</p>
          <h2>Step 3. Create a type widget</h2>
          <p>Go to <code>src\public\app\widgets\type_widgets</code> directory and create
            a new file corresponding to the new note type.</p>
          <p>A blank implementation looks something like this:</p>
          <section class="include-note"
          data-note-id="7zPG0kz3CodO" data-box-size="full">&nbsp;</section>
          <h2>Step 4. Register the type widget</h2>
          <p>The type widget needs to go in <code>src\public\app\widgets\note_detail.ts</code>where
            there is a <code>typeWidgetClasses</code> map, mapping the type IDs with
            the corresponding type widget that was created at the previous step.</p>
          <h2>Step 5. Add the default icon mapping</h2>
          <p>To set a default icon for this note type, go to <code>src\public\app\entities\fnote.js</code> and
            add it to <code>NOTE_TYPE_ICONS</code>.</p>
          <h2>Step 6. Add to note type selector</h2>
          <p>Go to <code>src/public/app/widgets/note_type.js</code> and register the
            new note type in <code>NOTE_TYPES</code>.</p>
          <h2>Step 7. Add the note to server allowed note types</h2>
          <p>This is required in order to make imports possible, otherwise they will
            be imported as plain text.</p>
          <p>Go to <code>src/becca/entities/rows.ts</code> and add the new note type
            to <code>ALLOWED_NOTE_TYPES</code>.</p>
          <h2>Additional changes</h2>
          <ul>
            <li>If the widget requires a full height, it must be configured in <code>src\public\app\widgets\note_detail.js</code> (look
              for <code>checkFullHeight</code>) then a <code>height: 100%</code> style can
              be applied to the containers to make them fit.</li>
            <li>To make the note always full width (ignoring the user's content width),
              go to <code>note_wrapper</code> and look for the <code>refresh</code> method.
              There is a <code>toggleClass</code> for <code>full-content-width</code> based
              on the note type.</li>
            <li>To allow the note source to be viewed, go to <code>src/public/app/widgets/buttons/note_actions.js</code> and
              look for <code>this.toggleDisabled(this.$showSourceButton</code> in <code>refreshVisibility</code>.</li>
          </ul>
          <h2>Final steps</h2>
          <ul>
            <li>Update the&nbsp;<a class="reference-link" href="#root/N864ORbFlbUC">Demo document</a>&nbsp;to
              showcase the new note type.</li>
          </ul>
          <h2>Troubleshooting</h2>
          <h3>Content does not appear, however it appears as hidden in the DOM</h3>
          <p>Type widgets do a check whenever a note is selected to determine whether
            the widget needs to be displayed or not, based on the note type. Make sure <code>getType()</code> is
            well implemented in the newly added type widget (take great care that the
            value is returned but also that the note type ID matches the ones registered
            in the previous steps):</p><pre><code class="language-text-plain">static getType() { return "foo"; }</code></pre>
        </div>
      </div>


blobId: kulvjBX3YHgyJfILQez1
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.172Z
content:
  import TypeWidget from "./type_widget.js";

  const TPL = `
  <div class="note-detail-mind-map note-detail-printable">
  </div>
  `;

  export default class MindMapWidget extends TypeWidget {
      static getType() { return "mindMap"; }

      doRender() {
          this.$widget = $(TPL);

          super.doRender();
      }

      async doRefresh(note) {
          this.$widget.html("<p>Hello</p>");
          this.$widget.show();
      }

      async entitiesReloadedEvent({loadResults}) {
          if (loadResults.isNoteReloaded(this.noteId)) {
              this.refresh();
          }
      }
  }


blobId: GXbmhhlr362RML9wuB43
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.177Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The goal of this checklist is to ensure a good implementation or re-test
            of a note type.</p>
          <h2>Implementation checklist</h2>
          <p>The note type widget must be created according to&nbsp;<a class="reference-link"
            href="#root/UNft06cRlBmE">First steps</a>:</p>
          <ul class="todo-list">
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Register the note type in the server</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Register the note type in the client context menu</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Create a type widget</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Register the type widget</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Add the default icon mapping</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Add to note type selector</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Add the note to server allowed note types</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Update demo document to include this new note type</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Increase server sync version (see&nbsp;<a class="reference-link" href="#root/XPSyrTI07rbd/DrIXfwu9CVJP">Mindmap gets turned as file</a>).</span>
              </label>
            </li>
          </ul>
          <h2>Validation checklist</h2>
          <h3>Ensure that the note renders properly</h3>
          <ul class="todo-list">
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">When refreshing to a note that is already displayed</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">When going to another note and then going back</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">When creating a new note of the given type</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Have two tabs of the same note type and switch between them</span>
              </label>
            </li>
          </ul>
          <h3>Ensure data persistence</h3>
          <ul class="todo-list">
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Save data when modifying changes via spaced update</span>
              </label>
            </li>
          </ul>
          <h3>Ensure data retrieval</h3>
          <ul class="todo-list">
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Go on a note of this type and refresh the page</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Create a new note of this type while on another note of this type and ensure that the content is set properly.</span>
              </label>
            </li>
          </ul>
          <h3>Set up a note preview</h3>
          <p>For an implementation reference, see&nbsp;<a class="reference-link" href="#root/NG0MFO2XXtUr">SVG rendering</a>.</p>
          <ul
          class="todo-list">
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Note preview rendering (go to parent and see note list).</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Include note</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Share</span>
              </label>
            </li>
            <li>
              <label class="todo-list__label">
                <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Note revisions</span>
              </label>
            </li>
            </ul>
            <h3>Import/export</h3>
            <ul class="todo-list">
              <li>
                <label class="todo-list__label">
                  <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Export &amp; Import, making sure no data is lost in the process.</span>
                </label>
              </li>
              <li>
                <label class="todo-list__label">
                  <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Remove the data folder entirely to test that the demo document is well imported on first setup.</span>
                </label>
                <ul class="todo-list">
                  <li>
                    <label class="todo-list__label">
                      <input type="checkbox" disabled="disabled"><span class="todo-list__label__description">Ensure that the preview also works (check the preview in the root note).</span>
                    </label>
                  </li>
                </ul>
              </li>
            </ul>
        </div>
      </div>


blobId: OkntK7CsRMjLcIuQFH22
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.180Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The data persistence is achieved via the spaced update mechanism which
            is already present and needs to be integrated within the newly created
            type widgets.</p>
          <p>First, the class must implement <code>getData</code>, in order to retrieve
            the data from the custom widget in a serialized form. As an example from
            the mind map implementation:</p><pre><code class="language-text-plain">async getData() {
      const mind = this.mind;
      if (!mind) {
          return;
      }

      return {
          content: mind.getDataString()
      };
  }</code></pre>
          <p>Here the content is a string containing a JSON. It is also possible to
            provide attachments here as well, such as&nbsp;<a class="reference-link"
            href="#root/NG0MFO2XXtUr">SVG rendering</a>&nbsp;to provide a preview
            of the content.</p>
          <p>Then to trigger an update, register a listener within the custom widget
            that calls the spaced update, for example:</p><pre><code class="language-text-plain">mind.bus.addListener("operation", (operation) =&gt; {
      this.spacedUpdate.scheduleUpdate();
  });</code></pre>
        </div>
      </div>


blobId: NiKiC7MmDnPUCi4ZQIlw
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.184Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Data loading can be done in <code>doRefresh()</code> since it gets a reference
            to the note:</p><pre><code class="language-text-plain">const blob = await note.getBlob();        
  const content = blob.getJsonContent();</code></pre>
          <p>Note that <code>doRefresh</code> can sometimes be called by&nbsp;<a class="reference-link"
            href="#root/jW7s0gPVnalP">Saving data via spaced update</a>&nbsp;when
            the user makes a changes, this has to be accounted for.</p>
        </div>
      </div>


blobId: DFMBsCAYSbTY2WUuU1lW
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.192Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>For diagrams and similar note types, it makes sense to cache an SVG rendering
            of the content so that it can be used for:</p>
          <ul>
            <li>Content preview in note lists (when viewing the list of notes from the
              parent note).</li>
            <li>Note inclusion</li>
            <li>Share</li>
          </ul>
          <h2>Step 1. Save the SVG content as an attachment</h2>
          <p>The first step is to obtain the SVG from the custom widget used. For example,
            for Mind Elixir there is an <code>exportSvg</code> method.</p>
          <p>If the returned value is a <code>Blob</code>, then the underlying text
            can be obtained via <code>await blob.text()</code>.</p>
          <p>To save the SVG as an attachment alongside the content, simply modify <code>getData()</code>:</p><pre><code class="language-text-plain">async getData() {
      const mind = this.mind;
      if (!mind) {
          return;
      }

      const svgContent = await this.mind.exportSvg().text();   
      return {
          content: mind.getDataString(),
          attachments: [
              {
                  role: "image",
                  title: "mindmap-export.svg",
                  mime: "image/svg+xml",
                  content: svgContent,
                  position: 0
              }
          ]
      };
  }</code></pre>
          <p>You can test this step by making a change to the note and then using the
            “Note attachments” option from the note menu.</p>
          <h2>Step 2. Adapting the server to serve SVG attachment</h2>
          <p>The <code>src/routes/api/image.ts</code> route is in charge for serving
            the image previews of image notes, but also of custom note types such as
            canvases.</p>
          <p>Alter the <code>returnImageInt</code> method as follows:</p>
          <ol>
            <li>Add the image type to the guard condition which returns 400 for unsupported
              note types.</li>
            <li>Add an <code>if</code> statement to render the attachment using the correct
              name:</li>
          </ol><pre><code class="language-text-plain">if (image.type === "mindMap") {
  	renderSvgAttachment(image, res, 'mindmap-export.svg');
  }</code></pre>
          <h2>Step 3. Serve the SVG attachment for note preview</h2>
          <p>The client also needs tweaking to allow it to render SVG attachments by
            calling the previously modified server route.</p>
          <p>The <code>src/public/app/services/content_renderer.js</code> file is in
            charge of handling the previews. To render using the image route, modify <code>getRenderedContent</code> to
            add the new note type to the <code>if</code> which calls <code>renderImage</code>.</p>
          <h2>Step 4. Serve SVG for share</h2>
          <p>By default,<code> Note type cannot be displayed</code> will be displayed
            when trying to access the given note via a share.</p>
          <p>To serve the SVG, open <code>src/share/content_renderer.ts</code> and look
            for <code>getContent</code>. Then add to the <code>if</code> containing <code>renderImage</code> the
            new note type.</p>
          <p>This is not enough, as attempting to access the shared note will result
            in a broken image that fails with <code>Requested note is not a shareable image</code>.
            To solve this one, go to <code>src/share/routes.ts</code> and add a <code>renderImageAttachment</code> statement
            to <code>router.get('/share/api/images/[…])</code>.</p>
          <h2>Step 5. Serve SVG for revisions</h2>
          <p>In the revisions list, to display the SVG, go to <code>src/public/app/widgets/dialogs/revisions.js</code> and
            look for the <code>renderContent</code> method. Simply add the note type
            to one of the already existing <code>if</code>s, such as the one for <code>canvas</code> and <code>mindMap</code> or <code>mermaid</code> (if
            the text content of the diagram should also be displayed).</p>
        </div>
      </div>


blobId: ANSSvu28nhBCY4cHBUJG
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.196Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>This function is handled by <code>src/public/app/widgets/floating_buttons/copy_image_reference_button.js</code> and
            it supports multiple note types out of the box.</p>
          <p>To enable the display of the button, simply modify <code>isEnabled</code> to
            add support for the new note type.</p>
          <p>No other modifications should be necessary.</p>
        </div>
      </div>


blobId: GBNAlQPOLvJVQI9AYjLV
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.200Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>This mechanism is handled by <code>src/public/app/widgets/floating_buttons/svg_export_button.js</code>.</p>
          <h2>Step 1. Enable the button</h2>
          <p>Modify the &nbsp;<code>isEnabled</code> method in <code>svg_export_button.js</code> to
            add support for the new note type.</p>
          <h2>Step 2. Add support for exporting the image</h2>
          <p>The SVG export needs to be handled inside the note type implementation.&nbsp;</p>
          <p>The first goal is to create a method to handle the&nbsp;<a class="reference-link"
            href="#root/NG0MFO2XXtUr">SVG rendering</a>. Make sure to deduplicate
            the code if the SVG rendering is already handled.</p><pre><code class="language-text-plain">async renderSvg() {
      return await this.mind.exportSvg().text();
  }</code></pre>
          <p>Then create an event handler to manage the SVG export:</p><pre><code class="language-text-plain">async exportSvgEvent({ntxId}) {
      if (!this.isNoteContext(ntxId) || this.note.type !== "mindMap") {
          return;
      }

      const svg = await this.renderSvg();
      utils.downloadSvg(this.note.title, svg);
  }</code></pre>
          <p>Make sure to modify the note type assertion at the beginning of the method.
            This is very important, otherwise there can be errors when navigating through
            multiple note types that support this button.</p>
        </div>
      </div>


blobId: thAPKiIvN3DNY3YJqITj
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.204Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Note printing is handled by <code>note_detail.js</code>, in the <code>printActiveNoteEvent</code> method.</p>
          <p>The application uses the <a href="https://www.npmjs.com/package/print-this"><code>print-this</code></a> library
            to isolate <code>.note-detail-printable:visible</code> and prepare it for
            printing.</p>
          <p>Some scripts like KaTeX are manually injected in the footer, and the CSS
            to be used is manually defined. The most important one is <code>print.css</code>.</p>
          <h2>Syntax highlighting</h2>
          <p>Syntax highlighting for code blocks is supported as well:</p>
          <ul>
            <li>It works by injecting a Highlight.js stylesheet into the print.</li>
            <li>The theme used is hard-coded (the <i>Visual Studio Light theme</i>, at
              the time of writing) in order not to have a dark background in print.</li>
            <li>The Highlight.js library is not needed since the <code>.note-detail-printable</code> which
              is rendered already has the <code>.hljs</code> classes added to it in order
              to achieve the syntax highlighting.</li>
            <li>The user's choice of whether to enable syntax highlighting is also respected.</li>
          </ul>
        </div>
      </div>


blobId: FSn1LoZDgHjeXWcXAp3F
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.208Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Launchers are items that are displayed in the launcher bar (left side
            of the screen). They are of two different types:</p>
          <ul>
            <li>Visible launchers: are displayed by default to the user, can be moved
              to the available launchers section to hide them.</li>
            <li>Available launchers: can be manually added by the user from settings into
              the list of visible launchers.</li>
          </ul>
          <h2>Adding a new launcher</h2>
          <p>Regardless of the type, new launchers are added at server level, inside <code>hidden_subtree.ts</code> file.</p>
          <ul>
            <li>To add a new available launcher, look for <code>_lbAvailableLaunchers</code> and
              add a new item to its <code>children</code>.</li>
            <li>Similarly, to add a visible launcher, look for <code>_lbVisibleLaunchers</code>.
              <ul>
                <li>If you add a visible launcher, it will be available for both new and old
                  users, since the application will identify that there is a new launcher
                  to be added regardless of the user preference.</li>
              </ul>
            </li>
          </ul>
        </div>
      </div>


blobId: BZa82CZybjU14C7Z7PSN
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.216Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Defining the MIME type</h2>
          <p>The first step to supporting a new language for either code blocks or
            code notes is to define the MIME type. Go to <code>mime_types.ts</code> and
            add a corresponding entry:</p><pre><code class="language-text-x-trilium-auto">{ title: "Batch file (DOS)", mime: "application/x-bat" }</code></pre>
          <h2>Syntax highlighting for Highlight.js</h2>
          <h3>Built-in languages</h3>
          <p>Highlight.js supports a lot of languages out of the box, for some of them
            we just need to enable them by specifying one of the language aliases in
            the <code>highlightJs</code> field in the <code>mime_types</code> definition:</p><pre><code class="language-text-x-trilium-auto">{ title: "Batch file (DOS)", mime: "application/x-bat", highlightJs: "dos" }</code></pre>
          <p>For the full list of supported languages, see <a href="https://highlightjs.readthedocs.io/en/latest/supported-languages.html">Supported Languages — highlight.js 11.9.0 documentation</a>.
            Look for the “Package” column to see if another library needs to be installed
            to support it.</p>
          <p>Note that we are using the CDN build which may or may not have all the
            languages listed as predefined in the “Supported languages” list. To view
            the real list of supported files, see the <code>node_modules/@highlightjs/cdn-assets/languages</code> directory.</p>
          <h3>Custom language</h3>
          <p>When the source code for a language is available, one way is to simply
            copy it to <code>libraries/highlightjs/{id}.js</code> where <code>id</code> matches
            the name for <code>highlightJs</code>.</p>
          <p>Make sure in the script that the language is registered:</p><pre><code class="language-text-x-trilium-auto">hljs.registerLanguage('terraform', hljsDefineTerraform);</code></pre>
          <p>Then in <code>mime_types.ts</code> make sure to set <code>highlightJsSource</code> to <code>libraries</code> to
            load it.</p><pre><code class="language-text-x-trilium-auto">{ title: "Terraform (HCL)", mime: "text/x-hcl", highlightJs: "terraform", highlightJsSource: "libraries", codeMirrorSource: "libraries/codemirror/hcl.js" },</code></pre>
          <h2>Syntax highlighting for CodeMirror</h2>
          <h3>Custom language</h3>
          <p>Generally new languages are not added in the base installation and need
            to be separately registered. For CodeMirror 5 it seems that (at least for
            simple languages), the modes are distributed as <i>simple modes</i> and can
            generally be copy-pasted in <code>libraries/codemirror</code>. An example
            would be:</p><pre><code class="language-text-x-trilium-auto">(() =&gt; {

      CodeMirror.defineSimpleMode("batch", {

          start: [],

          echo: []

      });



      CodeMirror.defineMIME("application/x-bat", "batch");

      CodeMirror.modeInfo.push({

          ext: [ "bat", "cmd" ],

          mime: "application/x-bat",

          mode: "batch",

          name: "Batch file"

      });

  })();

  </code></pre>
          <p>Note that changing <code>modeInfo</code> is crucial, otherwise syntax highlighting
            will not work. The <code>mime</code> field is mandatory, even if <code>mimes</code> is
            used instead.</p>
          <p>Afterwards, register it in <code>mime_types.ts</code>, specifying <code>codeMirrorSource</code> to
            point to the newly created file:</p><pre><code class="language-text-x-trilium-auto">{ title: "Batch file (DOS)", mime: "application/x-bat", highlightJs: "dos", codeMirrorSource: "libraries/codemirror/batch.js" }</code></pre>
        </div>
      </div>


blobId: XUSaIoR55elbzpyTWcMJ
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.225Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>To create a basic widget, simply create a code note with type “JS frontend”.
            Add the <code>#widget</code> label in order for it to be loaded at startup.</p><pre><code class="language-text-plain">const template = `&lt;div id="my-widget"&gt;&lt;button&gt;Click Me!&lt;/button&gt;&lt;/div&gt;`;

  class MyWidget extends api.BasicWidget {
      get position() { return 1; }
      get parentWidget() { return "left-pane" }
      
      doRender() {
          this.$widget = $(template);
          return this.$widget;
      }
  }

  module.exports = new MyWidget();</code></pre>
          <p><code>parentWidget()</code> can be given the following values:</p>
          <ul>
            <li><code>left-pane</code> - This renders the widget on the left side of the
              screen where the note tree lives.</li>
            <li><code>center-pane</code> - This renders the widget in the center of the
              layout in the same location that notes and splits appear.</li>
            <li><code>note-detail-pane</code> - This renders the widget <i>with</i> the note
              in the center pane. This means it can appear multiple times with splits.</li>
            <li><code>right-pane</code> - This renders the widget to the right of any opened
              notes.</li>
          </ul>
          <hr>
          <p>Reference:</p>
          <ul>
            <li><a href="https://trilium.rocks/X7pxYpiu0lgU">https://trilium.rocks/X7pxYpiu0lgU</a>&nbsp;</li>
            <li><a href="https://github.com/zadam/trilium/wiki/Widget-Basics">https://github.com/zadam/trilium/wiki/Widget-Basics</a>&nbsp;</li>
            <li><a href="https://github.com/zadam/trilium/wiki/Frontend-Basics">https://github.com/zadam/trilium/wiki/Frontend-Basics</a>&nbsp;</li>
          </ul>
        </div>
      </div>


blobId: 8U5EGU2Z3WteM3YVtUXw
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.231Z
content:
  <div class="content">
         

        <div class="ck-content">
          <ul>
            <li><code>doRender</code> must not be overridden, instead <code>doRenderBody()</code> has
              to be overridden.</li>
            <li><code>parentWidget()</code> must be set to <code>“rightPane”</code>.</li>
            <li><code>widgetTitle()</code> getter can optionally be overriden, otherwise
              the widget will be displayed as “Untitled widget”.</li>
          </ul><pre><code class="language-text-plain">const template = `&lt;div&gt;Hi&lt;/div&gt;`;

  class ToDoListWidget extends api.RightPanelWidget {
      
      get widgetTitle() {
          return "Title goes here";
      }
          
      get parentWidget() { return "right-pane" }
      
      doRenderBody() {
          this.$body.empty().append($(template));
      }   
      
      async refreshWithNote(note) {
          this.toggleInt(false);                
          this.triggerCommand("reEvaluateRightPaneVisibility");
          this.toggleInt(true);
          this.triggerCommand("reEvaluateRightPaneVisibility");
      }
  }

  module.exports = new ToDoListWidget();</code></pre>
          <p>The implementation is in <code>src/public/app/widgets/right_panel_widget.js</code>.</p>
        </div>
      </div>


blobId: yZRL3IDcl60arVgNUfTN
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.235Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>In <code>doRender()</code>:</p><pre><code class="language-text-plain">this.cssBlock(`#my-widget {
  	position: absolute;
      bottom: 40px;
      left: 60px;
      z-index: 1;
  }`)</code></pre>
          <hr>
          <p>Reference: <a href="https://trilium.rocks/X7pxYpiu0lgU">https://trilium.rocks/X7pxYpiu0lgU</a>&nbsp;</p>
        </div>
      </div>


blobId: hCOh86Fzaa55JeBojFo0
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.240Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Trilium Notes allowed the use of Common.js module imports inside backend
            scripts, such as:</p><pre><code class="language-text-plain">const isBetween = require('dayjs/plugin/isBetween')
  api.dayjs.extend(isBetween)</code></pre>
          <p>For TriliumNext, the backend has been switched to use ESM which has a
            slightly more complicated syntax. Instead of <code>require</code> we now
            have <code>import</code> but which is asynchronous so it will require an <code>await</code>:</p><pre><code class="language-text-plain">const isBetween = (await import("dayjs/plugin/isBetween")).default;
  api.dayjs.extend(isBetween);</code></pre>
          <p>Note that <code>.default</code> is also usually needed to obtain the same
            behaviour as a CJS import. When in doubt, use <code>console.log</code> to
            see the output of the value returned by <code>await import</code>.</p>
        </div>
      </div>


blobId: nLUQC1YSk7fYBgnDErya
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.245Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Hard-coded links</h2>
          <p>Hard-coded links are present throughout the application, either in dialogs
            or in the source code as comments.</p>
          <p>You can identify these links by searching for:</p><pre><code class="language-text-plain">https://triliumnext.github.io/Docs/Wiki/</code></pre>
          <h2>Help buttons</h2>
          <p>There is a pattern of “?” buttons throughout the application which make
            use of the <code>data-help-page</code> attribute. Whenever these buttons
            are pressed, the user is redirected to the corresponding wiki page by prepending
            the wiki root URL to the <code>data-help-page</code> attribute.</p>
          <p>Since the current wiki has a different structure than the original, for
            example to link to <a href="https://github.com/TriliumNext/Docs/blob/main/Wiki/tree-concepts.md">https://github.com/TriliumNext/Docs/blob/main/Wiki/tree-concepts.md</a> the <code>data-help-page</code> attribute
            must be set to <code>tree-concepts.md</code>.</p>
          <p>For links to headings, simply add the heading after the <code>.md</code>: <code>tree-concepts.md#prefix</code>
          </p>
          <p>You can identify those by looking for:</p>
          <ul>
            <li><code>.attr("data-help-page"</code>
            </li>
            <li><code>data-help-page="</code>
            </li>
          </ul>
        </div>
      </div>


blobId: KCvaTWCXDPGLk1vRdd6K
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.249Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The user-facing documentation is available on a dedicated repository inside
            the organization: <a href="https://github.com/TriliumNext/Docs">https://github.com/TriliumNext/Docs</a>&nbsp;</p>
          <p>It is currently organized as a flat tree of MarkDown notes.</p>
          <p>The documentation started as an import of the existing upstream documentation
            in <a href="https://github.com/zadam/trilium/wiki">https://github.com/zadam/trilium/wiki</a>.</p>
          <p>The public documentation is available at <a href="https://triliumnext.github.io/Docs/Wiki">https://triliumnext.github.io/Docs/Wiki</a>.</p>
          <p>The repository is here: <a href="https://github.com/TriliumNext/Docs">https://github.com/TriliumNext/Docs</a>&nbsp;</p>
          <p>The documentation is stored as Markdown files and is meant to be imported
            into Trilium Notes and then exported back in, as per the README. However,
            it's also possible to modify the Markdown files manually and push the changes.</p>
          <p>The documentation is deployed automatically to GitHub Pages on every push
            on the <code>main</code> branch.</p>
        </div>
      </div>


blobId: YY9YC47A6OCGuP0DLyPN
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.258Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>There is a setup test that stores the authentication token so that it
            can be reused throughout all the tests.</p>
          <p>If tests fail due to being stuck on login, then it must be run.</p>
          <p>To run it manually press “all” near the “Status:” text on top-left of
            the window</p>
          <figure class="image">
            <img style="aspect-ratio:233/112;" src="api/attachments/kvAn8zjo0NIE/image/1_Setting up authentication_.png"
            width="233" height="112">
          </figure>
          <p>Then check “setup” and look for <code>auth.setup.ts</code> and press its
            corresponding Run button:</p>
          <figure class="image">
            <img style="aspect-ratio:235/223;" src="api/attachments/bXqU7XjyhxGy/image/Setting up authentication_.png"
            width="235" height="223">
          </figure>
        </div>
      </div>


blobId: KuGBkpHPD8rhcvDravUy
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.290Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>The integration tests do not use the same database as <code>npm run start-server</code>.
            Instead, the database is located <code>integration-tests/db/document.db</code>.</p>
          <h2>In-memory database</h2>
          <p>Even though we are running our own database, there is still the problem
            of one test affecting the content for the others or accidentally removing
            important test notes.</p>
          <p>To avoid this, the integration test server (run via <code>integration-mem-db</code>)
            loads the database from <code>integration-test</code> into memory and operates
            from there. That means that any changes done on the integration test server
            (port 8082) will not be persisted between restarts of the server.</p>
          <p>Another benefit of having the database in memory for tests is that they
            can run in parallel without the risk on interfering with each other.</p>
          <h2>How to make changes to the database</h2>
          <p>As mentioned previously, the database itself can be edited manually in
            order to add content that is relevant to the tests.</p>
          <p>In order to do so, run a separate integration test server with:</p><pre><code class="language-text-plain">npm run integration-edit-db</code></pre>
          <p>This will open up a server on port 8081 which can be used to alter the
            integration test DB. After finishing the desired changes, it's ideal to
            close the server to prevent any interferences with further running of tests.</p>
          <h2>The database is tracked by Git</h2>
          <p>This is intentional, meaning that any change to the database will mark
            the file as changed in Git as well. Some tests require a specific note
            and it would be too wasteful to have to recreate it via Playwright each
            time. Instead the content is added manually and then the tests operate
            directly on the said notes.</p>
          <p>In order to make the database easier to track, SQLite WAL was disabled
            but only for the integration database. This means that only the <code>.db</code> file
            is present and needs to be committed.</p>
          <h2>Cleaning up the database</h2>
          <p>It's recommended to clean up any deleted notes to avoid unnecessary changes
            being committed. To do so go to Recent Changes in the launcher and select
            “Erase deleted notes now”.</p>
          <p>It's also a good idea to go to Options → Advanced → Vacuum database to
            clean up it.</p>
        </div>
      </div>


blobId: nquew7XiB9AaMXaKDbQR
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.294Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>First-time run</h2>
          <p>Before starting Playwright, it has to be installed locally via:</p><pre><code class="language-text-plain">npx playwright install</code></pre>
          <h2>Starting the integration test server</h2>
          <p>There are two types of integration test servers:</p>
          <ul>
            <li><code>npm run integration-mem-db</code> will run a server with dev mode
              disabled.
              <ul>
                <li>This is usually what the end user will see when accessing a server instance.</li>
                <li>It will not test the Electron/desktop side of the application.</li>
                <li>Changes to the public scripts will not take effect until running <code>npm run webpack</code>.</li>
              </ul>
            </li>
            <li><code>npm run integration-mem-db-dev</code> will run a server with dev
              mode enabled.
              <ul>
                <li>This is usually what a dev sees when running <code>npm run start-server</code>.</li>
                <li>The difference with the production one is that the assets are loaded directly
                  from files and as such it does not require <code>npm run webpack</code> to
                  see changes.</li>
              </ul>
            </li>
          </ul>
          <p>Either options will open up a server on <a href="http://localhost:8082">localhost:8082</a> that
            can be accessed either manually via the browser or via Playwright.</p>
          <p>When asked for a password, the password is <code>demo1234</code>.</p>
          <h2>Starting the interactive test runner</h2>
          <p>After starting the integration test server, to run the Playwright UI,
            run in the terminal:</p><pre><code class="language-text-plain">npx playwright test --ui</code></pre>
          <p>It is also possible to run the interactive code generator instead:</p><pre><code class="language-text-plain">npx playwright codegen</code></pre>
        </div>
      </div>


blobId: Fg5YkM4WmydZ5DjKK5BF
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.299Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Clone the repository</h2>
          <p>To set up the repository:</p><pre><code class="language-text-plain">git clone https://github.com/TriliumNext/trilium-ckeditor5.git</code></pre>
          <h2>Install dependencies</h2>
          <p>First, install root dependencies:</p><pre><code class="language-text-x-trilium-auto">cd trilium-ckeditor5
  yarn install</code></pre>
          <p>Secondly, install the Trilium build dependencies:</p><pre><code class="language-text-x-trilium-auto">cd packages/ckeditor5-build-trilium
  yarn install</code></pre>
          <p>To trigger the build, see&nbsp;<a class="reference-link" href="#root/4s2JWEEzwx6h">Building the editor</a>.</p>
        </div>
      </div>


blobId: FyCrTYThOlwQbXDAqXyg
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.301Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>First, make sure&nbsp;<a class="reference-link" href="#root/oSJs8Ei9nAEp">Environment setup</a>&nbsp;is
            set up.</p>
          <h2>Trigger the build</h2><pre><code class="language-text-plain">cd packages/ckeditor5-build-trilium
  yarn build</code></pre>
          <p>This will trigger a change in the <code>build</code> directory.</p>
          <h2>Copy the build artifact to the main repo</h2>
          <p>Go to <code>packages/ckeditor5-build-balloon-trilium/build</code> and copy <code>ckeditor.js</code> and <code>ckeditor.js.map</code> to <code>libraries/ckeditor</code> in
            the <code>Notes</code> repository.</p>
          <p>An example shell command to copy it:</p><pre><code class="language-text-plain">cp build/ckeditor.* ~/Projects/TriliumNext/Notes/libraries/ckeditor/</code></pre>
          <h2>&nbsp;</h2>
        </div>
      </div>


blobId: wIukyGtYhWKXXCRlmpKm
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.305Z
content:
  <div class="content">
         

        <div class="ck-content">
          <ul>
            <li>Embeds <a href="https://github.com/isaul32/ckeditor5-math"><code><s>isaul32/ckeditor5-math</s></code></a>&nbsp;
              <a
              class="reference-link" href="#root/G3SCg0165PKB">ckeditor5-math</a>, which is a third-party plugin for adding math support.
                CKEditor itself also has a <a href="https://ckeditor.com/docs/ckeditor5/latest/features/math-equations.html">math plugin</a> with
                MathType and ChemType but it's premium-only.</li>
            <li>Zadam left a TODO in <code>findandreplaceUI</code>: <code>// FIXME: keyboard shortcut doesn't work: </code>
              <a
              href="https://github.com/ckeditor/ckeditor5/issues/10645"><code>https://github.com/ckeditor/ckeditor5/issues/10645</code>
                </a>
            </li>
            <li><code>packages\ckeditor5-build-balloon-block\src\mention_customization.js</code> introduces
              note insertion via <code>@</code> character.</li>
          </ul>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:19.51%;">
                  <col style="width:12.2%;">
                    <col style="width:22.25%;">
                      <col style="width:46.04%;">
              </colgroup>
              <thead>
                <tr>
                  <th>Affected file</th>
                  <th>Affected method</th>
                  <th>Changed in</th>
                  <th>Reason for change</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td rowspan="2"><code>packages/ckeditor5-mention/src/mentionui.ts</code>
                  </td>
                  <td><code>createRegExp()</code>
                  </td>
                  <td><code>6db05043be24bacf9bd51ea46408232b01a1b232</code> (added back)</td>
                  <td>Allows triggering the autocomplete for labels and attributes in the attribute
                    editor.</td>
                </tr>
                <tr>
                  <td><code>init()</code>
                  </td>
                  <td><code>55a63a1934efb9a520fcc2d69f3ce55ac22aca39</code>
                  </td>
                  <td>Allows dismissing @-mention permanently after pressing ESC, otherwise
                    it would automatically show up as soon as a space was entered.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>Checking the old repo</h2>
          <p>Use the following command to identify commits from Zadam:</p><pre><code class="language-text-x-trilium-auto">git log --oneline --author="adam" --all</code></pre>
          <p>It's best to run the command from zadam's fork of <code>trilium-ckeditor5</code> instead
            of the TriliumNext once since it might not contain all the unmerged branches.</p>
          <p>To show a filtered diff of a commit:</p><pre><code class="language-text-x-trilium-auto">git show d42e772783 -- ':!*yarn.lock' ':!*packages/ckeditor5-build-balloon-block/build/*' ':!*package.json'</code></pre>
        </div>
      </div>


blobId: 78Xfyq6BLYAKUS4xnnNJ
dateModified: 2025-03-09 12:18:55.626+0200
utcDateModified: 2025-03-09 10:18:56.309Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Before updating</h2>
          <p>Make sure that all the plugins are compatible with this version:&nbsp;
            <a
            class="reference-link" href="#root/5i50dAfKSoL9">Versions and external plugins</a>. If not, they will need to be updated
              to the same version as the one you are updating, by altering their <code>package.json</code>.</p>
          <p>If the plugin is external to the Trilium organisation, it needs to be
            forked first.</p>
          <h2>Environment setup</h2>
          <p>The first step is to add the CKEditor source as a remote. This only needs
            to be done once.</p><pre><code class="language-text-x-trilium-auto">git remote add upstream ssh://git@github.com/ckeditor/ckeditor5.git
  git fetch upstream</code></pre>
          <h2>Update steps</h2>
          <p>Due to how the repository is structured, updates to the CKEditor are a
            bit difficult.</p>
          <ol>
            <li><code>git fetch upstream</code>
            </li>
            <li>Pick a version and merge with it: <code>git merge -X theirs v99.2.0</code>
            </li>
            <li>When there are complicated conflicts, sometimes it's easier to take everything
              from the target version instead, for a given path: <code>git checkout v99.2.0 -- "packages/ckeditor5-list/**"</code>.</li>
            <li>Go in <code>packages/ckeditor5-build-trilium/package.json</code> and run <code>node sync-version.js</code> to
              update the <code>package.json</code> with the new versions. Review and commit
              the change.</li>
            <li>Follow again the dependency setup in&nbsp;<a class="reference-link" href="#root/oSJs8Ei9nAEp">Environment setup</a>,
              as they have changed.</li>
            <li><a href="#root/4s2JWEEzwx6h">Run the build</a> and check that
              it works.</li>
          </ol>
          <h2>Final steps</h2>
          <ol>
            <li>Start the TriliumNext server</li>
            <li>If updated to a newer version of CKEditor, check type <code>CKEDITOR_VERSION</code> in
              the browser/Electron console to ensure that the correct version is used.</li>
            <li>Do a basic sanity check as well.</li>
            <li>Commit and push the change on both sides (in the <code>trilium-ckeditor5</code> repo
              and in the <code>Notes</code> repo).</li>
          </ol>
          <h2>Troubleshooting client side errors</h2>
          <p>These errors might show up when testing the Trilium app:</p><pre><code class="language-text-x-trilium-auto">ReferenceError: CKEditor is not defined</code></pre>
          <p>Usually this is a side effect of another error, check the logs carefully
            to see if there is any other related error (perhaps a <code>CKEditorError</code>).</p>
          <hr><pre><code class="language-text-x-trilium-auto">Uncaught error: Message: CKEditorError: ckeditor-duplicated-modules</code></pre>
          <p>Most likely cause is one of the external plugins is incompatible with
            this version.</p>
          <p>For example, to disable the Math plugin, go to <code>packages/ckeditor5-build-trilium/src/config.ts</code> and
            modify:</p><pre><code class="language-text-x-diff">-import Math from '@triliumnext/ckeditor5-math/src/math';
  -import AutoformatMath from '@triliumnext/ckeditor5-math/src/autoformatmath';

  export const COMMON_PLUGINS = [
  -	Math,
  -	AutoformatMath,
  ]</code></pre>
          <p>In this case, make sure to align the version of all the external plugins
            with the one you are updating to, usually by forking the external plugin
            and updating its versions.</p>
        </div>
      </div>


