# blobs

blobId: 3xlfKxXMDGlYh7fFqS82
dateModified: 2025-03-09 11:14:35.070+0200
utcDateModified: 2025-03-09 09:14:35.071Z
content:
  <p>This guide outlines the steps to install Trilium on your own server. You might consider this option if you want to set up <a href="#root/cbkrhQjrkKrh">synchronization</a> or use Trilium in a browser - accessible from anywhere.</p><h2>Installation Options</h2><p>There are several ways to install Trilium on a server, each with its own advantages:</p><ul><li><strong>Recommended</strong>: <a href="#root/rWX5eY045zbE">Docker Installation</a> - Available for <strong>AMD64</strong> and <strong>ARM</strong> architectures.</li><li><a href="#root/3tW6mORuTHnB">Packaged Server Installation</a></li><li><a href="https://www.pikapods.com/pods?run=trilium-next">PikaPods managed hosting</a></li><li><a href="#root/J1Bb6lVlwU5T">Manual Installation</a></li><li><a href="#root/DCmT6e7clMoP">Kubernetes</a></li><li><a href="https://www.cloudron.io/store/com.github.trilium.cloudronapp.html">Cloudron</a></li><li><a href="https://homelabos.com/docs/software/trilium/">HomelabOS</a></li><li><a href="#root/moVgBcoxE3EK">NixOS Module</a></li></ul><p>The server installation includes both web and <a href="#root/RDslemsQ6gCp">mobile frontends</a>.</p><h2>Configuration</h2><p>After setting up your server installation, you may want to configure settings such as the port or enable <a href="#root/l2VkvOwUNfZj">TLS</a>. Configuration is managed via the Trilium <code>config.ini</code> file, which is located in the <a href="#root/tAassRL4RSQL">data directory</a> by default. To begin customizing your setup, copy the provided <code>config-sample.ini</code> file with default values to <code>config.ini</code>.</p><p>You can also review the <a href="#root/Gzjqa934BdH4">configuration</a> file to provide all <code>config.ini</code> values as environment variables instead.</p><h3>Config Location</h3><p>By default, <code>config.ini</code>, the <a href="#root/wX4HbRucYSDD">database</a>, and other important Trilium data files are stored in the <a href="#root/tAassRL4RSQL">data directory</a>. If you prefer a different location, you can change it by setting the <code>TRILIUM_DATA_DIR</code> environment variable:</p><pre><code class="language-text-x-trilium-auto">export TRILIUM_DATA_DIR=/home/myuser/data/my-trilium-data</code></pre><h3>Disabling Authentication</h3><p>If you are running Trilium on localhost only or if authentication is handled by another component, you can disable Trilium’s authentication by adding the following to <code>config.ini</code>:</p><pre><code class="language-text-x-trilium-auto">[General]
  noAuthentication=true</code></pre><h2>Reverse Proxy Setup</h2><p>To configure a reverse proxy for Trilium, you can use either <strong>nginx</strong> or <strong>Apache</strong>.</p><h3>nginx</h3><p>Add the following configuration to your <code>nginx</code> setup to proxy requests to Trilium:</p><pre><code class="language-text-x-trilium-auto">location /trilium/ {
      proxy_pass http://127.0.0.1:8080/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
  }</code></pre><p>To avoid limiting the size of payloads, include this in the <code>server {}</code> block:</p><pre><code class="language-text-x-trilium-auto"># Set to 0 for unlimited. Default is 1M.
  client_max_body_size 0;</code></pre><h3>Apache</h3><p>For an Apache setup, refer to the <a href="#root/fDLvzOx29Pfg">Apache proxy setup</a> guide.</p>


blobId: 0lyXgWxyXc4NW2Dl1fiX
dateModified: 2025-03-09 11:14:42.383+0200
utcDateModified: 2025-03-09 09:14:42.384Z
content:
  <h2>Sharing Notes</h2><p>Trilium allows you to share selected notes as <strong>publicly accessible</strong> read-only documents. This feature is particularly useful for publishing content directly from your Trilium notes, making it accessible to others online.</p><h2>Prerequisites</h2><p>To use the sharing feature, you must have a <a href="#root/WOcw2SLH6tbX">server installation</a> of Trilium. This is necessary because the notes will be hosted from the server.</p><h2>How to Share a Note</h2><ol><li><p><strong>Enable Sharing</strong>: To share a note, toggle the <code>Shared</code> switch within the note's interface. Once sharing is enabled, an URL will appear, which you can click to access the shared note.</p><p><img src="api/images/5GcxcE9fP9xX/share-single-note.png" alt="Share Note"></p></li><li><p><strong>Access the Shared Note</strong>: The link provided will open the note in your browser. If your server is not configured with a public IP, the URL will refer to <code>localhost (127.0.0.1)</code>.</p><p><img src="api/images/Ky3qOJJMZ731/share-single-note-web.png" alt="Shared Note Example"></p></li></ol><h2>Sharing a Note Subtree</h2><p>When you share a note, you actually share the entire subtree of notes beneath it. If the note has child notes, they will also be included in the shared content. For example, sharing the "Formatting" subtree will display a page with basic navigation for exploring all the notes within that subtree.</p><p><img src="api/images/lCtZz2Z59wPT/share-multiple-notes-web.png" alt="Shared Subtree Example"></p><h2>Viewing All Shared Notes</h2><p>You can view a list of all shared notes by clicking on "Show Shared Notes Subtree." This allows you to manage and navigate through all the notes you have made public.</p><h2>Security Considerations</h2><p>Shared notes are published on the open internet and can be accessed by anyone with the URL. The URL's randomness does not provide security, so it is crucial not to share sensitive information through this feature.</p><h3>Password Protection</h3><p>To protect shared notes with a username and password, you can use the <code>#shareCredentials</code> attribute. Add this label to the note with the format <code>#shareCredentials="username:password"</code>. To protect an entire subtree, make sure the label is <a href="#root/bwZpz2ajCEwO">inheritable</a>.</p><h2>Advanced Sharing Options</h2><h3>Customizing the Appearance of Shared Notes</h3><p>The default shared page is basic in design, but you can customize it using your own CSS:</p><ul><li><strong>Custom CSS</strong>: Link a CSS <a href="#root/6f9hih2hXXZk">code note</a> to the shared page by adding a <code>~shareCss</code> relation to the note. If you want this style to apply to the entire subtree, make the label inheritable. You can hide the CSS code note from the tree navigation by adding the <code>#shareHiddenFromTree</code> label.</li><li><strong>Omitting Default CSS</strong>: For extensive styling changes, use the <code>#shareOmitDefaultCss</code> label to avoid conflicts with Trilium's <a href="#root/Wy267RK4M69c">default stylesheet</a>.</li></ul><h3>Adding JavaScript</h3><p>You can inject custom JavaScript into the shared note using the <code>~shareJs</code> relation. This allows you to access note attributes or traverse the note tree using the <code>fetchNote()</code> API, which retrieves note data based on its ID.</p><p>Example:</p><pre><code class="language-application-javascript-env-backend">const currentNote = await fetchNote();
  const parentNote = await fetchNote(currentNote.parentNoteIds[0]);

  for (const attr of parentNote.attributes) {
      console.log(attr.type, attr.name, attr.value);
  }</code></pre><h3>Creating Human-Readable URL Aliases</h3><p>Shared notes typically have URLs like <code>http://domain.tld/share/knvU8aJy4dJ7</code>, where the last part is the note's ID. You can make these URLs more user-friendly by adding the <code>#shareAlias</code> label to individual notes (e.g., <code>#shareAlias=highlighting</code>). This will change the URL to <code>http://domain.tld/share/highlighting</code>.</p><p><strong>Important</strong>:</p><ol><li>Ensure that aliases are unique.</li><li>Using slashes (<code>/</code>) within aliases to create subpaths is not supported.</li></ol><h3>Viewing and Managing Shared Notes</h3><p>All shared notes are grouped under an automatically managed "Shared Notes" section. From here, you can view, share, or unshare notes by moving or cloning them within this section.</p><p><img src="api/images/jEQNvpyaXIWE/shared-list.png" alt="Shared Notes List"></p><h3>Setting a Custom Favicon</h3><p>To customize the favicon for your shared pages, create a relation <code>~shareFavicon</code> pointing to a file note containing the favicon (e.g., in <code>.ico</code> format).</p><h3>Sharing a Note as the Root</h3><p>You can designate a specific note or folder as the root of your shared content by adding the <code>#shareRoot</code> label. This note will be linked when visiting <code>[http://domain.tld/share](http://domain/share)</code>, making it easier to use Trilium as a fully-fledged website. Consider combining this with the <code>#shareIndex</code> label, which will display a list of all shared notes.</p><h2>Additional Options</h2><ul><li><strong>Raw Note Sharing</strong>: Use the <code>#shareRaw</code> label to share a note without any HTML wrapper.</li><li><strong>Disallow Robot Indexing</strong>: Add the <code>#shareDisallowRobotIndexing</code> label to prevent search engines from indexing the shared page by including a <code>noindex, follow</code> meta tag and <code>X-Robots-Tag: noindex</code> header.</li><li><strong>Shared Notes Index</strong>: For text notes with the <code>#shareIndex</code> label, the content will display a list of all shared note roots.</li></ul><h2>Limitations</h2><p>While the sharing feature is powerful, it has some limitations:</p><ul><li><strong>No Relation Map Support</strong></li><li><strong>Book Notes</strong>: Only show a list of child notes.</li><li><strong>Code Notes</strong>: No syntax highlighting.</li><li><strong>Static Note Tree</strong></li><li><strong>Protected Notes</strong>: Cannot be shared.</li><li><strong>Include Notes</strong>: Not supported.</li></ul><p>Some of these limitations may be addressed in future updates.</p>


blobId: Y7jCAnZI6RY3DTNaII6B
dateModified: 2025-03-09 11:14:53.728+0200
utcDateModified: 2025-03-09 09:14:53.728Z
content:
  <p>Task Manager is a <a href="#root/OFXdgB2nNk1F">promoted attributes</a> and <a href="#root/CdNpE2pqjmI6">scripts</a> showcase present in the <a href="#root/wX4HbRucYSDD">demo notes</a>.</p><h2>Demo</h2><p><img src="api/images/92KeXdKh3Ca1/task-manager.png" alt=""></p><p>Task Manager manages outstanding (TODO) tasks and finished tasks (non-empty doneDate attribute). Outstanding tasks are further categorized by location and arbitrary tags - whenever you change tag attribute in the task note, this task is then automatically moved to appropriate location.</p><p>Task Manager also integrates with <a href="#root/l0tKav7yLHGF">day notes</a> - notes are <a href="#root/IakOLONlIfGI">cloned</a> into day note to both todoDate note and doneDate note (with <a href="#root/kBrnXNG3Hplm">prefix</a> of either "TODO" or "DONE").</p><h2>Implementation</h2><p>New tasks are created in the TODO note which has <code>~child:template</code> <a href="#root/zEY4DaJG4YT5">relation</a> (see <a href="#root/bwZpz2ajCEwO">attribute inheritance</a>) pointing to the task template.</p><h3>Attributes</h3><p>Task template defines several <a href="#root/OFXdgB2nNk1F">promoted attributes</a> - todoDate, doneDate, tags, location. Importantly it also defines <code>~runOnAttributeChange</code> relation - <a href="#root/GPERMystNGTB">event</a> handler which is run on attribute change. This <a href="#root/CdNpE2pqjmI6">script</a> handles when e.g. we fill out the doneDate attribute - meaning the task is done and should be moved to "Done" note and removed from TODO, locations and tags.</p><h3>New task button</h3><p>There's also "button" note which contains simple script which adds a button to create new note (task) in the TODO note.</p><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({
      title: 'New task',
      icon: 'check',
      shortcut: 'alt+n',
      action: async () =&gt; {
          // creating notes is backend (server) responsibility so we need to pass
          // the control there
          const taskNoteId = await api.runOnBackend(async () =&gt; {
              const todoRootNote = await api.getNoteWithLabel('taskTodoRoot');
              const {note} = await api.createNote(todoRootNote.noteId, 'new task', '');

              return note.noteId;
          });

          // we got an ID of newly created note and we want to immediatelly display it
          await api.activateNewNote(taskNoteId);
      }
  });</code></pre><h3>CSS</h3><p>In the demo screenshot above you may notice that TODO tasks are in red color and DONE tasks are green.</p><p>This is done by having this CSS <a href="#root/6f9hih2hXXZk">code note</a> which defines extra CSS classes:</p><pre><code class="language-text-x-trilium-auto">span.fancytree-node.todo .fancytree-title {
      color: red !important;
  }

  span.fancytree-node.done .fancytree-title {
      color: green !important;
  }</code></pre><p>This <a href="#root/6f9hih2hXXZk">code note</a> has <code>#appCss</code> <a href="#root/zEY4DaJG4YT5">label</a> which is recognized by Trilium on startup and loaded as CSS into the application.</p><p>Second part of this functionality is based in event handler described above which assigns <code>#cssClass</code> label to the task to either "done" or "todo" based on the task status.</p>


blobId: cWfJ88AI9yeiGCg8HI2r
dateModified: 2025-03-09 11:14:58.947+0200
utcDateModified: 2025-03-09 09:14:58.948Z
content:
  <p>A template in Trilium serves as a predefined structure for other notes, referred to as instance notes. Assigning a template to a note brings three main effects:</p><ol><li><strong>Attribute Inheritance</strong>: All attributes from the template note are <a href="#root/bwZpz2ajCEwO">inherited</a> by the instance notes. Even attributes with <code>#isInheritable=false</code> are inherited by the instance notes, although only inheritable attributes are further inherited by the children of the instance notes.</li><li><strong>Content Duplication</strong>: The content of the template note is copied to the instance note, provided the instance note is empty at the time of template assignment.</li><li><strong>Child Note Duplication</strong>: All child notes of the template are deep-duplicated to the instance note.</li></ol><h2>Example</h2><p>A typical example would be a "Book" template note, which might include:</p><ul><li><strong>Promoted Attributes</strong>: Such as publication year, author, etc. (see <a href="#root/OFXdgB2nNk1F">promoted attributes</a>).</li><li><strong>Outline</strong>: An outline for a book review, including sections like themes, conclusion, etc.</li><li><strong>Child Notes</strong>: Additional notes for highlights, summary, etc.</li></ul><p><img src="api/images/Y8kzZ5MSZLCC/template.png" alt="Template Example"></p><h2>Instance Note</h2><p>An instance note is a note related to a template note. This relationship means the instance note's content is initialized from the template, and all attributes from the template are inherited.</p><p>To create an instance note through the UI:</p><p><img src="api/images/uuGrYX41lWN0/template-create-instance-note.png" alt="show child note templates"></p><p>For the template to appear in the menu, the template note must have the <code>#template</code> label. Do not confuse this with the <code>~template</code> relation, which links the instance note to the template note. If you use <a href="#root/9sRHySam5fXb">workspaces</a>, you can also mark templates with <code>#workspaceTemplate</code> to display them only in the workspace.</p><p>Templates can also be added or changed after note creation by creating a <code>~template</code> relation pointing to the desired template note.</p><h2>Additional Notes</h2><p>From a visual perspective, templates can define <code>#iconClass</code> and <code>#cssClass</code> attributes, allowing all instance notes (e.g., books) to display a specific icon and CSS style.</p><p>Explore the concept further in the <a href="#root/wX4HbRucYSDD">demo notes</a>, including examples like the <a href="#root/iRwzGnHPzonm">Relation Map</a>, <a href="#root/xYjQUYhpbUEW">Task Manager</a>, and <a href="#root/l0tKav7yLHGF">Day Notes</a>.</p><p>Additionally, see <a href="#root/47ZrP6FNuoG8">default note title</a> for creating title templates. Note templates and title templates can be combined by creating a <code>#titleTemplate</code> for a template note.</p>


blobId: 62PB338WbqTDurjnSICe
dateModified: 2025-03-09 11:15:05.216+0200
utcDateModified: 2025-03-09 09:15:05.217Z
content:
  <p>Trilium utilizes the powerful <a href="https://ckeditor.com/ckeditor-5/">CKEditor 5</a> as its text editing component.</p><h2>Formatting Options</h2><p>The Trilium text note interface does not display toolbars or formatting options by default. These can be accessed by:</p><p><img src="api/images/FtmPLgGmgZVC/text-notes-formatting-inline.png" alt="inline note formatting"></p><ol><li>Selecting text to bring up an inline toolbar.</li></ol><p><img src="api/images/oRWfJLUbb7j7/text-notes-formatting-block.png" alt="formating note block"> 2. Clicking on the block toolbar.</p><h2>Read-Only vs. Editing Mode</h2><p>Text notes are usually opened in edit mode. However, they may open in read-only mode under the following circumstances:</p><ul><li>The note is long and would take time to load, so it is opened in read-only mode by default for quicker access.</li><li>The note has a <code>readOnly</code> <a href="#root/zEY4DaJG4YT5">label</a>.</li></ul><p>In both cases, it is possible to switch back to editable mode using [Edit note] <img src="api/images/hKNMMxsbCuE8/bx-edit-alt.svg" alt="edit-alt icon"> at top right of page.</p><h2>General Formatting</h2><p>Since Trilium uses CKEditor, all of its formatting options are available here. You may use the graphical toolbar shown above, or enter formatting such as markdown markdown directly in the text. Examples include:</p><ul><li><strong>Bold</strong>: Type <code>**text**</code> or <code>__text__</code></li><li><i>Italic</i>: Type <code>*text*</code> or <code>_text_</code></li><li><code>Code</code>: Type `text`</li><li><s>Strikethrough</s>: Type <code>~~text~~</code></li></ul><h3>Lists</h3><ul><li>Bulleted list: Start a line with <code>*</code> or <code>-</code> followed by a space</li><li>Numbered list: Start a line with <code>1.</code> or <code>1)</code> followed by a space</li><li>To-do list: Start a line with <code>[ ]</code> for an unchecked item or <code>[x]</code> for a checked item</li></ul><h3>Blocks</h3><ul><li>Block quote: Start a line with <code>&gt;</code> followed by a space</li></ul><h3>Multi-Line Code Blocks</h3><p>To create a multi-line code block, start a line with "```[lang]", for example:</p><pre><code class="language-text-x-trilium-auto">if (1 &gt; 2) {
      console.log("Error in the matrix");
  }</code></pre><h3>Headings</h3><p>Create headings by starting a line with <code>##</code> for heading 2, <code>###</code> for heading 3, and so on up to heading 6. Note that <code>#</code> is reserved for the title.</p><h3>Horizontal Line</h3><p>Insert a horizontal line by starting a line with <code>---</code>.</p><h2>Markdown &amp; Autoformat</h2><p>CKEditor supports a markdown-like editing experience, recognizing syntax and automatically converting it to rich text.</p><p>Complete documentation for this feature is available in the <a href="https://ckeditor.com/docs/ckeditor5/latest/features/autoformat.html">CKEditor documentation</a>.</p><p>If autoformatting is not desirable, press <code>CTRL-Z</code> to revert the text to its original form.</p><p>Note: The use of <code>#</code> for Heading 1 is not supported because it is reserved for the title. Start with <code>##</code> for Heading 2. More information is available <a href="https://ckeditor.com/docs/ckeditor5/latest/features/headings.html#heading-levels">here</a>.</p><h2>Math Support</h2><p>Trilium provides math support through <a href="https://katex.org/">KaTeX</a>.</p><h2>Cutting Selection to Sub-Note</h2><p>When editing a document that becomes too large, you can split it into sub-notes:</p><ol><li>Select the desired text and cut it to the clipboard.</li><li>Create a new sub-note and name it.</li><li>Paste the content from the clipboard into the sub-note.</li></ol><p>Trilium can automate this process. Select some text within the note, and in the selection toolbar, click the scissors icon for the "cut &amp; pasted selection to sub-note" action. The heading is automatically detected and the new sub-note is named accordingly. You can also assign a keyboard shortcut for this action. This functionality is available through the block toolbar icon.</p><h2>Including a Note</h2><p>Text notes can "include" another note as a read only widget. This can be useful for e.g. including a dynamically generated chart (from scripts &amp; "render HTML" note) or other more advanced use cases.</p><p>This functionality is available in the block toolbar icon.</p>


blobId: p9iZtrFzC6cBgmHCoBTl
dateModified: 2025-03-09 11:15:16.575+0200
utcDateModified: 2025-03-09 09:15:16.576Z
content:
  <p>These are user-created themes which were made publicly available:</p><figure class="table"><table><thead><tr><th>&nbsp;</th><th>&nbsp;</th></tr></thead><tbody><tr><td><a href="https://github.com/tobealive/trilium-midnight-theme">Midnight</a>&nbsp;<br>👤 <a href="https://github.com/tobealive">tobealive</a> <img src="api/images/n8jf8SqQoJX7/Theme-Gallery image.jpg" alt=""></td><td><a href="https://github.com/tobealive/trilum-eote-theme">EOTE</a>&nbsp;<br>👤 <a href="https://github.com/tobealive">tobealive</a> <img src="api/images/4TnJ8zOCDGha/Theme-Gallery preview.jpg" alt=""></td></tr><tr><td><a href="https://github.com/Abourass/TriliumThemes">Trilium Themes</a>&nbsp;<br>👤 <a href="https://github.com/Abourass">Abourass</a>&nbsp;<br><img src="https://camo.githubusercontent.com/ec9eb12d0f9792a93a87ff2d50c8e0ffafd42359878885e9e8d6498ec34510fe/68747470733a2f2f692e696d6775722e636f6d2f3666466e4d75422e706e67" alt="">&nbsp;<br><img src="https://camo.githubusercontent.com/745dd535b982e24b305b35e7ed42d3b4d4dcefac9ae8bd1ed9cceda83b5d1d8a/68747470733a2f2f692e696d6775722e636f6d2f7a4873513363792e706e67" alt=""> <img src="https://camo.githubusercontent.com/8dfbcc44a82f8780d8e2f4e4621b9447f499db2667dce9a220393def28e384dd/68747470733a2f2f692e696d6775722e636f6d2f444d5437784f702e706e67" alt=""> <img src="https://camo.githubusercontent.com/461416d49050e9e4415e4fe5315e2ea6987485d01a624c6d23203f78be33864b/68747470733a2f2f692e696d6775722e636f6d2f616852573667682e706e67" alt=""></td><td><a href="https://github.com/ZMonk91/Material-Dark-Trilium">MaterialDark</a>&nbsp;<br>👤 <a href="https://github.com/ZMonk91">ZMonk91</a>&nbsp;<br><img src="https://camo.githubusercontent.com/3486f3d96d823468163a5f968b4b201254b6fd06164321551880c3de6353eeed/68747470733a2f2f692e696d6775722e636f6d2f5a65584635474c2e706e67" alt=""></td></tr><tr><td><a href="https://github.com/jaroet/trilium-theme-lightslategray">lightslategray</a>&nbsp;<br>👤 <a href="https://github.com/jaroet">jaroet</a>&nbsp;<br><img src="api/images/M5AfsroPw5fY/Theme-Gallery_lightslategray.p" alt=""></td><td><a href="https://github.com/raphwriter/trilium-theme-melon">melon-4</a>&nbsp;<br>👤 <a href="https://github.com/raphwriter">raphwriter</a>&nbsp;<br><img src="api/images/TVrD3YF7Gik7/Theme-Gallery scrn4 01.png" alt=""></td></tr><tr><td><a href="https://github.com/Engr-AllanG/trilium-themes">Neon_Dark</a>&nbsp;<br>👤 <a href="https://github.com/Engr-AllanG">Engr-AllanG</a>&nbsp;<br><img src="api/images/FmjaFiafUjXz/Theme-Gallery Neon Dark Demo v.jpeg" alt=""></td><td><a href="https://github.com/Engr-AllanG/trilium-themes">Coder_Dark</a>&nbsp;<br>👤 <a href="https://github.com/Engr-AllanG">Engr-AllanG</a>&nbsp;<br><img src="api/images/OuVPMXnRDYKE/Theme-Gallery Trilium theme co.png" alt=""></td></tr><tr><td><a href="https://github.com/idelem/trilium-theme-velvet">velvet</a>&nbsp;<br>👤 <a href="https://github.com/idelem">idelem</a>&nbsp;<br><img src="api/images/whCBpOQxXKhy/Theme-Gallery_trilium-velvet2." alt=""></td><td><a href="https://github.com/SADAVA/trilium-notes-theme-dark-plus">Dark Plus</a>&nbsp;<br>👤 <a href="https://github.com/SADAVA">SADAVA</a>&nbsp;<br><img src="api/images/nC3Hg1AJIhTo/Theme-Gallery Screenshot.png" alt=""></td></tr><tr><td><a href="https://github.com/WKSu/trilium-solarized-theme">Solarized</a>&nbsp;<br>👤 <a href="https://github.com/WKSu">WKSu</a>&nbsp;<br><img src="api/images/15Gf2f3PIMTw/Theme-Gallery image.png" alt=""></td><td><a href="https://github.com/en3r0/Trilium-Nord-Theme">Nord</a>&nbsp;<br>👤 <a href="https://github.com/en3r0">en3r0</a>&nbsp;<br><img src="api/images/QM1v2wdzWNnE/1 Theme-Gallery image.png" alt=""></td></tr><tr><td><a href="https://github.com/AllanZyne/trilium-bear-theme">Bear Note Light</a>&nbsp;<br>👤 <a href="https://github.com/AllanZyne">AllanZyne</a>&nbsp;<br><img src="api/images/MVcQzNVmZyFd/Theme-Gallery bear-white.png" alt=""></td><td><a href="https://github.com/AllanZyne/trilium-bear-theme">Bear Note Dark</a>&nbsp;<br>👤 <a href="https://github.com/AllanZyne">AllanZyne</a>&nbsp;<br><img src="api/images/qdZIFMQZGVQ9/Theme-Gallery bear-dark.png" alt=""></td></tr><tr><td><a href="https://github.com/Sebiann/miku-hatsune-trilium-theme">Miku Hatsune</a>&nbsp;<br>👤 <a href="https://github.com/Sebiann">Sebiann</a>&nbsp;<br><img src="api/images/Mwzz6lCQC1tg/2 Theme-Gallery image.png" alt=""></td><td><a href="https://github.com/cwilliams5/Midnight-Trilium-Dark-Mode">Midnight</a>&nbsp;<br>👤 <a href="https://github.com/cwilliams5">cwilliams5</a>&nbsp;<br><img src="api/images/n1cdrxT0ZfDh/Theme-Gallery midnight.png" alt=""></td></tr><tr><td><a href="https://github.com/SiriusXT/trilium-theme-blue">Blue</a> (light)&nbsp;<br>👤 <a href="https://github.com/SiriusXT">SiriusXT</a>&nbsp;<br><img src="api/images/SeHYoNHYMP1q/Theme-Gallery screenshot1.png" alt=""></td><td><a href="https://github.com/SiriusXT/trilium-theme-blue">Blue</a> (dark)&nbsp;<br>👤 <a href="https://github.com/SiriusXT">SiriusXT</a>&nbsp;<br><img src="api/images/Gshl6zDUd0YK/Theme-Gallery screenshot2.png" alt=""></td></tr></tbody></table></figure><p>If you would like to add your theme to this gallery, write a new post in <a href="https://github.com/TriliumNext/Notes/discussions/categories/show-and-tell">👐 Show and tell</a>.</p>


blobId: ueuDcUJjnrvRFtvqFBx1
dateModified: 2025-03-09 11:15:24.116+0200
utcDateModified: 2025-03-09 09:15:24.116Z
content:
  <h2>Default Themes</h2><p>Trilium comes with a couple pre-installed color themes, with the default being a light theme. To switch to a dark theme or any other available theme, navigate to the Options menu (accessible via the app icon in the top-left corner), select the Appearance tab, and choose your preferred theme.</p><p><img src="api/images/zaQnUsJTbvjr/dark-theme.png" alt="Dark Theme"></p><h2>Creating Custom CSS Themes</h2><p>Trilium supports custom user themes, allowing you to personalize the application's appearance. To create a custom theme, follow these steps:</p><ol><li><strong>Create a CSS Code Note</strong>: Start by creating a new <a href="#root/6f9hih2hXXZk">code note</a> with the <code>CSS</code> type.</li><li><strong>Annotate with </strong><code><strong>#appTheme</strong></code>: Add the <a href="#root/zEY4DaJG4YT5">attribute</a> <code>#appTheme=my-theme-name</code> to your note, where <code>my-theme-name</code> is the name of your custom theme.</li><li><strong>Define Your Styles</strong>: Write your custom CSS within the note. Below is an example of a custom theme:</li></ol><pre><code class="language-text-css">@font-face {
    font-family: 'Raleway';
    font-style: normal;
    font-weight: 400;
    src: url('/custom/fonts/raleway.woff2') format('woff2');
  }

  :root {
      --main-font-family: 'Raleway' !important;
      --main-font-size: normal;
      --tree-font-family: inherit;
      --tree-font-size: normal;
      --detail-font-family: inherit;
      --detail-font-size: normal;
      --detail-text-font-family: 'Garamond' !important;

      --main-background-color: #404552;
      --main-text-color: #AFB8C6;
      --main-border-color: #AFB8C6;
      --accented-background-color: #383C4A;
      --more-accented-background-color: #2F343F;
      --header-background-color: #383C4A;
      --button-background-color: #2F343F;
      --button-disabled-background-color: #404552;
      --button-border-color: #333;
      --button-text-color: #AFB8C6;
      --button-border-radius: 2px;
      --primary-button-background-color: #6c757d;
      --primary-button-text-color: white;
      --primary-button-border-color: #6c757d;
      --muted-text-color: #86919F;
      --input-text-color: #AFB8C6;
      --input-background-color: #404552;
      --hover-item-text-color: white;
      --hover-item-background-color: #4877B1;
      --active-item-text-color: white;
      --active-item-background-color: #4877B1;
      --menu-text-color: #AFB8C6;
      --menu-background-color: #383C4A;
      --tooltip-background-color: #383C4A;
      --link-color: lightskyblue;
      --modal-background-color: #404552;
      --modal-backdrop-color: black;
      --scrollbar-border-color: rgba(175, 184, 198, 0.5);
  }

  body .note-detail-text {
      font-size: 120%;
  }

  body .CodeMirror {
      filter: invert(100%) hue-rotate(180deg);
  }</code></pre><h3>Activating Your Custom Theme</h3><p>Once you've created your custom theme:</p><ol><li>Go to "Menu" -&gt; "Options" -&gt; "Appearance."</li><li>In the theme selection dropdown, you should see your custom theme listed under the name you provided with the <code>#appTheme</code> <a href="#root/zEY4DaJG4YT5">label</a>.</li><li>Select your custom theme to activate it.</li></ol><p>If you make changes to your theme, press <code>CTRL-R</code> to reload the frontend and apply your updates.</p><h3>Sharing and Importing Themes</h3><p>Custom themes can be exported as <code>.tar</code> archives, which can be shared with other users. However, be cautious when importing themes from untrusted sources, as they may contain executable scripts that could pose security risks.</p><p>An example user theme, <i>Steel Blue</i>, is available in the <a href="#root/xjSsCcvVZf6H">demo document</a>.</p><p><img src="api/images/uVF9DAmAmEWC/steel-blue.png" alt="Steel Blue Theme"></p><h3>Using Custom CSS for Specific Purposes</h3><p>In addition to full themes, Trilium allows for custom CSS that isn't tied to a theme. This can be particularly useful in scripting contexts, where you might want to modify specific UI elements, such as changing the colors of notes in the tree view.</p><h3>Applying Custom CSS</h3><p>To use custom CSS:</p><ol><li><strong>Create a CSS Code Note</strong>: Create a new <a href="#root/6f9hih2hXXZk">code note</a> with the <code>CSS</code> type.</li><li><strong>Add the </strong><code><strong>appCss</strong></code><strong> Label</strong>: Annotate the note with the <code>#appCss</code> <a href="#root/zEY4DaJG4YT5">label</a>.</li><li><strong>Write Your CSS</strong>: Add your custom CSS rules to the note.</li></ol><p>For example:</p><pre><code class="language-text-css">/* Custom CSS to style specific elements */
  .tree-item {
      color: #ff6347; /* Change tree item color */
  }</code></pre><p>When Trilium's frontend starts, all notes labeled with <code>appCss</code> are automatically included in the style element of the HTML page.</p><p>After making changes, press <code>CTRL-R</code> to reload the frontend and apply your new styles.</p><p><img src="api/images/loUkLR5Mp7Ap/app-css.png" alt="Applying Custom CSS"></p><h3>Styling Specific Notes in the Tree</h3><p>To apply specific styles to certain notes in the tree:</p><ul><li><strong>Use the </strong><code><strong>cssClass</strong></code><strong> Attribute</strong>: Add the <code>cssClass</code> <a href="#root/zEY4DaJG4YT5">attribute</a> to a note, and assign it a value representing the desired CSS class.</li><li><strong>Define an </strong><code><strong>iconClass</strong></code>: You can also define a custom icon for a note using the <code>iconClass</code> attribute, selecting from <a href="https://boxicons.com">Box Icons</a> or your own custom classes.</li></ul><p>For example, if you want to style notes of a specific type, such as notes containing PNG images, you can target them with classes like <code>type-image mime-image-png</code>.</p><h3>User-Provided Themes</h3><p>A gallery of user-created themes is available, showcasing the variety of customizations that the Trilium community has developed. For more information, visit the <a href="#root/VbjZvtUek0Ln">Theme Gallery</a>.</p><h3>Asset Path Management</h3><p>When referencing built-in assets like images in your custom themes or CSS, you can avoid hardcoding version numbers by using the <code>vX</code> alias. For example, instead of specifying <code>/assets/v0.57.0-beta/images/icon-grey.png</code>, you can use <code>/assets/vX/images/icon-grey.png</code> to keep your theme compatible with future versions of Trilium.</p>


blobId: 9Alb0m5iqAziu1FWdhuM
dateModified: 2025-03-09 11:15:32.963+0200
utcDateModified: 2025-03-09 09:15:32.963Z
content:
  <p>Configuring TLS is essential for <a href="#root/WOcw2SLH6tbX">server installation</a> in Trilium. This guide details the steps to set up TLS within Trilium itself.</p><p>For a more robust solution, consider using TLS termination with a reverse proxy (recommended, e.g., Nginx). You can follow a <a href="https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04">guide like this</a> for such setups.</p><h2>Obtaining a TLS Certificate</h2><p>You have two options for obtaining a TLS certificate:</p><ul><li><strong>Recommended</strong>: Obtain a TLS certificate signed by a root certificate authority. For personal use, <a href="https://letsencrypt.org">Let's Encrypt</a> is an excellent choice. It is free, automated, and straightforward. Certbot can facilitate automatic TLS setup.</li><li>Generate a self-signed certificate. This option is not recommended due to the additional complexity of importing the certificate into all machines connecting to the server.</li></ul><h2>Modifying <code>config.ini</code></h2><p>Once you have your certificate, modify the <code>config.ini</code> file in the <a href="#root/tAassRL4RSQL">data directory</a> to configure Trilium to use it:</p><pre><code class="language-text-x-trilium-auto">[Network]
  port=8080
  # Set to true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
  https=true
  # Path to the certificate (run "bash bin/generate-cert.sh" to generate a self-signed certificate).
  # Relevant only if https=true
  certPath=/[username]/.acme.sh/[hostname]/fullchain.cer
  keyPath=/[username]/.acme.sh/[hostname]/example.com.key</code></pre><p>You can also review the <a href="#root/Gzjqa934BdH4">configuration</a> file to provide all <code>config.ini</code> values as environment variables instead.</p><p>The above example shows how this is set up in an environment where the certificate was generated using Let's Encrypt's ACME utility. Your paths may differ. For Docker installations, ensure these paths are within a volume or another directory accessible by the Docker container, such as <code>/home/node/trilium-data/[DIR IN DATA DIRECTORY]</code>.</p><p>After configuring <code>config.ini</code>, restart Trilium and access the hostname using "https".</p><h2>Self-Signed Certificate</h2><p>If you opt to use a self-signed certificate for your server instance, note that the desktop instance will not trust it by default.</p><p>To bypass this, disable certificate validation by setting the following environment variable (for Linux):</p><pre><code class="language-text-x-trilium-auto">export NODE_TLS_REJECT_UNAUTHORIZED=0
  trilium</code></pre><p>Trilium provides scripts to start in this mode, such as <code>trilium-no-cert-check.bat</code> for Windows.</p><p><strong>Warning</strong>: Disabling TLS certificate validation is insecure. Proceed only if you fully understand the implications.</p>


blobId: inn1u8rWmoMeQnwBoEgv
dateModified: 2025-03-09 11:15:39.460+0200
utcDateModified: 2025-03-09 09:15:39.460Z
content:
  <p>This page explains the basic concepts related to the tree structure of notes in TriliumNext.</p><h2>Note</h2><p>A note is the central entity in TriliumNext. For more details, see <a href="#root/BFs8mudNFgCS">Note</a>.</p><h2>Branch</h2><p>A branch describes the placement of a note within the note tree. Essentially, it is a tuple of <code>parentNoteId</code> and <code>noteId</code>, indicating that the given note is placed as a child under the specified parent note.</p><p>Each note can have multiple branches, meaning any note can be placed in multiple locations within the tree. This concept is referred to as "<a href="#root/IakOLONlIfGI">cloning</a>."</p><h2>Prefix</h2><p>A prefix is a branch-specific title modifier for a note. If you place your note in two different locations within the tree and want to alter the title slightly in one of those placements, you can use a prefix.</p><p>To edit a prefix, right-click on the note in the tree pane and select "Edit branch prefix."</p><p>The prefix is not part of the note itself and is not encrypted when the note is protected. This can be useful if you want part of the title to remain visible in the tree for easier navigation, even when the note is protected.</p><h2>Subtree</h2><p>A subtree consists of a particular note (the subtree root) and all its children and descendants. Some operations, such as exporting, work on entire subtrees.</p>


blobId: ohEPqO7KbYXLeKEzZ5vB
dateModified: 2025-03-09 11:15:44.104+0200
utcDateModified: 2025-03-09 09:15:44.104Z
content:
  <p>This page explains how to manipulate the note tree in TriliumNext, focusing on moving notes.</p><h2>Drag and Drop</h2><p><img src="api/images/sLZ7Bcq9p8E9/drag-and-drop.gif" alt="Drag and drop example"> You can easily rearrange the note tree by dragging and dropping notes, as demonstrated in the example above.</p><h2>Keyboard Manipulation</h2><p><img src="api/images/qL7381ZG0lMK/move-note-with-keyboard.gif" alt="Example of using keyboard keys to move a note"> Trilium offers efficient keyboard-based manipulation using the following <a href="#root/A9Oc6YKKc65v">shortcuts</a>:</p><ul><li><code>CTRL-UP</code> and <code>CTRL-DOWN</code>: Move the note up or down in the order.</li><li><code>CTRL-LEFT</code>: Move the note up in the hierarchy by changing its parent to the note's grandparent.</li><li><code>CTRL-RIGHT</code>: Move the note down in the hierarchy by setting its parent to the note currently above it (this action is best understood through a demo or hands-on experience).</li><li><code>LEFT</code> and <code>RIGHT</code>: Expand and collapse a sub-tree.</li></ul><h2>Context Menu</h2><p>You can also move notes using the familiar cut and paste functions available in the context menu, or with the associated keyboard <a href="#root/A9Oc6YKKc65v">shortcuts</a>: <code>CTRL-C</code> (<a href="#root/IakOLONlIfGI">copy</a>), <code>CTRL-X</code> (cut) and <code>CTRL-V</code> (paste).</p>


blobId: SijMEsfWXj8vgY3cQsDN
dateModified: 2025-03-09 11:15:48.280+0200
utcDateModified: 2025-03-09 09:15:48.281Z
content:
  <p>As Triliumis currently in beta, encountering bugs is to be expected.</p><h2>General Quick Fix</h2><p>The first step in troubleshooting is often a restart.</p><p>If you experience an UI issue, the frontend may have entered an inconsistent state. Reload the application by pressing <code>CTRL-R</code>. This will reload the frontend.</p><p>If the issue persists or appears to be a backend problem, restart the entire application. For the desktop (Electron) build, simply close and reopen the window. If you're using a Docker build, restart the container.</p><h2>Broken Note Crashes Trilium</h2><p>Certain problems, such as rendering a note with a faulty script, can cause Trilium to crash. If Trilium attempts to reload the problematic note upon restart, it will continue to crash.</p><p>To resolve this, use the <code>TRILIUM_START_NOTE_ID</code> environment variable to reset the open tabs to a single specified note ID (e.g., <code>root</code>). In Linux, you can set it as follows:</p><pre><code class="language-text-x-trilium-auto">TRILIUM_START_NOTE_ID=root ./trilium</code></pre><h2>Broken Script Prevents Application Startup</h2><p>If a custom script causes Triliumto crash, and it is set as a startup script or in an active <a href="#root/MgibgPcfeuGz">custom widget</a>, start Triliumin "safe mode" to prevent any custom scripts from executing:</p><pre><code class="language-text-x-trilium-auto">TRILIUM_SAFE_MODE=true ./trilium</code></pre><p>Depending on your Trilium distribution, you may have pre-made scripts available: <code>trilium-safe-mode.bat</code> and <code>trilium-safe-mode.sh</code>.</p><p>Once Trilium starts, locate and fix or delete the problematic note.</p><h2>Sync and Consistency Checks</h2><p>Trilium periodically verifies the logical consistency of the database (e.g., ensuring every note has a parent). If inconsistencies are detected, you will be notified via the UI.</p><p>In such cases, file a bug report and attach an <a href="#root/x59R8J8KV5Bp">anonymized database</a> if necessary.</p><h2>Restoring Backup</h2><p>Trilium makes regular automatic backups. If issues become severe, you can <a href="#root/ODY7qQn5m2FT">restore from a backup</a>.</p><h2>Forgotten Password</h2><p>If you forget your password:</p><ul><li>Protected notes are irretrievable without the password.</li><li>Unprotected notes can be recovered. Follow these steps:</li></ul><p>Access the <a href="#root/wX4HbRucYSDD">database</a> file in the <a href="#root/tAassRL4RSQL">data directory</a>. Open the <code>document.db</code> file with an SQLite client (e.g., <a href="https://sqlitebrowser.org/">DB Browser</a>) and execute the following queries:</p><pre><code class="language-text-x-trilium-auto">UPDATE options SET value = '77/twC5O00cuQgNC63VK32qOKKYwj21ev3jZDXoytVU=' WHERE name = 'passwordVerificationSalt';
  UPDATE options SET value = '710BMasZCAgibzIc07X4P9Q4TeBd4ONnqJOho+pWcBM=' WHERE name = 'passwordDerivedKeySalt';
  UPDATE options SET value = 'Eb8af1/T57b89lCRuS97tPEl4CwxsAWAU7YNJ77oY+s=' WHERE name = 'passwordVerificationHash';
  UPDATE options SET value = 'QpC8XoiYYeqHPtHKRtbNxfTHsk+pEBqVBODYp0FkPBa22tlBBKBMigdLu5GNX8Uu' WHERE name = 'encryptedDataKey';</code></pre><p>After executing the changes, commit/write the changes. <strong>This sets the password to "password," allowing you to log in again.</strong></p><p>For pre-existing protected notes (now unrecoverable), consider deleting them or exporting the unprotected notes. Then, delete <code>document.db</code> and start fresh.</p><p>If you continue using the existing document file, change your password (Options -&gt; Change Password).</p><h2>Reporting Bugs</h2><p>Reporting bugs is highly valuable. Here are some tips:</p><ul><li>Use GitHub issues for reporting: <a href="https://github.com/TriliumNext/Notes/issues">https://github.com/TriliumNext/Notes/issues</a></li><li>Refer to the <a href="#root/qzNzp9LYQyPT">error logs</a> page for information on providing necessary details.</li></ul>


blobId: SgwfypRdagMqBuZf8oKp
dateModified: 2025-03-09 11:16:04.709+0200
utcDateModified: 2025-03-09 09:16:04.710Z
content:
  <p>This document outlines the steps required to upgrade Trilium to a new release version.</p><h2>How to Upgrade</h2><p>Trilium does not support built-in automatic upgrades; all updates must be performed manually. The upgrade process varies depending on the installation method:</p><ul><li><a href="#root/rWX5eY045zbE"><strong>Docker Server Installation</strong></a>: Pull the new image and restart the container.</li><li><strong>Other Installations</strong>: Download the latest version from the <a href="https://github.com/TriliumNext/Notes/releases/latest">release page</a> and replace the existing application files.</li></ul><h2>Database Compatibility and Migration</h2><p>Upon startup, Trilium will automatically migrate the <a href="#root/wX4HbRucYSDD">database</a> to the new version. Note that after migration, older versions of Trilium will be unable to read the database. If you need to revert to a previous version of Trilium and its database, you can restore the <a href="#root/ODY7qQn5m2FT">backup</a> that is created prior to migration.</p><h2>Sync Compatibility</h2><p>The <a href="#root/cbkrhQjrkKrh">synchronization</a> protocol used by Trilium is versioned, requiring all members of the sync cluster to use the same protocol version. Therefore, when upgrading to a new version, you may need to upgrade all instances in the sync cluster. Changes to the sync protocol version are typically indicated on the release page.</p>


blobId: X8hbuaNhN8NoqPduZvOD
dateModified: 2025-03-09 11:16:13.455+0200
utcDateModified: 2025-03-09 09:16:13.455Z
content:
  <p><img src="api/images/ZwPsWktLVBAz/web-clipper-chrome-trilium-web.png" alt="screenshot of webclipper in chrome"></p><p>Trilium Web Clipper is a web browser extension which allows user to clip text, screenshots, whole pages and short notes and save them directly to Trilium Notes.</p><p>Project is hosted <a href="https://github.com/TriliumNext/web-clipper">here</a>.</p><p>Firefox and Chrome are supported browsers, but the chrome build should work on other chromium based browsers as well.</p><h2>Functionality</h2><ul><li>select text and clip it with the right-click context menu</li><li>click on an image or link and save it through context menu</li><li>save whole page from the popup or context menu</li><li>save screenshot (with crop tool) from either popup or context menu</li><li>create short text note from popup</li></ul><p>Trilium will save these clippings as a new child note under a "clipper inbox" note.</p><p>By default, that's the <a href="#root/l0tKav7yLHGF">day note</a> but you can override that by setting the <a href="#root/zEY4DaJG4YT5">label</a> <code>clipperInbox</code>, on any other note.</p><p>If there's multiple clippings from the same page (and on the same day), then they will be added to the same note.</p><p><strong>Extension is available from:</strong></p><ul><li><a href="https://github.com/TriliumNext/web-clipper/releases">Project release page</a> - .xpi for Firefox and .zip for Chromium based browsers.</li><li>%%{WARNING}%% <a href="https://chromewebstore.google.com/detail/trilium-web-clipper/dfhgmnfclbebfobmblelddiejjcijbjm">Chrome Web Store</a></li></ul><h2>Configuration</h2><p>The extension needs to connect to a running Trilium instance. By default, it scans a port range on the local computer to find a desktop Trilium instance.</p><p>It's also possible to configure the <a href="#root/WOcw2SLH6tbX">server</a> address if you don't run the desktop application, or want it to work without the desktop application running.</p><h2>Username</h2><p>Older versions of Trilium (before 0.50) required username &amp; password to authenticate, but this is no longer the case. You may enter anything in that field, it will not have any effect.</p>


blobId: 065HfQ4wY1R8N8YY8PuZ
dateModified: 2025-03-09 11:16:19.228+0200
utcDateModified: 2025-03-09 09:16:19.229Z
content:
  <p><img src="api/images/PFrpANAUte0M/weight-tracker.png" alt="screenshot of weight tracker"></p><p>The <code>Weight Tracker</code> is a <a href="#root/GLks18SNjxmC">Script API</a> showcase present in the <a href="#root/wX4HbRucYSDD">demo notes</a>.</p><p>By adding <code>weight</code> as a <a href="#root/OFXdgB2nNk1F">promoted attribute</a> in the <a href="#root/KC1HB96bqqHX">template</a> from which <a href="#root/l0tKav7yLHGF">day notes</a> are created, you can aggregate the data and plot weight change over time.</p><h2>Implementation</h2><p>The <code>Weight Tracker</code> note in the screenshot above is of the type <code>Render Note</code>. That type of note doesn't have any useful content itself. Instead it is a placeholder where a <a href="#root/CdNpE2pqjmI6">script</a> can render its output.</p><p>Scripts for <code>Render Notes</code> are defined in a <a href="#root/zEY4DaJG4YT5">relation</a> called <code>~renderNote</code>. In this example, it's the <code>Weight Tracker</code>'s child <code>Implementation</code>. The Implementation consists of two <a href="#root/6f9hih2hXXZk">code notes</a> that contain some HTML and JavaScript respectively, which load all the notes with a <code>weight</code> attribute and display their values in a chart.</p><p>To actually render the chart, we're using a third party library called <a href="https://www.chartjs.org/">chart.js</a> which is imported as an attachment, since it's not built into Trilium.</p><h3>Code</h3><p>Here's the content of the script which is placed in a <a href="#root/6f9hih2hXXZk">code note</a> of type <code>JS Frontend</code>:</p><pre><code class="language-text-x-trilium-auto">async function getChartData() {
      const days = await api.runOnBackend(async () =&gt; {
          const notes = api.getNotesWithLabel('weight');
          const days = [];

          for (const note of notes) {
              const date = note.getLabelValue('dateNote');
              const weight = parseFloat(note.getLabelValue('weight'));

              if (date &amp;&amp; weight) {
                  days.push({ date, weight });
              }
          }

          days.sort((a, b) =&gt; a.date &gt; b.date ? 1 : -1);

          return days;
      });

      const datasets = [
          {
              label: "Weight (kg)",
              backgroundColor: 'red',
              borderColor: 'red',
              data: days.map(day =&gt; day.weight),
              fill: false,
              spanGaps: true,
              datalabels: {
                  display: false
              }
          }
      ];

      return {
          datasets: datasets,
          labels: days.map(day =&gt; day.date)
      };
  }

  const ctx = $("#canvas")[0].getContext("2d");

  new chartjs.Chart(ctx, {
      type: 'line',
      data: await getChartData()
  });</code></pre><h2>How to remove the Weight Tracker button from the top bar</h2><p>In the link map of the <code>Weight Tracker</code>, there is a note called <code>Button</code>. Open it and delete or comment out its contents. The <code>Weight Tracker</code> button will disappear after you restart Trilium.</p>


blobId: P7gAUkvliCoQckGjNb71
dateModified: 2025-03-09 11:16:27.292+0200
utcDateModified: 2025-03-09 09:16:27.292Z
content:
  <p>Workspace is a concept built up on top of <a href="#root/OR8WJ7Iz9K4U">note hoisting</a>. It is based on the idea that a user has several distinct spheres of interest. An example might be "Personal" and "Work", these two spheres are quite distinct and don't interact together. When I focus on Work, I don't really care about personal notes.</p><p>So far workspace consists of these features:</p><ul><li><a href="#root/OR8WJ7Iz9K4U">note hoisting</a> - you can "zoom" into a workspace subtree to focus only on the relevant notes</li><li>easy entering of workspace:</li></ul><p><img src="api/images/8zB1VFJRr0TS/1 Workspace image.png" alt=""></p><ul><li>visual identification of workspace in tabs:</li></ul><p><img src="api/images/IZbC0lF5YNpQ/Workspace image.png" alt=""></p><h3>How to use workspaces</h3><p>Let's say you have identified the workspaces and their subtrees. Define on the root of this subtree following labels:</p><ul><li><code>#workspace</code> - Marks this note as a workspace, button to enter the workspace is controlled by this</li><li><code>#workspaceIconClass</code> - controls the box icon to be displayed in the tree and tabs, example <code>bx bx-home</code>. See <a href="https://boxicons.com/">https://boxicons.com/</a></li><li><code>#workspaceTabBackgroundColor</code> - Background color of the tab, use any CSS color format, e.g. "lightblue" or "#ddd". See <a href="https://www.w3schools.com/cssref/css_colors.asp">https://www.w3schools.com/cssref/css_colors.asp</a>.</li><li><code>#workspaceCalendarRoot</code> - marking a note with this label will define a new per-workspace calendar. If there's no such note, the global calendar will be used.</li><li><code>#workspaceTemplate</code> - This note will appear in the selection of available templates when creating a new note, but only when you are currently hoisted into a workspace containing this template.</li></ul>


blobId: 6Q7rODX4fF1vOqLjdVDw
dateModified: 2025-03-09 11:16:39.822+0200
utcDateModified: 2025-03-09 09:16:39.822Z
content:
  <p>This guide will walk you through creating a basic widget inside Trilium. By following these steps, you'll learn how to build a simple UI element that interacts with the user.</p><h3>Step 1: The Basic Widget Structure</h3><p>To start, we'll create the most basic widget possible. Here's a simple example:</p><pre><code class="language-text-x-trilium-auto">class MyWidget extends api.BasicWidget {
      get position() { return 1; }
      get parentWidget() { return "left-pane"; }
      
      doRender() {
          this.$widget = $("");
          return this.$widget;
      }
  }

  module.exports = new MyWidget();</code></pre><p>To implement this widget:</p><ol><li>Create a new <code>JS Frontend</code> note in Trilium and paste in the code above.</li><li>Assign the <code>#widget</code> <a href="#root/zEY4DaJG4YT5">attribute</a> to the <a href="#root/BFs8mudNFgCS">note</a>.</li><li>Restart Trilium or reload the window.</li></ol><p>To verify that the widget is working, open the developer tools (<code>Cmd</code> + <code>Shift</code> + <code>I</code>) and run <code>document.querySelector("#my-widget")</code>. If the element is found, the widget is functioning correctly. If <code>undefined</code> is returned, double-check that the <a href="#root/BFs8mudNFgCS">note</a> has the <code>#widget</code> <a href="#root/zEY4DaJG4YT5">attribute</a>.</p><h3>Step 2: Adding an UI Element</h3><p>Next, let's improve the widget by adding a button to it.</p><pre><code class="language-text-x-trilium-auto">const template = ``;

  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>After making this change, reload Trilium. You should now see a button in the top-left corner of the left pane.</p><h3>Step 3: Styling the Widget</h3><p>To make the button more visually appealing and position it correctly, we'll apply some custom styling. Trilium includes <a href="https://boxicons.com">Box Icons</a>, which we'll use to replace the button text with an icon. For example the <code>bx bxs-magic-wand</code> icon.</p><p>Here's the updated template:</p><pre><code class="language-text-x-trilium-auto">const template = ``;</code></pre><p>Next, we'll adjust the button's position using CSS:</p><pre><code class="language-text-x-trilium-auto">class MyWidget extends api.BasicWidget {
      get position() { return 1; }
      get parentWidget() { return "left-pane"; }
      
      doRender() {
          this.$widget = $(template);
          this.cssBlock(`#my-widget {
              position: absolute;
              bottom: 40px;
              left: 60px;
              z-index: 1;
          }`);
          return this.$widget;
      }
  }

  module.exports = new MyWidget();</code></pre><p>After reloading Trilium, the button should now appear at the bottom left of the left pane, alongside other action buttons.</p><h3>Step 4: Adding User Interaction</h3><p>Let’s make the button interactive by showing a message when it’s clicked. We'll use the <code>api.showMessage</code> method from the <a href="#root/GLks18SNjxmC">Script API</a>.</p><pre><code class="language-text-x-trilium-auto">class MyWidget extends api.BasicWidget {
      get position() { return 1; }
      get parentWidget() { return "left-pane"; }
      
      doRender() {
          this.$widget = $(template);
          this.cssBlock(`#my-widget {
              position: absolute;
              bottom: 40px;
              left: 60px;
              z-index: 1;
          }`);
          this.$widget.find("button").on("click", () =&gt; api.showMessage("Hello World!"));
          return this.$widget;
      }
  }

  module.exports = new MyWidget();</code></pre><p>Reload the application one last time. When you click the button, a "Hello World!" message should appear, confirming that your widget is fully functional.</p>


blobId: xz4U3Sxbvi9UXXEWVjLK
dateModified: 2025-03-09 11:16:54.953+0200
utcDateModified: 2025-03-09 09:16:54.953Z
content:
  <p>A <strong>Book Note</strong> in Trilium is a special type of <a href="#root/BFs8mudNFgCS">note</a> designed to display the contents of its child notes sequentially, creating a linear, book-like reading experience. This format is particularly useful for viewing multiple smaller notes in a cohesive, continuous manner.</p><p><img src="api/images/kLoEdvFsjOqB/book-note.png" alt="Book Note Example"></p><p>In the example above, the "node.js" note on the left panel contains several child notes. The right panel displays the content of these child notes as a single continuous document.</p><h2>Features</h2><h3>Linear Display</h3><p>The Book Note format compiles the contents of all child notes into one continuous view. This makes it ideal for reading extensive information broken into smaller, manageable segments.</p><h3>Grid View Option</h3><p>Trilium also offers a "Grid View" option within the Book Note properties. This view presents the child notes in a grid format, allowing for a more visual navigation experience.</p><p><img src="api/images/DF89NW1ZLkX0/book-note-pictures.png" alt="Grid View Example"></p><p>Switching between these views can be easily managed through the Book Note's settings (or <code>viewType</code> attribute), allowing users to choose the format that best suits their reading or navigation preferences.</p>


blobId: xarLhVJnUoo4Osfvx872
dateModified: 2025-03-09 11:17:25.606+0200
utcDateModified: 2025-03-09 09:17:25.606Z
content:
  <p>Trilium Notes supports importing Markdown restricted to the <a href="https://spec.commonmark.org/current/">CommonMark specification</a> (where <a href="https://github.com/TriliumNext/Notes/issues/2026">tables are not supported</a> )</p><h2>Import</h2><h3>Clipboard import</h3><p>If you want to import just a chunk of markdown from clipboard, you can do it from editor block menu:</p><p><img src="api/images/Y9mwMwSGAaSb/markdown-inline-import.gif" alt=""></p><h3>File import</h3><p>You can also import Markdown files from files:</p><ul><li>single markdown file (with .md extension)</li><li>whole tree of markdown files (packaged into <a href="https://en.wikipedia.org/wiki/Tar_(computing)">.zip</a> archive)<ul><li>Markdown files need to be packaged into ZIP archive because browser can't read directories, only single files.</li><li>You can use e.g. <a href="https://www.7-zip.org">7-zip</a> to package directory of markdown files into the ZIP file</li></ul></li></ul><p>[[gifs/markdown-file-import.gif]]</p><p><img src="api/images/xMQSqWySvWBZ/markdown-file-import.gif" alt=""></p><h2>Export</h2><h3>Subtree export</h3><p>You can export whole subtree to ZIP archive which will have directory structured modelled after subtree structure:</p><p><img src="api/images/QUqKzK4LHMVA/markdown-export-subtree.gif" alt=""></p><h3>Single note export</h3><p>If you want to export just single note without its subtree, you can do it from Note actions menu:</p><p><img src="api/images/e3qPZSsTbUZP/markdown-export-note.gif" alt=""></p><h3>Exporting protected notes</h3><p>If you want to export protected notes, enter a protected session first! This will export the notes in an unencrypted form, so if you reimport into Trilium, make sure to re-protect these notes.</p>


blobId: GM4FxPrrv50HfoL5lFPK
dateModified: 2025-03-09 11:17:29.012+0200
utcDateModified: 2025-03-09 09:17:29.013Z
content:
  <p>Multi-factor authentication (MFA) is a security process that requires users to provide two or more verification factors to gain access to a system, application, or account. This adds an extra layer of protection beyond just using a password.</p><p>By requiring more than one verification method, MFA helps reduce the risk of unauthorized access, even if someone has obtained your password. It’s highly recommended for securing sensitive information stored in your notes.</p><p>Warning! OpenID and TOTP cannot be both used at the same time!</p><h2>Log in with your Google Account with OpenID!</h2><p>OpenID is a standardized way to let you log into websites using an account from another service, like Google, to verify your identity.</p><h2>Why Time-based One Time Passwords?</h2><p>TOTP (Time-Based One-Time Password) is a security feature that generates a unique, temporary code on your device, like a smartphone, which changes every 30 seconds. You use this code, along with your password, to log into your account, making it much harder for anyone else to access them.</p><h2>Setup</h2><h3>TOTP</h3><ol><li>Start Trilium Notes normally.</li><li>Go to "Menu" -&gt; "Options" -&gt; "MFA"</li><li>Click the "Generate TOTP Secret" button</li><li>Copy the generated secret to your authentication app/extension</li><li><p>Set an environment variable "TOTP_SECRET" as the generated secret. Environment variables can be set with a .env file in the root directory, by defining them in the command line, or with a docker container.</p><pre><code class="language-text-x-trilium-auto"># .env in the project root directory
  TOTP_ENABLED="true"
  TOTP_SECRET="secret"</code></pre><pre><code class="language-text-x-trilium-auto"># Terminal/CLI
  export TOTP_ENABLED="true"
  export TOTP_SECRET="secret"</code></pre><pre><code class="language-text-x-trilium-auto"># Docker
  docker run -p 8080:8080 -v ~/trilium-data:/home/node/trilium-data -e TOTP_ENABLED="true" -e TOTP_SECRET="secret" triliumnext/notes:[VERSION]</code></pre></li><li>Restart Trilium</li><li>Go to "Options" -&gt; "MFA"</li><li>Click the "Generate Recovery Codes" button</li><li>Save the recovery codes. Recovery codes can be used once in place of the TOTP if you loose access to your authenticator. After a rerecovery code is used, it will show the unix timestamp when it was used in the MFA options tab.</li><li>Load the secret into an authentication app like google authenticator</li></ol><h3>OpenID</h3><p><i>Currently only compatible with Google. Other services like Authentik and Auth0 are planned on being added.</i></p><p>In order to setup OpenID, you will need to setup a authentication provider. This requires a bit of extra setup. Follow <a href="https://developers.google.com/identity/openid-connect/openid-connect">these instructions</a> to setup an OpenID service through google.</p><p>Set an environment variable "SSO_ENABLED" to true and add the client ID and secret you obtained from google. Environment variables can be set with a .env file in the root directory, by defining them in the command line, or with a docker container.</p><h4>.env File</h4><pre><code class="language-text-x-trilium-auto"># .env in the project root directory
  SSO_ENABLED="true"
  BASE_URL="http://localhost:8080"
  CLIENT_ID=
  SECRET=</code></pre><h4>Environment variable (linux)</h4><pre><code class="language-text-x-trilium-auto">export SSO_ENABLED="true"
  export BASE_URL="http://localhost:8080"
  export CLIENT_ID=
  export SECRET=</code></pre><h4>Docker</h4><pre><code class="language-text-x-trilium-auto">docker run -d -p 8080:8080 -v ~/trilium-data:/home/node/trilium-data -e SSO_ENABLED="true" -e BASE_URL="http://localhost:8080" -e CLIENT_ID= -e SECRET= triliumnext/notes:[VERSION]</code></pre><p>After you restart Trilium Notes, you will be redirected to Google's account selection page. Login to an account and Trilium Next will bind to that account, allowing you to login with it.</p><p>You can now login using your google account.</p>


blobId: lb4MjSAcNXrbsUpi4ZWq
dateModified: 2025-03-09 11:17:46.985+0200
utcDateModified: 2025-03-09 09:17:46.985Z
content:
  <p><strong>This page describes a method to migrate via EverNote Legacy, but this app is no longer available/working.</strong></p><h2>Prep Onenote notes for best compatibility</h2><ul><li>Remove Onenote Tags and replace with Emoji if possible (Onenote Tags will get imported into trilium as an image which clutters the Trilium tree somewhat)</li><li>Make sure to use Onenote headings where applicable (These will be carried over correctly into Trilium)</li><li>Remove extra whitespace in Onenote (Whitespace seems to be more noticible in Trilium, so removing it now will make it look nicer in trilium)</li><li>If possible, try to avoid very long Onenote pages. Trilium works best with shorter concise pages with any number of sub or (sub-sub...) pages.</li><li>Make sure numbered lists don't have unusual spaces between items in the list (Sometimes the numbered list will start at 1 again in Trilum if there is an extra space in the list in OneNote).</li></ul><h2>Migration Procedure</h2><h3>Import into Evernote from OneNote:</h3><ul><li>Install <a href="https://web.archive.org/web/20230327110646/https://help.evernote.com/hc/en-us/articles/360052560314">Evernote Legacy</a>. Current versions of Evernote do not have this functionality. (Requires Evernote account, but import works without internet connection - be sure to NOT sync notes to Evernote!).</li><li>In evernote navigate to File &gt; Import &gt; Onenote &gt; Notebook &gt; Section &gt; OK</li></ul><p>If exporting all sections at a time, they will not be grouped in folders - they will all be added to a single folder, but the order will be kept, so you can re-group into folders after importing to Trilium</p><h3>Export from Evernote</h3><ul><li>Right click on the created notebook in Evernote and choose "Export Notes…"</li><li>Use the default export format of .enex</li></ul><h3>Cleanup enex file (optional)</h3><ul><li><p>If the Onenote header (that is at the top of each Onenote page) is not desired, you can use the following regex to remove them in a text editor like VsCode:</p><p>Find (using regex): <code>.&lt;div.*&gt;&lt;h1</code> Replace with: <code>&lt;h1</code></p></li></ul><h3>Import into Trilium</h3><ul><li>In Trilium, right click on the root node and choose Import (all default options should be fine).</li><li>Select the .enex file exported from Evernote</li><li>Be patient. Large .enex files may take a few minutes to process</li><li>Repeat import for each .enex file</li></ul><h2>Other importing notes:</h2><ul><li>Centered text in Onenote will be left-justified after importing into Trilium</li><li>Internal onenote links will obviously be broken, but the link still exists so you can do a search in Trilium to find all onenote:// links and then re-link to the proper Trilium page (there is no way to link to a paragraph in trilium, so it's good to keep trilium pages short so links point to a small chunk of information instead of a massive note)</li><li>Text colors, highlights, and formatting generally carries over well</li><li>Revision history will be lost, but any new revisions will be tracked in Trilium</li><li>The structure of notes are not maintained exactly, so if you had sub-notes in Onenote, you may have to re-arrange the notes accordingly (This is easy since the order of the notes is preserved).</li><li>Evernote tags are created for each "section" in OneNote and these tags are carried over to Trilium as attributes<ul><li>If the tags are not desired, you can turn them off in the Evernote export options.</li></ul></li><li>If the "Created with OneNote" text is not desired, do a find/replace in the enex files before importing to Trilium</li><li>Some links will be disabled (not clickable) when importing from enex.</li><li>Files, screenshots, and attachments are all preserved (This is the only one-note export option that seems to preserve all of these).</li></ul>


blobId: TYz8yC51ht0rxvrQiec8
dateModified: 2025-03-09 11:17:54.001+0200
utcDateModified: 2025-03-09 09:17:54.001Z
content:
  <p>This is essentially Trilium sources + node modules + node.js runtime packaged into one 7z file.</p><h2>Steps</h2><ul><li>ssh into your server</li><li>use <code>wget</code> (or <code>curl</code> or whatever) to download latest <a href="https://github.com/TriliumNext/Notes/releases/latest">trilium-linux-x64-server-[VERSION].xz</a> %%{WARNING}%% (notice -server suffix) on your server</li><li>unpack the archive, e.g. using <code>tar -xf -d trilium-linux-x64-server-[VERSION].tar.xz</code></li><li><code>cd trilium-linux-x64-server</code></li><li><code>./trilium.sh</code></li><li>you can open the browser and open http://[your-server-hostname]:8080 and you should see Trilium initialization page</li></ul><p>The problem with above steps is that once you close the SSH connection, the Trilium process is terminated. To avoid that, you have two options:</p><ul><li>Kill it (with e.g. <code>CTRL-C</code>) and run again like this: <code>nohup ./trilium &amp;</code>.</li><li>Configure systemd to automatically run Trilium in the background on every boot</li></ul><h2>Configure Trilium to auto-run on boot with systemd</h2><ul><li>After downloading, extract and move Trilium:</li></ul><pre><code class="language-text-x-trilium-auto">tar -xvf trilium-linux-x64-server-[VERSION].tar.xz
  sudo mv trilium-linux-x64-server /opt/trilium</code></pre><ul><li>Create the service:</li></ul><pre><code class="language-text-x-trilium-auto">sudo nano /etc/systemd/system/trilium.service</code></pre><ul><li>Paste this into the file (replace the user and group as needed):</li></ul><pre><code class="language-text-x-trilium-auto">[Unit]
  Description=Trilium Daemon
  After=syslog.target network.target

  [Service]
  User=xxx
  Group=xxx
  Type=simple
  ExecStart=/opt/trilium/trilium.sh
  WorkingDirectory=/opt/trilium/

  TimeoutStopSec=20
  # KillMode=process leads to error, according to https://www.freedesktop.org/software/systemd/man/systemd.kill.html
  Restart=always

  [Install]
  WantedBy=multi-user.target</code></pre><ul><li>Save the file (CTRL-S) and exit (CTRL-X)</li><li>Enable and launch the service:</li></ul><pre><code class="language-text-x-trilium-auto">sudo systemctl enable --now -q trilium</code></pre><ul><li>You can now open a browser to http://[your-server-hostname]:8080 and you should see the Trilium initialization page.</li></ul><h2>Common issues</h2><h3>Outdated glibc</h3><pre><code class="language-text-x-trilium-auto">Error: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /var/www/virtual/.../node_modules/@mlink/scrypt/build/Release/scrypt.node)
      at Object.Module._extensions..node (module.js:681:18)
      at Module.load (module.js:565:32)
      at tryModuleLoad (module.js:505:12)</code></pre><p>If you get an error like this, you need to either upgrade your glibc (typically by upgrading to up-to-date distribution version) or use some other <a href="#root/WOcw2SLH6tbX">server installation</a> method.</p><h2>TLS</h2><p>Don't forget to <a href="#root/l2VkvOwUNfZj">configure TLS</a>, which is required for secure usage!</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: o9xlJlSCiT0jom72C0ny
dateModified: 2025-03-09 11:25:27.417+0200
utcDateModified: 2025-03-09 09:25:27.417Z
content:
  <p>Trilium supports storing and displaying images. Supported formats are JPEG, PNG and GIF.</p><p>An image can be uploaded in the form of note's <a href="#root/0vhv7lsOLy82">attachment</a> or as a standalone <a href="#root/kBrnXNG3Hplm">note</a> placed into the <a href="#root/kBrnXNG3Hplm">note tree</a>. Its reference can be copied into a text note, in order to display it in the text itself.</p><h2>Uploading images</h2><p>To add an image to the note, simply drag it from file explorer onto the note editor inside Trilium and the image will be uploaded.</p><p><img src="api/images/SxZpSLC90own/upload-image.gif" alt="" width="812" height="585"></p><p>Alternatively you can click on block toolbar and then on "Insert image":</p><p><img src="api/images/d4wRI6N1Eolr/block-toolbar-insert-image.png" alt="" width="443" height="144"></p><p>You can also copy and paste an image from web - the image will be (asynchronously) downloaded and embedded.</p><h2>Compression</h2><p>Since Trilium isn't really meant to be primary storage for image data, it attempts to compress and resize (with pretty aggressive settings) uploaded images before storing them to the database. You may then notice some quality degradation. Basic quality settings is available in Options -&gt; Other.</p><p>If you want to save images in their original resolution, it is recommended to save them as attachment to note (top-right "Note actions -&gt; Import files").</p>


blobId: nAdiKhsEsSmvNRZbr6pS
dateModified: 2025-03-09 11:50:21.420+0200
utcDateModified: 2025-03-09 09:50:21.421Z
content:
  <h3>Execute script</h3><p>For more complex scenarios, it is possible to type in a JavaScript expression in order to apply the necessary changes.</p><p>To apply a suffix (<code>- suffix</code> in this example), to the note title:</p><pre><code class="language-application-javascript-env-backend">note.title = note.title + " - suffix";</code></pre><p>To alter attributes of a note in a bulk action, such as setting the <code>#shareAlias</code> label to the title of the note:</p><pre><code class="language-application-javascript-env-backend">note.setLabel("shareAlias", note.title)</code></pre>


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: cRH4QBFUteoZtO9xqmAd
dateModified: 2025-03-09 11:57:57.174+0200
utcDateModified: 2025-03-09 09:57:57.174Z
content:
  <p>Trilium allows you to share selected notes as <strong>publicly accessible</strong> read-only documents. This feature is particularly useful for publishing content directly from your Trilium notes, making it accessible to others online.</p><h2>Prerequisites</h2><p>To use the sharing feature, you must have a <a href="#root/WOcw2SLH6tbX">server installation</a> of Trilium. This is necessary because the notes will be hosted from the server.</p><h2>How to Share a Note</h2><ol><li><p><strong>Enable Sharing</strong>: To share a note, toggle the <code>Shared</code> switch within the note's interface. Once sharing is enabled, an URL will appear, which you can click to access the shared note.</p><p><img src="api/images/5GcxcE9fP9xX/share-single-note.png" alt="Share Note"></p></li><li><p><strong>Access the Shared Note</strong>: The link provided will open the note in your browser. If your server is not configured with a public IP, the URL will refer to <code>localhost (127.0.0.1)</code>.</p><p><img src="api/images/Ky3qOJJMZ731/share-single-note-web.png" alt="Shared Note Example"></p></li></ol><h2>Sharing a Note Subtree</h2><p>When you share a note, you actually share the entire subtree of notes beneath it. If the note has child notes, they will also be included in the shared content. For example, sharing the "Formatting" subtree will display a page with basic navigation for exploring all the notes within that subtree.</p><p><img src="api/images/lCtZz2Z59wPT/share-multiple-notes-web.png" alt="Shared Subtree Example"></p><h2>Viewing All Shared Notes</h2><p>You can view a list of all shared notes by clicking on "Show Shared Notes Subtree." This allows you to manage and navigate through all the notes you have made public.</p><h2>Security Considerations</h2><p>Shared notes are published on the open internet and can be accessed by anyone with the URL. The URL's randomness does not provide security, so it is crucial not to share sensitive information through this feature.</p><h3>Password Protection</h3><p>To protect shared notes with a username and password, you can use the <code>#shareCredentials</code> attribute. Add this label to the note with the format <code>#shareCredentials="username:password"</code>. To protect an entire subtree, make sure the label is <a href="#root/bwZpz2ajCEwO">inheritable</a>.</p><h2>Advanced Sharing Options</h2><h3>Customizing the Appearance of Shared Notes</h3><p>The default shared page is basic in design, but you can customize it using your own CSS:</p><ul><li><strong>Custom CSS</strong>: Link a CSS <a href="#root/6f9hih2hXXZk">code note</a> to the shared page by adding a <code>~shareCss</code> relation to the note. If you want this style to apply to the entire subtree, make the label inheritable. You can hide the CSS code note from the tree navigation by adding the <code>#shareHiddenFromTree</code> label.</li><li><strong>Omitting Default CSS</strong>: For extensive styling changes, use the <code>#shareOmitDefaultCss</code> label to avoid conflicts with Trilium's <a href="#root/Wy267RK4M69c">default stylesheet</a>.</li></ul><h3>Adding JavaScript</h3><p>You can inject custom JavaScript into the shared note using the <code>~shareJs</code> relation. This allows you to access note attributes or traverse the note tree using the <code>fetchNote()</code> API, which retrieves note data based on its ID.</p><p>Example:</p><pre><code class="language-application-javascript-env-backend">const currentNote = await fetchNote();
  const parentNote = await fetchNote(currentNote.parentNoteIds[0]);

  for (const attr of parentNote.attributes) {
      console.log(attr.type, attr.name, attr.value);
  }</code></pre><h3>Creating Human-Readable URL Aliases</h3><p>Shared notes typically have URLs like <code>http://domain.tld/share/knvU8aJy4dJ7</code>, where the last part is the note's ID. You can make these URLs more user-friendly by adding the <code>#shareAlias</code> label to individual notes (e.g., <code>#shareAlias=highlighting</code>). This will change the URL to <code>http://domain.tld/share/highlighting</code>.</p><p><strong>Important</strong>:</p><ol><li>Ensure that aliases are unique.</li><li>Using slashes (<code>/</code>) within aliases to create subpaths is not supported.</li></ol><h3>Viewing and Managing Shared Notes</h3><p>All shared notes are grouped under an automatically managed "Shared Notes" section. From here, you can view, share, or unshare notes by moving or cloning them within this section.</p><p><img src="api/images/jEQNvpyaXIWE/shared-list.png" alt="Shared Notes List"></p><h3>Setting a Custom Favicon</h3><p>To customize the favicon for your shared pages, create a relation <code>~shareFavicon</code> pointing to a file note containing the favicon (e.g., in <code>.ico</code> format).</p><h3>Sharing a Note as the Root</h3><p>You can designate a specific note or folder as the root of your shared content by adding the <code>#shareRoot</code> label. This note will be linked when visiting <code>[http://domain.tld/share](http://domain/share)</code>, making it easier to use Trilium as a fully-fledged website. Consider combining this with the <code>#shareIndex</code> label, which will display a list of all shared notes.</p><h2>Additional Options</h2><ul><li><strong>Raw Note Sharing</strong>: Use the <code>#shareRaw</code> label to share a note without any HTML wrapper.</li><li><strong>Disallow Robot Indexing</strong>: Add the <code>#shareDisallowRobotIndexing</code> label to prevent search engines from indexing the shared page by including a <code>noindex, follow</code> meta tag and <code>X-Robots-Tag: noindex</code> header.</li><li><strong>Shared Notes Index</strong>: For text notes with the <code>#shareIndex</code> label, the content will display a list of all shared note roots.</li></ul><h2>Limitations</h2><p>While the sharing feature is powerful, it has some limitations:</p><ul><li><strong>No Relation Map Support</strong></li><li><strong>Book Notes</strong>: Only show a list of child notes.</li><li><strong>Code Notes</strong>: No syntax highlighting.</li><li><strong>Static Note Tree</strong></li><li><strong>Protected Notes</strong>: Cannot be shared.</li><li><strong>Include Notes</strong>: Not supported.</li></ul><p>Some of these limitations may be addressed in future updates.</p>


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: aI4ZVCXqI1oclhsnX688
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:03.701Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="image image-style-align-center image_resized" style="width:62.15%;">
            <img style="aspect-ratio:855/677;" src="api/attachments/LX31yc6Jnksw/image/5_Zen mode_image.png" width="855"
            height="677">
            <figcaption>Screenshot of Zen Mode activated on a Windows 11 system with native title
              bar off and background effects on.</figcaption>
          </figure>
          <p>When Zen Mode is activated (pictured on the side), most of the user interface
            of Trilium is hidden away in order to be able to focus on the content,
            whether it's for reading or writing.</p>
          <figure class="image image-style-align-right image_resized"
          style="width:17.65%;">
            <img style="aspect-ratio:265/386;" src="api/attachments/lqQtSNb8loOS/image/3_Zen mode_image.png" width="265"
            height="386">
            <figcaption>Screenshot of the Zen Mode option in the global menu.</figcaption>
          </figure>
          <h2>Activating &amp; deactivating</h2>
          <p>The Zen Mode can be activated by accessing the global menu and selecting
            the “Zen Mode” option:</p>
          <p>Aside from the global menu, it's also possible to activate this mode by
            using a keyboard shortcut which is Alt+Z by default. Look for <code>toggleZenMode</code> in
            the shortcut configuration.</p>
          <p>Once Zen Mode is activated, all the UI elements of the application will
            be hidden away, including the global menu. In that case, the Zen Mode can
            be deactivated either by pressing the
            <img src="api/attachments/Asn6uBNwt6JI/image/6_Zen mode_image.png" width="29"
            height="31">icon in the top-right corner of the window or by pressing the keyboard
            combination again.</p>
          <p>Do note that, by design, activating or deactivating the Zen Mode applies
            only to the current window. Restarting the application will also disable
            the Zen Mode.</p>
          <h2>Moving the window around</h2>
          <p>If “Native title bar” is activated, then the operating system's default
            title bar can be used to drag the window around. If deactivated, the window
            can still be moved by dragging the mouse across the top part of the window
            where the note titles are.</p>
          <figure class="image image-style-align-left image_resized"
          style="width:50%;">
            <img style="aspect-ratio:1060/707;" src="api/attachments/HGcQUOEXJ3Sp/image/7_Zen mode_image.png" width="1060"
            height="707">
            <figcaption>Screenshot of two notes side-by-side while Zen Mode is active, on Windows
              11 with background effects off.</figcaption>
          </figure>
          <h2>Split windows and tabs</h2>
          <p>Tabs are completely hidden, however it's still possible to use keyboard
            shortcuts such as <code>firstTab</code> (Ctrl+1 by default), <code>secondTab</code> (Ctrl+2
            by default). There are also some newer shortcuts such as <code>activateNextTab</code> (Ctrl+Tab)
            or <code>activatePreviousTab</code> (Ctrl+Shift+Tab) that allow easy navigation,
            however make sure that they are configured properly in the settings.</p>
          <p>For the split view of notes, there are no keyboard shortcuts at the time
            of writing, but it's still possible to have them in Zen Mode by creating
            the split while the Zen Mode is off and then reactivating it afterwards.</p>
          <p>&nbsp;</p>
          <p>&nbsp;</p>
        </div>
      </div>


blobId: qPCPEMMfXiIhMwNFlxjJ
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:03.736Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>A language hint can be provided for text notes. This option informs the
            browser or the desktop application about the language the note is written
            in (for example this might help with spellchecking), and it also determines
            whether the text is displayed from right-to-left for languages such as
            Arabic, Hebrew, etc.</p>
          <p>For more information about right-to-left support, see&nbsp;<a class="reference-link"
            href="#root/BMf2nEbYlcUt">Right-to-left text notes</a>.</p>
          <p>To set the language of the content, go to “Basic Properties” and look
            for the “Language” field. By default there will be no content languages
            set, they can be configured by going to settings or by selecting the “Configure
            languages” item in the list.</p>
          <p>
            <img src="api/attachments/TlBagKsAj5ax/image/Content language_image.png" width="635" height="492">
          </p>
        </div>
      </div>


blobId: 7zRBDrCePr0E0ciankCO
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:03.753Z
content:
  <div class="content">
         

        <div class="ck-content">
          <figure class="image">
            <img style="aspect-ratio:767/606;" src="api/attachments/fOdCNTs2BuI0/image/6_Calendar View_image.png" width="767"
            height="606">
          </figure>
          <p>The Calendar view of Book notes will display each child note in a calendar
            that has a start date and optionally an end date, as an event.</p>
          <p>Unlike other Book view types, the Calendar view also allows some kind
            of interaction, such as moving events around as well as creating new ones.</p>
          <h2>Creating a calendar</h2>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:3.67%;">
                  <col style="width:61.57%;">
                    <col style="width:34.76%;">
              </colgroup>
              <tbody>
                <tr>
                  <th>1</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:545/299;" src="api/attachments/AU7dnIevWPrz/image/Calendar View_image.png" width="545"
                      height="299">
                    </figure>
                    <p>&nbsp;</p>
                  </td>
                  <td style="vertical-align:top;">
                    <p>The Calendar View works only for Book note types. To create a new note,
                      right click on the note tree on the left and select Insert note after,
                      or Insert child note and then select <i>Book</i>.</p>
                    <p>&nbsp;</p>
                  </td>
                </tr>
                <tr>
                  <th>2</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:314/233;" src="api/attachments/COiR1tnE86i1/image/1_Calendar View_image.png" width="314"
                      height="233">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">Once created, the “View type” of the Book needs changed to “Calendar”,
                    by selecting the “Book Properties” tab in the ribbon.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>Creating a new event/note</h2>
          <ul>
            <li>Clicking on a day will create a new child note and assign it to that particular
              day.
              <ul>
                <li>You will be asked for the name of the new note. If the popup is dismissed
                  by pressing the close button or escape, then the note will not be created.</li>
              </ul>
            </li>
            <li>It's possible to drag across multiple days to set both the start and end
              date of a particular note.
              <br>
              <img src="api/attachments/37CfbqKYcOtd/image/3_Calendar View_image.png" width="425" height="91">
            </li>
            <li>Creating new notes from the calendar will respect the <code>~child:template</code> relation
              if set on the book note.</li>
          </ul>
          <h2>Interacting with events</h2>
          <ul>
            <li>Hovering the mouse over an event will display information about the note.
              <br>
              <img src="api/attachments/irfNX8n4159U/image/4_Calendar View_image.png" width="323" height="160">
            </li>
            <li>Left clicking the event will go to that note. Middle clicking will open
              the note in a new tab and right click will offer more options including
              opening the note in a new split or window.</li>
            <li>Drag and drop an event on the calendar to move it to another day.</li>
            <li>The length of an event can be changed by placing the mouse to the right
              edge of the event and dragging the mouse around.</li>
          </ul>
          <h2>Configuring the calendar</h2>
          <p>The following attributes can be added to the book type:</p>
          <figure class="table"
          style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:29.49%;">
                  <col style="width:70.51%;">
              </colgroup>
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><code>#calendar:hideWeekends</code>
                  </td>
                  <td>When present (regardless of value), it will hide Saturday and Sundays
                    from the calendar.</td>
                </tr>
                <tr>
                  <td><code>#calendar:weekNumbers</code>
                  </td>
                  <td>When present (regardless of value), it will show the number of the week
                    on the calendar.</td>
                </tr>
                <tr>
                  <td><code>~child:template</code>
                  </td>
                  <td>Defines the template for newly created notes in the calendar (via dragging
                    or clicking).</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <p>In addition, the first day of the week can be either Sunday or Monday
            and can be adjusted from the application settings.</p>
          <h2>Configuring the calendar events</h2>
          <p>For each note of the calendar, the following attributes can be used:</p>
          <figure
          class="table">
            <table>
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><code>#startDate</code>
                  </td>
                  <td>The date the event starts, which will display it in the calendar. The
                    format is <code>YYYY-MM-DD</code> (year, month and day separated by a minus
                    sign).</td>
                </tr>
                <tr>
                  <td><code>#endDate</code>
                  </td>
                  <td>Similar to <code>startDate</code>, mentions the end date if the event spans
                    across multiple days. The date is inclusive, so the end day is also considered.
                    The attribute can be missing for single-day events.</td>
                </tr>
                <tr>
                  <td><code>#color</code>
                  </td>
                  <td>Displays the event with a specified color (named such as <code>red</code>, <code>gray</code> or
                    hex such as <code>#FF0000</code>). This will also change the color of the
                    note in other places such as the note tree.</td>
                </tr>
                <tr>
                  <td><code>#calendar:color</code>
                  </td>
                  <td>Similar to <code>#color</code>, but applies the color only for the event
                    in the calendar and not for other places such as the note tree.</td>
                </tr>
                <tr>
                  <td><code>#iconClass</code>
                  </td>
                  <td>If present, the icon of the note will be displayed to the left of the
                    event title.</td>
                </tr>
                <tr>
                  <td><code>#calendar:title</code>
                  </td>
                  <td>Changes the title of an event to point to an attribute of the note other
                    than the title, either a label (e.g. <code>#assignee</code>) or a relation
                    (e.g. <code>~for</code>). See <i>Advanced use-cases</i> for more information.</td>
                </tr>
                <tr>
                  <td><code>#calendar:promotedAttributes</code>
                  </td>
                  <td>
                    <p>Allows displaying the value of one or more promoted attributes in the
                      calendar like this:
                      <img src="api/attachments/oBWr5GL6cUAZ/image/19_Calendar View_image.png" width="131" height="113">
                    </p><pre><code class="language-text-x-trilium-auto">#label:weight="promoted,number,single,precision=1"
  #label:mood="promoted,alias=Mood,single,text"
  #calendar:promotedAttributes="label:weight,label:mood" </code></pre>
                    <p>It can also be used with relations, case in which it will display the
                      title of the target note:</p><pre><code class="language-text-x-trilium-auto">#relation:assignee="promoted,alias=Assignee,single,text"
  #calendar:promotedAttributes="relation:assignee" 
  ~assignee=@My assignee </code></pre>
                  </td>
                </tr>
                <tr>
                  <td><code>#calendar:startDate</code>
                  </td>
                  <td>Allows using a different label to represent the start date, other than <code>#startDate</code> (e.g. <code>#expiryDate</code>).
                    The label name must be prefixed with <code>#</code>. If the label is not
                    defined for a note, the default will be used instead.</td>
                </tr>
                <tr>
                  <td><code>#calendar:endDate</code>
                  </td>
                  <td>Allows using a different label to represent the start date, other than <code>#endDate</code>.
                    The label name must be prefixed with <code>#</code>. If the label is not
                    defined for a note, the default will be used instead.</td>
                </tr>
              </tbody>
            </table>
            </figure>
            <h2>How the calendar works</h2>
            <p>
              <img class="image-style-align-left" src="api/attachments/u2c09UpZghff/image/7_Calendar View_image.png" width="329"
              height="116">The calendar displays all the child notes of the book that have a <code>#startDate</code>.
              An <code>#endDate</code> can optionally be added.</p>
            <p>If editing the start date and end date from the note itself is desirable,
              the following attributes can be added to the book note:</p><pre><code class="language-text-x-trilium-auto">#viewType=calendar #label:startDate(inheritable)="promoted,alias=Start Date,single,date" #label:endDate(inheritable)="promoted,alias=End Date,single,date" #hidePromotedAttributes </code></pre>
            <p>This will result in:</p>
            <p>
              <img src="api/attachments/oS6yUoQtfhpg/image/9_Calendar View_image.png" width="264" height="164">
            </p>
            <p>When not used in a Journal, the calendar is recursive. That is, it will
              look for events not just in its child notes but also in the children of
              these child notes.</p>
            <h2>Use-cases</h2>
            <h3>Using with the Journal / calendar</h3>
            <p>It is possible to integrate the calendar view into the Journal with day
              notes. In order to do so change the note type of the Journal note (calendar
              root) to Book and then select the Calendar View.</p>
            <p>Based on the <code>#calendarRoot</code> (or <code>#workspaceCalendarRoot</code>)
              attribute, the calendar will know that it's in a calendar and apply the
              following:</p>
            <ul>
              <li>The calendar events are now rendered based on their <code>dateNote</code> attribute
                rather than <code>startDate</code>.</li>
              <li>Interactive editing such as dragging over an empty era or resizing an
                event is no longer possible.</li>
              <li>Clicking on the empty space on a date will automatically open that day's
                note or create it if it does not exist.</li>
              <li>Direct children of a day note will be displayed on the calendar despite
                not having a <code>dateNote</code> attribute. Children of the child notes
                will not be displayed.</li>
            </ul>
            <figure class="image">
              <img style="aspect-ratio:1217/724;" src="api/attachments/KF56rdNuOwWd/image/18_Calendar View_image.png" width="1217"
              height="724">
            </figure>
            <h3>Using a different attribute as event title</h3>
            <p>By default, events are displayed on the calendar by their note title.
              However, it is possible to configure a different attribute to be displayed
              instead.</p>
            <p>To do so, assign <code>#calendar:title</code> to the child note (not the
              calendar/book note), with the value being <code>#name</code> where <code>name</code> can
              be any label. The attribute can also come through inheritance such as a
              template attribute. If the note does not have the requested label, the
              title of the note will be used instead.</p>
            <figure class="table">
              <table>
                <tbody>
                  <tr>
                    <td>
                      <figure class="image">
                        <img style="aspect-ratio:631/115;" src="api/attachments/GeEGbbeQ1qy9/image/10_Calendar View_image.png" width="631"
                        height="115">
                      </figure>
                    </td>
                    <td>
                      <figure class="image">
                        <img style="aspect-ratio:445/124;" src="api/attachments/HfBu0m3WXtn2/image/11_Calendar View_image.png" width="445"
                        height="124">
                      </figure>
                    </td>
                  </tr>
                </tbody>
              </table>
            </figure>
            <h3>Using a relation attribute as event title</h3>
            <p>Similarly to using an attribute, use <code>#calendar:title</code> and set
              it to <code>~name</code> where <code>name</code> is the name of the relation
              to use.</p>
            <p>Moreover, if there are more relations of the same name, they will be displayed
              as multiple events coming from the same note.</p>
            <figure class="table">
              <table>
                <tbody>
                  <tr>
                    <td>
                      <figure class="image">
                        <img style="aspect-ratio:666/118;" src="api/attachments/gQvwJGB5a4c1/image/15_Calendar View_image.png" width="666"
                        height="118">
                      </figure>
                    </td>
                    <td>
                      <figure class="image">
                        <img style="aspect-ratio:294/151;" src="api/attachments/ho00OJTNrxVI/image/13_Calendar View_image.png" width="294"
                        height="151">
                      </figure>
                    </td>
                  </tr>
                </tbody>
              </table>
            </figure>
            <p>Note that it's even possible to have a <code>#calendar:title</code> on the
              target note (e.g. “John Smith”) which will try to render an attribute of
              it. Note that it's not possible to use a relation here as well for safety
              reasons (an accidental recursion &nbsp;of attributes could cause the application
              to loop infinitely).</p>
            <figure class="table">
              <table>
                <tbody>
                  <tr>
                    <td>
                      <figure class="image">
                        <img style="aspect-ratio:364/121;" src="api/attachments/PYHfGSBQpr0y/image/16_Calendar View_image.png" width="364"
                        height="121">
                      </figure>
                    </td>
                    <td>
                      <figure class="image">
                        <img style="aspect-ratio:296/150;" src="api/attachments/akAHcIEcGnWR/image/17_Calendar View_image.png" width="296"
                        height="150">
                      </figure>
                    </td>
                  </tr>
                </tbody>
              </table>
            </figure>
        </div>
      </div>


blobId: uP4kFIvQXm1t4E4Y3s90
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:03.808Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Configuration</h2>
          <p>A webview needs to know which URL to render, and it can be provided by
            setting the <code>webViewSrc</code> attribute, such as:</p><pre><code class="language-text-x-trilium-auto">#webViewSrc="https://www.wikipedia.org"</code></pre>
          <h2>Web view on the server vs. Electron</h2>
          <p>When accessing Trilium via a browser instead of the desktop application,
            the web view will still try to render the content of the desired webpage.
            However, since it's running in a browser there are quite a few limitations
            as opposed to the desktop one.</p>
          <p>More specifically, quite a few websites oppose being embedded in another
            website (technically they have a non-permisive <code>X-Frame-Options</code> header).
            This is not bypassable by Trilium so the page will simply fail to render.</p>
          <p>You can diagnose this by right clicking the Trilium web page → Inspect
            (element) and looking in the “Console” tab for errors such as:</p>
          <ul>
            <li><code>Refused to display 'https://www.google.com/' in a frame because it set 'X-Frame-Options' to 'sameorigin'.</code>
            </li>
            <li><code>Refused to frame 'https://duckduckgo.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://html.duckduckgo.com".</code>
            </li>
          </ul>
          <p>There are a few websites that do render such as <code>wikipedia.org</code>.</p>
          <p>Do note that we are also applying some sandboxing constraints on the server
            side, so if you have any issues other than the unresolvable <code>X-Frame-Options</code> described
            above, feel free to report them.</p>
          <p>On the desktop side, a different technology is used which bypasses the
            constraints of an <code>iframe</code> (<code>webview</code>).</p>
        </div>
      </div>


blobId: oVgBxQBYyDjLkohdj5zV
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:03.818Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Creating a new geo map</h2>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:4.67%;">
                  <col style="width:57.81%;">
                    <col style="width:37.52%;">
              </colgroup>
              <tbody>
                <tr>
                  <th>1</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:1256/1044;" src="api/attachments/DapDey8gMiFc/image/7_Geo map_image.png" width="1256"
                      height="1044">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">Right click on any note on the note tree and select <i>Insert child note</i> → <i>Geo Map (beta)</i>.</td>
                </tr>
                <tr>
                  <th>2</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:1720/1396;" src="api/attachments/gJ4Yz80jxcbn/image/2_Geo map_image.png" width="1720"
                      height="1396">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">By default the map will be empty and will show the entire world.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>Repositioning the map</h2>
          <ul>
            <li>Click and drag the map in order to move across the map.</li>
            <li>Use the mouse wheel, two-finger gesture on a touchpad or the +/- buttons
              on the top-left to adjust the zoom.</li>
          </ul>
          <p>The position on the map and the zoom are saved inside the map note and
            restored when visiting again the note.</p>
          <h2>Adding a marker using the map</h2>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:5.05%;">
                  <col style="width:49.62%;">
                    <col style="width:45.33%;">
              </colgroup>
              <tbody>
                <tr>
                  <th>1</th>
                  <td>&nbsp;</td>
                  <td style="vertical-align:top;">
                    <p>To create a marker, first navigate to the desired point on the map. Then
                      press the
                      <img class="image_resized" style="aspect-ratio:72/66;width:7.37%;"
                      src="api/attachments/USbvJ38T4AKA/image/3_Geo map_image.png" width="72" height="66">button on the top-right of the map.</p>
                    <p>If the button is not visible, make sure the button section is visible
                      by pressing the chevron button (
                      <img class="image_resized" style="aspect-ratio:72/66;width:7.51%;"
                      src="api/attachments/6wUkw5RWE39e/image/8_Geo map_image.png" width="72" height="66">) in the top-right of the map.</p>
                  </td>
                </tr>
                <tr>
                  <th>2</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:1730/416;" src="api/attachments/aCSNn9QlgHFi/image/12_Geo map_image.png" width="1730"
                      height="416">
                    </figure>
                    <p>&nbsp;</p>
                  </td>
                  <td style="vertical-align:top;">
                    <p>Once pressed, the map will enter in the insert mode, as illustrated by
                      the notification.</p>
                    <p>Simply click the point on the map where to place the marker, or the Escape
                      key to cancel.</p>
                  </td>
                </tr>
                <tr>
                  <th>3</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:1586/404;" src="api/attachments/fQy8R1vxKhwN/image/Geo map_image.png" width="1586"
                      height="404">
                    </figure>
                    <p>&nbsp;</p>
                  </td>
                  <td>Enter the name of the marker/note to be created.&nbsp;</td>
                </tr>
                <tr>
                  <th>4</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:1696/608;" src="api/attachments/x6yBLIsY2LSv/image/5_Geo map_image.png" width="1696"
                      height="608">
                    </figure>
                    <p>&nbsp;</p>
                  </td>
                  <td>Once confirmed, the marker will show up on the map and it will also be
                    displayed as a child note of the map.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>How the location of the markers is stored</h2>
          <p>The location of a marker is stored in the <code>#geolocation</code> attribute
            of the child notes:</p>
          <figure class="image">
            <img style="aspect-ratio:1288/278;" src="api/attachments/ZvTlu9WMd37z/image/10_Geo map_image.png" width="1288"
            height="278">
          </figure>
          <p>This value can be added manually if needed. The value of the attribute
            is made up of the latitude and longitude separated by a comma.</p>
          <h2>Repositioning markers</h2>
          <p>It's possible to reposition existing markers by simply drag and dropping
            them to the new destination.</p>
          <p>As soon as the mouse is released, the new position is saved.</p>
          <p>If moved by mistake, there is currently no way to undo the change. If
            the mouse was not yet released, it's possible to force a refresh of the
            page (Ctrl+R or Meta+R) to cancel it.</p>
          <h2>Interaction with the markers</h2>
          <ul>
            <li>Hovering over a marker will display the content of the note it belongs
              to.
              <ul>
                <li>Clicking on the note title in the tooltip will navigate to the note in
                  the current view.</li>
              </ul>
            </li>
            <li>Middle-clicking the marker will open the note in a new tab.</li>
            <li>Right-clicking the marker will open a contextual menu allowing:
              <ul>
                <li>Opening the note in a new tab, split or window.</li>
                <li>Opening the location using an external application (if the operating system
                  supports it).</li>
                <li>Removing the marker from the map, which will remove the <code>#geolocation</code> attribute
                  of the note. To add it back again, the coordinates have to be manually
                  added back in.</li>
              </ul>
            </li>
          </ul>
          <h2>Icon and color of the markers</h2>
          <p>
            <img src="api/attachments/tDWsliJj9ncm/image/18_Geo map_image.png" alt="image" width="523" height="295">
          </p>
          <p>The markers will have the same icon as the note.</p>
          <p>It's possible to add a custom color to a marker by assigning them a <code>#color</code> attribute
            such as <code>#color=green</code>.</p>
          <h2>Adding the coordinates manually</h2>
          <p>In a nutshell, create a child note and set the <code>#geolocation</code> attribute
            to the coordinates.</p>
          <p>The value of the attribute is made up of the latitude and longitude separated
            by a comma.</p>
          <h3>Adding from Google Maps</h3>
          <figure class="table">
            <table>
              <tbody>
                <tr>
                  <th>1</th>
                  <td>
                    <figure class="image image-style-align-center image_resized" style="width:100%;">
                      <img style="aspect-ratio:732/918;" src="api/attachments/oaahbsMRbqd2/image/14_Geo map_image.png" width="732"
                      height="918">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">
                    <p>Go to Google Maps on the web and look for a desired location, right click
                      on it and a context menu will show up.</p>
                    <p>Simply click on the first item displaying the coordinates and they will
                      be copied to clipboard.</p>
                    <p>Then paste the value inside the text box into the <code>#geolocation</code> attribute
                      of a child note of the map (don't forget to surround the value with a <code>"</code> character).</p>
                  </td>
                </tr>
                <tr>
                  <th>2</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:518/84;" src="api/attachments/agH6yREFgsoU/image/16_Geo map_image.png" width="518"
                      height="84">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">
                    <p>In Trilium, create a child note under the map.</p>
                    <p>&nbsp;</p>
                    <p>&nbsp;</p>
                  </td>
                </tr>
                <tr>
                  <th>3</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:1074/276;" src="api/attachments/Mx2xwNIk76ZS/image/9_Geo map_image.png" width="1074"
                      height="276">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">And then go to Owned Attributes and type <code>#geolocation="</code>, then
                    paste from the clipboard as-is and then add the ending <code>"</code> character.
                    Press Enter to confirm and the map should now be updated to contain the
                    new note.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h3>Adding from OpenStreetMap</h3>
          <p>Similarly to the Google Maps approach:</p>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:4.65%;">
                  <col style="width:36.01%;">
                    <col style="width:59.34%;">
              </colgroup>
              <tbody>
                <tr>
                  <th>1</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:562/454;" src="api/attachments/3oh61qhNLu7D/image/15_Geo map_image.png" width="562"
                      height="454">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">Go to any location on openstreetmap.org and right click to bring up the
                    context menu. Select the “Show address” item.</td>
                </tr>
                <tr>
                  <th>2</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:696/480;" src="api/attachments/1f07O0Z25ZRr/image/11_Geo map_image.png" width="696"
                      height="480">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">
                    <p>The address will be visible in the top-left of the screen, in the place
                      of the search bar.</p>
                    <p>Select the coordinates and copy them into the clipboard.</p>
                  </td>
                </tr>
                <tr>
                  <th>3</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:640/276;" src="api/attachments/AHyDUM6R5HeG/image/1_Geo map_image.png" width="640"
                      height="276">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">Simply paste the value inside the text box into the <code>#geolocation</code> attribute
                    of a child note of the map and then it should be displayed on the map.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>Adding GPS tracks (.gpx)</h2>
          <p>Trilium has basic support for displaying GPS tracks on the geo map.</p>
          <figure
          class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:4.66%;">
                  <col style="width:36.79%;">
                    <col style="width:58.55%;">
              </colgroup>
              <tbody>
                <tr>
                  <th>1</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:226/74;" src="api/attachments/aCuXZY7WV4li/image/6_Geo map_image.png" width="226"
                      height="74">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">To add a track, simply drag &amp; drop a .gpx file inside the geo map
                    in the note tree.</td>
                </tr>
                <tr>
                  <th>2</th>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:322/222;" src="api/attachments/tfa1TRUatWEh/image/4_Geo map_image.png" width="322"
                      height="222">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">In order for the file to be recognized as a GPS track, it needs to show
                    up as <code>application/gpx+xml</code> in the <i>File type</i> field.</td>
                </tr>
                <tr>
                  <th>3</th>
                  <td>
                    <figure class="image image_resized" style="width:100%;">
                      <img style="aspect-ratio:620/530;" src="api/attachments/CcjWLhE3KKfv/image/13_Geo map_image.png" width="620"
                      height="530">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">
                    <p>When going back to the map, the track should now be visible.</p>
                    <p>The start and end points of the track are indicated by the two blue markers.</p>
                    <p>&nbsp;</p>
                  </td>
                </tr>
              </tbody>
            </table>
            </figure>
            <h2>Troubleshooting</h2>
            <figure class="image image-style-align-right image_resized" style="width:40.21%;">
              <img style="aspect-ratio:678/499;" src="api/attachments/pGf1p74KKGU4/image/17_Geo map_image.png" width="678"
              height="499">
            </figure>
            <h3>Grid-like artifacts on the map</h3>
            <p>This occurs if the application is not at 100% zoom which causes the pixels
              of the map to not render correctly due to fractional scaling. The only
              possible solution is to set the UI zoom at 100% (default keyboard shortcut
              is Ctrl+0).</p>
            <p>&nbsp;</p>
        </div>
      </div>


blobId: WOvZX8fXe9rOMXY2yx47
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:04.018Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>When accessing a shared note, Trilium will render it as a web page. Sometimes
            it's desirable to serve the content directly so that it can be used in
            a script or downloaded by the user.</p>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:48.52%;">
                  <col style="width:51.48%;">
              </colgroup>
              <tbody>
                <tr>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:378/231;" src="api/attachments/xicVjsf2Kmaz/image/Serving directly the conte.png"
                      width="378" height="231">
                      <figcaption>A note displayed as a web page (HTML)</figcaption>
                    </figure>
                  </td>
                  <td style="vertical-align:top;">
                    <figure class="image">
                      <img style="aspect-ratio:402/129;" src="api/attachments/eizmhhmocL6L/image/1_Serving directly the conte.png"
                      width="402" height="129">
                      <figcaption>A note displayed as a raw format</figcaption>
                    </figure>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>By adding an attribute to the note</h2>
          <p>Simply add the <code>#shareRaw</code> attribute and the note will always
            be rendered <i>raw</i> when accessed from the share URL.</p>
          <h2>By altering the URL</h2>
          <p>Append <code>?raw</code> to the URL to display a note in its raw format
            regardless of whether the <code>#shareRaw</code> attribute is added on the
            note.</p>
          <p>
            <img src="api/attachments/eizmhhmocL6L/image/1_Serving directly the conte.png" width="402" height="129">
          </p>
          <p>&nbsp;</p>
        </div>
      </div>


blobId: yJ8sZz3BcTeZlMboIDBD
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:04.027Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Step 1. Find a place to place the themes</h2>
          <p>Organization is an important aspect of managing a knowledge base. When
            developing a new theme or importing an existing one it's a good idea to
            keep them into one place.</p>
          <p>As such, the first step is to create a new note to gather all the themes.</p>
          <p>
            <img src="api/attachments/EzM9s8bCnJ85/image/5_Creating a custom theme_im.png" width="181" height="84">
          </p>
          <h2>Step 2. Create the theme</h2>
          <figure class="table" style="width:100%;">
            <table class="ck-table-resized">
              <colgroup>
                <col style="width:32.47%;">
                  <col style="width:67.53%;">
              </colgroup>
              <tbody>
                <tr>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:651/220;" src="api/attachments/PY4a4fueTRUZ/image/3_Creating a custom theme_im.png"
                      width="651" height="220">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">Themes are code notes with a special attribute. Start by creating a new
                    code note.</td>
                </tr>
                <tr>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:302/349;" src="api/attachments/14xpFnX5GIkZ/image/1_Creating a custom theme_im.png"
                      width="302" height="349">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">Then change the note type to a CSS code.</td>
                </tr>
                <tr>
                  <td>
                    <figure class="image">
                      <img style="aspect-ratio:316/133;" src="api/attachments/M3C6oYYIakiS/image/Creating a custom theme_im.png"
                      width="316" height="133">
                    </figure>
                  </td>
                  <td style="vertical-align:top;">In the <i>Owned Attributes</i> section define the <code>#appTheme</code> attribute
                    to point to any desired name. This is the name that will show up in the
                    appearance section in settings.</td>
                </tr>
              </tbody>
            </table>
          </figure>
          <h2>Step 3. Define the theme's CSS</h2>
          <p>As a very simple example we will change the background color of the launcher
            pane to a shade of blue.</p>
          <p>To alter the different variables of the theme:</p><pre><code class="language-text-css">:root {
  	--launcher-pane-background-color: #0d6efd;
  }</code></pre>
          <h2>Step 4. Activating the theme</h2>
          <p>Refresh the application (Ctrl+Shift+R is a good way to do so) and go to
            settings. You should see the newly created theme:</p>
          <p>
            <img src="api/attachments/QkaP2Ge0lagI/image/2_Creating a custom theme_im.png" width="631" height="481">
          </p>
          <p>Afterwards the application will refresh itself with the new theme:</p>
          <p>
            <img src="api/attachments/yJVfT7rjp4tI/image/4_Creating a custom theme_im.png" width="653" height="554">
          </p>
          <p>Do note that the theme will be based off of the legacy theme. To override
            that and base the theme on the new TriliumNext theme, see:&nbsp;<a class="reference-link"
            href="#root/WFGzWeUK6arS">Theme base (legacy vs. next)</a>
          </p>
          <h2>Step 5. Making changes</h2>
          <p>Simply go back to the note and change according to needs. To apply the
            changes to the current window, press Ctrl+Shift+R to refresh.</p>
          <p>It's a good idea to keep two windows, one for editing and the other one
            for previewing the changes.</p>
        </div>
      </div>


blobId: gHA8tKwGgnBIIiDO9KqT
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:04.048Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>By default, any custom theme will be based on the legacy light theme.
            To use the TriliumNext theme instead, add the <code>#appThemeBase=next</code> attribute
            onto the existing theme. The <code>appTheme</code> attribute must also be
            present.</p>
          <p>
            <img src="api/attachments/3fAj97aV2noG/image/Customize the Next theme_i.png" width="424" height="140">
          </p>
          <p>The <code>appThemeBase</code> label can be set to one of the following values:</p>
          <ul>
            <li><code>next</code>, for the TriliumNext (auto light or dark mode).</li>
            <li><code>next-light</code>, for the always light mode of the TriliumNext.</li>
            <li><code>next-dark</code>, for the always dark mode of the TriliumNext.</li>
            <li>Any other value is ignored and will use the legacy white theme instead.</li>
          </ul>
          <h2>Overrides</h2>
          <p>Do note that the TriliumNext theme has a few more overrides than the legacy
            theme, so you might need to suffix <code>!important</code> if the style changes
            are not applied.</p><pre><code class="language-text-css">:root {
  	--launcher-pane-background-color: #0d6efd !important;
  }</code></pre>
        </div>
      </div>


blobId: 9KzbFIzC1bvZYmMNPecq
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:04.057Z
content:
  <div class="content">
         

        <div class="ck-content">
          <h2>Detecting mobile vs. desktop</h2>
          <p>The mobile layout is different than the one on the desktop. Use <code>body.mobile</code> and <code>body.desktop</code> to
            differentiate between them.</p><pre><code class="language-text-css">body.mobile #root-widget {
  	/* Do something on mobile */
  }

  body.desktop #root-widget {
  	/* Do something on desktop */
  }</code></pre>
          <p>Do note that there is also a “tablet mode” in the mobile layout. For that
            particular case media queries are required:</p><pre><code class="language-text-css">@media (max-width: 991px) {

      #launcher-pane {

          /* Do something on mobile layout */

      }

  }



  @media (min-width: 992px) {

      #launcher-pane {

          /* Do something on mobile tablet + desktop layout */

      }

  }</code></pre>
          <h2>Detecting horizontal vs. vertical layout</h2>
          <p>The user can select between vertical layout (the classical one, where
            the launcher bar is on the left) and a horizontal layout (where the launcher
            bar is on the top and tabs are full-width).</p>
          <p>Different styles can be applied by using classes at <code>body</code> level:</p><pre><code class="language-text-x-trilium-auto">body.layout-vertical #left-pane {
  	/* Do something */
  }

  body.layout-horizontal #center-pane {
  	/* Do something else */	
  }</code></pre>
          <p>The two different layouts use different containers (but they are present
            in the DOM regardless of the user's choice), for example <code>#horizontal-main-container</code> and <code>#vertical-main-container</code> can
            be used to customize the background of the content section.</p>
          <h2>Detecting platform (Windows, macOS) or Electron</h2>
          <p>It is possible to add particular styles that only apply to a given platform
            by using the classes in <code>body</code>:</p>
          <figure class="table">
            <table>
              <thead>
                <tr>
                  <th>Windows</th>
                  <th>macOS</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td><pre><code class="language-text-x-trilium-auto">body.platform-win32 {
  	background: red;
  }</code></pre>
                  </td>
                  <td><pre><code class="language-text-x-trilium-auto">body.platform-darwin {
  	background: red;
  }</code></pre>
                  </td>
                </tr>
              </tbody>
            </table>
          </figure>
          <p>It is also possible to only apply a style if running under Electron (desktop
            application):</p><pre><code class="language-text-x-trilium-auto">body.electron {
  	background: blue;
  }</code></pre>
          <h3>Native title bar</h3>
          <p>It's possible to detect if the user has selected the native title bar
            or the custom title bar by querying against <code>body</code>:</p><pre><code class="language-text-x-trilium-auto">body.electron.native-titlebar {
  	/* Do something */
  }

  body.electron:not(.native-titlebar) {
  	/* Do something else */
  }</code></pre>
          <h3>Native window buttons</h3>
          <p>When running under Electron with native title bar off, a feature was introduced
            to use the platform-specific window buttons such as the semaphore on macOS.</p>
          <p>See <a href="https://github.com/TriliumNext/Notes/pull/702">Native title bar buttons by eliandoran · Pull Request #702 · TriliumNext/Notes</a> for
            the original implementation of this feature, including screenshots.</p>
          <h4>On Windows</h4>
          <p>The colors of the native window button area can be adjusted using a RGB
            hex color:</p><pre><code class="language-text-x-trilium-auto">body {
  	--native-titlebar-foreground: #ffffff;
  	--native-titlebar-background: #ff0000;
  }</code></pre>
          <p>It is also possible to use transparency at the cost of reduced hover colors
            using a RGBA hex color:</p><pre><code class="language-text-x-trilium-auto">body {
  	--native-titlebar-background: #ff0000aa;
  }</code></pre>
          <p>Note that the value is read when the window is initialized and then it
            is refreshed only when the user changes their light/dark mode preference.</p>
          <h4>On macOS</h4>
          <p>On macOS the semaphore window buttons are enabled by default when the
            native title bar is disabled. The offset of the buttons can be adjusted
            using:</p><pre><code class="language-text-css">body {
      --native-titlebar-darwin-x-offset: 12;
      --native-titlebar-darwin-y-offset: 14 !important;
  }</code></pre>
          <h3>Background/transparency effects on Windows (Mica)</h3>
          <p>Windows 11 offers a special background/transparency effect called Mica,
            which can be enabled by themes by setting the <code>--background-material</code> variable
            at <code>body</code> level:</p><pre><code class="language-text-css">body.electron.platform-win32 {
  	--background-material: tabbed; 
  }</code></pre>
          <p>The value can be either <code>tabbed</code> (especially useful for the horizontal
            layout) or <code>mica</code> (ideal for the vertical layout).</p>
          <p>Do note that the Mica effect is applied at <code>body</code> level and the
            theme needs to make the entire hierarchy (semi-)transparent in order for
            it to be visible. Use the TrilumNext theme as an inspiration.</p>
          <h2>Note icons, tab workspace accent color</h2>
          <p>Theme capabilities are small adjustments done through CSS variables that
            can affect the layout or the visual aspect of the application.</p>
          <p>In the tab bar, to display the icons of notes instead of the icon of the
            workspace:</p><pre><code class="language-text-css">:root {
  	--tab-note-icons: true;
  }</code></pre>
          <p>When a workspace is hoisted for a given tab, it is possible to get the
            background color of that workspace, for example to apply a small strip
            on the tab instead of the whole background color:</p><pre><code class="language-text-css">.note-tab .note-tab-wrapper {
      --tab-background-color: initial !important;
  }

  .note-tab .note-tab-wrapper::after {
      content: "";
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      height: 3px;
      background-color: var(--workspace-tab-background-color);
  }</code></pre>
          <h2>Custom fonts</h2>
          <p>Currently the only way to include a custom font is to use&nbsp;<a class="reference-link"
            href="#root/d3fAXQ2diepH">Custom resource providers</a>.
            Basically import a font into Trilium and assign it <code>#customResourceProvider=fonts/myfont.ttf</code> and
            then import the font in CSS via <code>/custom/fonts/myfont.ttf</code>.</p>
          <h2>Dark and light themes</h2>
          <p>A light theme needs to have the following CSS:</p><pre><code class="language-text-css">:root {
  	--theme-style: light;
  }</code></pre>
          <p>if the theme is dark, then <code>--theme-style</code> needs to be <code>dark</code>.</p>
          <p>If the theme is auto (e.g. supports both light or dark based on <code>prefers-color-scheme</code>)
            it must also declare (in addition to setting <code>--theme-style</code> to
            either <code>light</code> or <code>dark</code>):</p><pre><code class="language-text-css">:root {

      --theme-style-auto: true;

  }</code></pre>
          <p>This will affect the behavior of the Electron application by informing
            the operating system of the color preference (e.g. background effects will
            appear correct on Windows).</p>
        </div>
      </div>


blobId: QKrroj4ptv366BXENnyx
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:04.061Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>It is possible to provide a CSS file to be used regardless of the theme
            set by the user.</p>
          <h2>Seeing the changes</h2>
          <p>Adding a new <i>app CSS note </i>or modifying an existing one does not
            immediately apply changes. To see the changes, press Ctrl+Shift+R to refresh
            the page first.</p>
          <h2>Example use-case: customizing the printing stylesheet</h2>
          <p>When printing a document or exporting as PDF, it is possible to adjust
            the style by creating a CSS note that uses the <code>@media</code> selector.</p>
          <p>For example, to change the font of the document from the one defined by
            the theme or the user to a serif one:</p><pre><code class="language-text-x-trilium-auto">@media print {

  	body {

          --main-font-family: serif !important;

          --detail-font-family: var(--main-font-family) !important;

      }

  }</code></pre>
          <p>&nbsp;</p>
        </div>
      </div>


blobId: OdtRm3RAYr2k3KvRxsXK
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:04.068Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>This tutorials showcases a basic integration with Google Forms, where
            we are able to download the responses of a form using the “Link to Sheets"
            functionality.</p>
          <p>Note that the link will be publicly accessible to everyone (however the
            link is in a hard-to-guess format such as <code>https://docs.google.com/spreadsheets/d/e/2PACX-1vTA8NU2_eZFhc8TFadCZPreBfvP7un8IHd6J0SchrLLw3ueGmntNZjwRmsH2ZRcp1pJYDAzMz1FmFaj/pub?output=csv</code>).
            Make sure you are not accidentally publishing sensitive information.</p>
          <h2>Obtaining the CSV link</h2>
          <ol>
            <li>Open the Google Forms in a browser.</li>
            <li>Select the “Responses” tab and click on “Link to Sheets”.</li>
            <li>Select “Create a new spreadsheet” and press “Create”.</li>
            <li>In Google Sheets, select File → Share → Publish to web.</li>
            <li>In the “Publish to the web” screen, make sure the “Link” tab is selected
              and instead of “Web page”, select “Comma-separated values (.csv)”.</li>
            <li>Copy the given link which will be used for the upcoming script.</li>
          </ol>
          <h2>Creating the script</h2>
          <p>Create a “JS Frontend” script:</p><pre><code class="language-text-x-trilium-auto">const CSV_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vTiwooLV2whjCSVa49dJ99p_G3_qhqHHRqttMjYCJVfLXVdTgUSNJu5K0rpqmaHYF2k7Vofi3o7gW82/pub?output=csv";


  async function fetchData() {

      try {

          const response = await fetch(CSV_URL);

          return await response.text();

      } catch (e) {

          api.showError(e.message);

      }

  }

  const data = await fetchData();
  console.log(data);
  // Do something with the data.</code></pre>
          <p>Note that the data will be received as a string and there is no library
            to do the CSV parsing for us. To do a very simple parsing of CSV:</p><pre><code class="language-text-x-trilium-auto">const content = data
  	.split("\n")
  	.slice(1)
  	.map((row) =&gt; row.split(","));</code></pre>
          <p>This will return the data as an array of arrays.</p>
        </div>
      </div>


blobId: E9kkvH2vaOXtJoa2pjbg
dateModified: 2025-03-09 12:15:03.611+0200
utcDateModified: 2025-03-09 10:15:04.081Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>A custom resource provider allows any file imported into Trilium (images,
            fonts, stylesheets) to be publicly accessible via a URL.</p>
          <p>A potential use case for this is to add embed a custom font alongside
            a theme.</p>
          <h2>Steps for creating a custom resource provider</h2>
          <ol>
            <li>Import a file such as an image or a font into Trilium by drag &amp; drop.</li>
            <li>Select the file and go to the <i>Owned Attributes</i> section.</li>
            <li>Add the label <code>#customResourceProvider=hello</code>.</li>
            <li>To test if it is working, use a browser to navigate to <code>&lt;protocol&gt;://&lt;host&gt;/custom/hello</code> (where <code>&lt;protocol&gt;</code> is
              either <code>http</code> or <code>https</code> based on your setup, and <code>&lt;host&gt;</code> is
              the host or IP to your Trilium server instance). If you are running the
              TriliumNext application without a server, use <code>http://localhost:37840</code> as
              the base URL.</li>
            <li>If everything went well, at the previous step the browser should have
              downloaded the file uploaded in the first step.</li>
          </ol>
          <p>Instead of <code>hello</code>, the name can be:</p>
          <ul>
            <li>A path, such as <code>fonts/Roboto.ttf</code>, which would be accessible
              via <code>&lt;host&gt;/custom/fonts/Roboto.ttf</code>.</li>
            <li>As a more advanced use case, a regular expression to match multiple routes,
              such as <code>hello/.*</code> which will be accessible via <code>/custom/hello/1</code>, <code>/custom/hello/2</code>, <code>/custom/hello/world</code>,
              etc.</li>
          </ul>
          <h2>Using it in a theme</h2>
          <p>For example, if you have a custom font to be imported by the theme, first
            upload a font file into Trilium and assign it the <code>#customResourceProvider=fonts/myfont.ttf</code> attribute.</p>
          <p>Then modify the theme CSS to point to:</p><pre><code class="language-text-css">@font-face {
  	font-family: customFont;
  	src: url("/custom/fonts/myfont.ttf");
  }

  div {
  	font-family: customFont;
  }</code></pre>
        </div>
      </div>


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: MA03xE275mDKBxSdKfLn
dateModified: 2025-03-09 12:17:46.244+0200
utcDateModified: 2025-03-09 10:17:46.260Z
content:
  <div class="content">
         

        <div class="ck-content">
          <p>Go to <a href="https://github.com/TriliumNext/Notes/issues">Issues · TriliumNext/Notes</a> and
            press “New issue”.</p>
          <p>If you are reporting a bug, select “Bug Report” and fill in the details.</p>
        </div>
      </div>


blobId: ONWayNbFEm037If8Hm1h
dateModified: 2025-03-09 12:17:46.244+0200
utcDateModified: 2025-03-09 10:17:46.270Z
content:
  <div class="content">
         

        <div class="ck-content">
          <div>
            <div>
              <p>Trilium supports Mermaid, which adds support for various diagrams such
                as flowchart, sequence diagram, class diagram, state diagram, pie charts,
                etc., all using a text description of the chart instead of manually drawing
                the diagram.</p>
              <p>For the official documentation of Mermaid.js see <a href="https://mermaid.js.org/intro/">mermaid.js.org/intro/</a>.</p>
              <h2>ELK layout engine</h2>
              <p>Mermaid supports a different layout engine which supports slightly more
                complex diagrams, called the <a href="https://eclipse.dev/elk/">Eclipse Layout Kernel (ELK)</a>.
                Trilium has support for these as well, but it's not enabled by default.</p>
              <p>In order to activate ELK for any diagram, insert the following YAML frontmatter
                right at the beginning of the diagram:</p><pre><code class="language-text-x-yaml">---
  config:
    layout: elk
  ---</code></pre>
              <figure class="table" style="width:920px">
                <table>
                  <thead>
                    <tr>
                      <th>With ELK off</th>
                      <th>With ELK on</th>
                    </tr>
                  </thead>
                  <tbody>
                    <tr>
                      <td>
                        <figure class="image image_resized" style="width:100%">
                          <img src="api/images/r44dpvA1xFu8/ELK off.txt" />
                        </figure>
                      </td>
                      <td>
                        <figure class="image image_resized" style="width:100%">
                          <img src="api/images/opAFABmyb3CU/ELK on.txt" />
                        </figure>
                      </td>
                    </tr>
                  </tbody>
                </table>
              </figure>
            </div>
          </div>
        </div>
      </div>


blobId: ddhXdJkSr71YvYsUthwc
dateModified: 2025-03-09 12:17:46.244+0200
utcDateModified: 2025-03-09 10:17:46.272Z
content:
  ---
  title: Interfaces for B
  config:
    layout: elk
  ---
  flowchart LR
  A-->|"Guarantee"|B
  C-->|"User attributes"|B
  C-.->|"Master data"|B
  C-->|"Exchange Rate"|B
  C-->|"Profit Centers"|B
  C-->|"Vendor Partners"|B
  C-->|"Work Situation"|B
  C-->|"Customer"|B
  C-->|"Profit Centers"|B
  B-->|"Guarantee"|C


blobId: AnTgDxVlKttRFkhCgGV1
dateModified: 2025-03-09 12:17:46.244+0200
utcDateModified: 2025-03-09 10:17:46.273Z
content:
  <svg aria-roledescription="flowchart-v2" role="graphics-document document" viewBox="4 -49.66666793823242 530.826416015625 490.2760314941406" style="max-width: 530.826416015625px;" class="flowchart" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-graph-12"><style>#mermaid-graph-12{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}#mermaid-graph-12 .error-icon{fill:#a44141;}#mermaid-graph-12 .error-text{fill:#ddd;stroke:#ddd;}#mermaid-graph-12 .edge-thickness-normal{stroke-width:1px;}#mermaid-graph-12 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-graph-12 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-graph-12 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-graph-12 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-graph-12 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-graph-12 .marker{fill:lightgrey;stroke:lightgrey;}#mermaid-graph-12 .marker.cross{stroke:lightgrey;}#mermaid-graph-12 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-graph-12 p{margin:0;}#mermaid-graph-12 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mermaid-graph-12 .cluster-label text{fill:#F9FFFE;}#mermaid-graph-12 .cluster-label span{color:#F9FFFE;}#mermaid-graph-12 .cluster-label span p{background-color:transparent;}#mermaid-graph-12 .label text,#mermaid-graph-12 span{fill:#ccc;color:#ccc;}#mermaid-graph-12 .node rect,#mermaid-graph-12 .node circle,#mermaid-graph-12 .node ellipse,#mermaid-graph-12 .node polygon,#mermaid-graph-12 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mermaid-graph-12 .rough-node .label text,#mermaid-graph-12 .node .label text,#mermaid-graph-12 .image-shape .label,#mermaid-graph-12 .icon-shape .label{text-anchor:middle;}#mermaid-graph-12 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-graph-12 .rough-node .label,#mermaid-graph-12 .node .label,#mermaid-graph-12 .image-shape .label,#mermaid-graph-12 .icon-shape .label{text-align:center;}#mermaid-graph-12 .node.clickable{cursor:pointer;}#mermaid-graph-12 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mermaid-graph-12 .arrowheadPath{fill:lightgrey;}#mermaid-graph-12 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mermaid-graph-12 .flowchart-link{stroke:lightgrey;fill:none;}#mermaid-graph-12 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mermaid-graph-12 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mermaid-graph-12 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mermaid-graph-12 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mermaid-graph-12 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mermaid-graph-12 .cluster text{fill:#F9FFFE;}#mermaid-graph-12 .cluster span{color:#F9FFFE;}#mermaid-graph-12 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-graph-12 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mermaid-graph-12 rect.text{fill:none;stroke-width:0;}#mermaid-graph-12 .icon-shape,#mermaid-graph-12 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mermaid-graph-12 .icon-shape p,#mermaid-graph-12 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mermaid-graph-12 .icon-shape rect,#mermaid-graph-12 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mermaid-graph-12 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="5" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-12_flowchart-v2-pointEnd"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="4.5" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-12_flowchart-v2-pointStart"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 5 L 10 10 L 10 0 z"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="11" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-12_flowchart-v2-circleEnd"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="-1" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-12_flowchart-v2-circleStart"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="12" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="mermaid-graph-12_flowchart-v2-crossEnd"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="-1" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="mermaid-graph-12_flowchart-v2-crossStart"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker></g><g class="subgraphs"></g><g class="nodes"><g transform="translate(46.861114501953125, 39.00520896911621)" id="flowchart-A-220" class="node default"><rect height="54.01041793823242" width="69.44444465637207" y="-27.00520896911621" x="-34.722222328186035" style="" class="basic label-container"></rect><g transform="translate(-4.722222328186035, -12.005208969116211)" style="" class="label"><rect></rect><foreignObject height="24.010417938232422" width="9.44444465637207"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>A</p></span></div></foreignObject></g></g><g transform="translate(492.2951431274414, 249.10227966308594)" id="flowchart-B-221" class="node default"><rect height="54.01041793823242" width="69.0625" y="-27.00520896911621" x="-34.53125" style="" class="basic label-container"></rect><g transform="translate(-4.53125, -12.005208969116211)" style="" class="label"><rect></rect><foreignObject height="24.010417938232422" width="9.0625"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>B</p></span></div></foreignObject></g></g><g transform="translate(46.79166793823242, 399.99480323791505)" id="flowchart-C-222" class="node default"><rect height="54.01041793823242" width="69.58333396911621" y="-27.00520896911621" x="-34.791666984558105" style="" class="basic label-container"></rect><g transform="translate(-4.7916669845581055, -12.005208969116211)" style="" class="label"><rect></rect><foreignObject height="24.010417938232422" width="9.583333969116211"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>C</p></span></div></foreignObject></g></g></g><g class="edges edgePaths"><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_A_B_0_0" d="M81.583,39.005L140.53,39.005C199.477,39.005,317.37,39.005,376.789,39.367C436.207,39.729,437.15,40.453,437.983,41.286C438.816,42.12,439.54,43.062,439.902,73.201C440.264,103.339,440.264,162.673,440.626,192.812C440.988,222.95,441.712,223.893,442.545,224.726C443.378,225.559,444.321,226.283,446.209,226.645C448.097,227.007,450.931,227.007,452.347,227.007L453.764,227.007"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_1_0" d="M81.583,383.792L86.583,383.792C91.583,383.792,101.583,383.792,107.055,383.43C112.526,383.068,113.469,382.344,114.302,381.511C115.136,380.677,115.859,379.734,116.221,337.635C116.583,295.536,116.583,212.281,116.945,170.182C117.307,128.083,118.031,127.14,118.864,126.307C119.698,125.474,120.641,124.75,167.559,124.388C214.477,124.026,307.37,124.026,354.289,124.388C401.207,124.75,402.15,125.474,402.983,126.307C403.816,127.14,404.54,128.083,404.902,145.688C405.264,163.293,405.264,197.56,405.626,215.165C405.988,232.77,406.712,233.713,407.545,234.546C408.378,235.379,409.321,236.103,417.042,236.465C424.764,236.827,439.264,236.827,446.514,236.827L453.764,236.827"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_2_0" d="M81.583,389.193L89.5,389.193C97.417,389.193,113.25,389.193,121.638,388.831C130.026,388.469,130.969,387.745,131.802,386.912C132.636,386.078,133.359,385.136,133.721,349.221C134.083,313.307,134.083,242.422,134.445,206.508C134.807,170.594,135.531,169.651,136.364,168.818C137.198,167.984,138.141,167.26,179.225,166.898C220.31,166.536,301.537,166.536,342.622,166.898C383.707,167.26,384.65,167.984,385.483,168.818C386.316,169.651,387.04,170.594,387.402,181.932C387.764,193.27,387.764,215.004,388.126,226.342C388.488,237.68,389.212,238.623,390.045,239.456C390.878,240.29,391.821,241.013,402.459,241.375C413.097,241.737,433.431,241.737,443.597,241.737L453.764,241.737"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_3_0" d="M81.583,394.594L92.417,394.594C103.25,394.594,124.917,394.594,136.221,394.232C147.526,393.87,148.469,393.146,149.302,392.313C150.136,391.479,150.859,390.537,151.221,360.807C151.583,331.078,151.583,272.563,151.945,242.833C152.307,213.104,153.031,212.161,153.864,211.328C154.698,210.495,155.641,209.771,190.892,209.409C226.144,209.047,295.704,209.047,330.955,209.409C366.207,209.771,367.15,210.495,367.983,211.328C368.816,212.161,369.54,213.104,369.902,218.176C370.264,223.247,370.264,232.447,370.626,237.519C370.988,242.59,371.712,243.533,372.545,244.366C373.378,245.2,374.321,245.923,387.876,246.285C401.431,246.647,427.597,246.647,440.681,246.647L453.764,246.647"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_4_0" d="M81.583,399.995L95.333,399.995C109.083,399.995,136.583,399.995,150.805,399.633C165.026,399.271,165.969,398.547,166.802,397.714C167.636,396.88,168.359,395.938,168.721,372.393C169.083,348.849,169.083,302.703,169.445,279.159C169.807,255.614,170.531,254.672,171.364,253.838C172.198,253.005,173.141,252.281,220.225,251.919C267.31,251.557,360.537,251.557,407.15,251.557L453.764,251.557"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_5_0" d="M81.583,405.396L98.25,405.396C114.917,405.396,148.25,405.396,165.388,405.034C182.526,404.672,183.469,403.948,184.302,403.115C185.136,402.281,185.859,401.339,186.221,383.979C186.583,366.62,186.583,332.844,186.945,315.484C187.307,298.125,188.031,297.182,188.864,296.349C189.698,295.515,190.641,294.792,220.059,294.43C249.477,294.068,307.37,294.068,336.789,293.706C366.207,293.344,367.15,292.62,367.983,291.787C368.816,290.953,369.54,290.011,369.902,284.939C370.264,279.868,370.264,270.667,370.626,265.596C370.988,260.525,371.712,259.582,372.545,258.748C373.378,257.915,374.321,257.191,387.876,256.829C401.431,256.467,427.597,256.467,440.681,256.467L453.764,256.467"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_6_0" d="M81.583,410.797L101.167,410.797C120.75,410.797,159.917,410.797,179.971,410.435C200.026,410.073,200.969,409.349,201.802,408.516C202.636,407.683,203.359,406.74,203.721,395.565C204.083,384.391,204.083,362.984,204.445,351.81C204.807,340.635,205.531,339.693,206.364,338.859C207.198,338.026,208.141,337.302,237.559,336.94C266.977,336.578,324.87,336.578,354.289,336.216C383.707,335.854,384.65,335.13,385.483,334.297C386.316,333.464,387.04,332.521,387.402,321.183C387.764,309.845,387.764,288.111,388.126,276.773C388.488,265.435,389.212,264.492,390.045,263.658C390.878,262.825,391.821,262.101,402.459,261.739C413.097,261.377,433.431,261.377,443.597,261.377L453.764,261.377"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_7_0" d="M81.583,416.198L104.083,416.198C126.583,416.198,171.583,416.198,194.555,415.836C217.526,415.474,218.469,414.75,219.302,413.917C220.136,413.084,220.859,412.141,221.221,407.151C221.583,402.161,221.583,393.125,221.945,388.135C222.307,383.146,223.031,382.203,223.864,381.37C224.698,380.536,225.641,379.812,255.059,379.45C284.477,379.089,342.37,379.089,371.789,378.727C401.207,378.365,402.15,377.641,402.983,376.808C403.816,375.974,404.54,375.031,404.902,357.426C405.264,339.822,405.264,305.554,405.626,287.95C405.988,270.345,406.712,269.402,407.545,268.568C408.378,267.735,409.321,267.011,417.042,266.649C424.764,266.287,439.264,266.287,446.514,266.287L453.764,266.287"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_8_0" d="M81.583,421.599L137.613,421.599C193.644,421.599,305.704,421.599,362.205,421.237C418.707,420.875,419.65,420.151,420.483,419.318C421.316,418.485,422.04,417.542,422.402,393.67C422.764,369.798,422.764,322.998,423.126,299.126C423.488,275.255,424.212,274.312,425.045,273.478C425.878,272.645,426.821,271.921,431.626,271.559C436.431,271.197,445.097,271.197,449.431,271.197L453.764,271.197"></path><path marker-end="url(#mermaid-graph-12_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_B_C_9_0" d="M457.764,231.917L452.764,231.917C447.764,231.917,437.764,231.917,432.292,231.555C426.821,231.193,425.878,230.469,425.045,229.636C424.212,228.803,423.488,227.86,423.126,203.988C422.764,180.117,422.764,133.316,422.402,109.444C422.04,85.573,421.316,84.63,420.483,83.797C419.65,82.963,418.707,82.239,365.955,81.878C313.204,81.516,208.644,81.516,155.892,81.878C103.141,82.239,102.198,82.963,101.364,83.797C100.531,84.63,99.807,85.573,99.445,133.857C99.083,182.141,99.083,277.766,98.721,326.05C98.359,374.333,97.636,375.276,96.802,376.11C95.969,376.943,95.026,377.667,93.138,378.029C91.25,378.391,88.417,378.391,87,378.391L85.583,378.391"></path></g><g class="edgeLabels"><g transform="translate(295.9236145019531, 38.01041793823242)" class="edgeLabel"><g transform="translate(-37.5694465637207, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="75.1388931274414"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Guarantee</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 123.03125381469727)" class="edgeLabel"><g transform="translate(-53.85416793823242, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="107.70833587646484"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>User attributes</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 165.5416717529297)" class="edgeLabel"><g transform="translate(-42.21354293823242, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="84.42708587646484"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Master data</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 208.0520896911621)" class="edgeLabel"><g transform="translate(-52.38715362548828, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="104.77430725097656"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Exchange Rate</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 250.56250762939453)" class="edgeLabel"><g transform="translate(-49.71354293823242, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="99.42708587646484"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Profit Centers</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 293.07292556762695)" class="edgeLabel"><g transform="translate(-56.84027862548828, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="113.68055725097656"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Vendor Partners</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 335.5833435058594)" class="edgeLabel"><g transform="translate(-52.29166793823242, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="104.58333587646484"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Work Situation</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 378.0937614440918)" class="edgeLabel"><g transform="translate(-33.9756965637207, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="67.9513931274414"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Customer</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 420.6041793823242)" class="edgeLabel"><g transform="translate(-49.71354293823242, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="99.42708587646484"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Profit Centers</p></span></div></foreignObject></g></g><g transform="translate(295.9236145019531, 80.52083587646484)" class="edgeLabel"><g transform="translate(-37.5694465637207, -12.005208969116211)" class="label"><foreignObject height="24.010417938232422" width="75.1388931274414"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>Guarantee</p></span></div></foreignObject></g></g></g><text class="flowchartTitleText" y="-25" x="269.4132080078125" text-anchor="middle">Interfaces for B</text></svg>


blobId: BYKawFApFSB5BajvF0j1
dateModified: 2025-03-09 12:17:46.244+0200
utcDateModified: 2025-03-09 10:17:46.274Z
content:
  ---
  title: Interfaces for B
  ---
  flowchart LR
  A-->|"Guarantee"|B
  C-->|"User attributes"|B
  C-.->|"Master data"|B
  C-->|"Exchange Rate"|B
  C-->|"Profit Centers"|B
  C-->|"Vendor Partners"|B
  C-->|"Work Situation"|B
  C-->|"Customer"|B
  C-->|"Profit Centers"|B
  B-->|"Guarantee"|C


blobId: yShpKgLcdZXSX5pO5qYR
dateModified: 2025-03-09 12:17:46.244+0200
utcDateModified: 2025-03-09 10:17:46.276Z
content:
  <svg aria-roledescription="flowchart-v2" role="graphics-document document" viewBox="0 -50 512.9166564941406 442" style="max-width: 512.9166564941406px;" class="flowchart" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-graph-2"><style>#mermaid-graph-2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}#mermaid-graph-2 .error-icon{fill:#a44141;}#mermaid-graph-2 .error-text{fill:#ddd;stroke:#ddd;}#mermaid-graph-2 .edge-thickness-normal{stroke-width:1px;}#mermaid-graph-2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-graph-2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-graph-2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-graph-2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-graph-2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-graph-2 .marker{fill:lightgrey;stroke:lightgrey;}#mermaid-graph-2 .marker.cross{stroke:lightgrey;}#mermaid-graph-2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-graph-2 p{margin:0;}#mermaid-graph-2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mermaid-graph-2 .cluster-label text{fill:#F9FFFE;}#mermaid-graph-2 .cluster-label span{color:#F9FFFE;}#mermaid-graph-2 .cluster-label span p{background-color:transparent;}#mermaid-graph-2 .label text,#mermaid-graph-2 span{fill:#ccc;color:#ccc;}#mermaid-graph-2 .node rect,#mermaid-graph-2 .node circle,#mermaid-graph-2 .node ellipse,#mermaid-graph-2 .node polygon,#mermaid-graph-2 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mermaid-graph-2 .rough-node .label text,#mermaid-graph-2 .node .label text,#mermaid-graph-2 .image-shape .label,#mermaid-graph-2 .icon-shape .label{text-anchor:middle;}#mermaid-graph-2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-graph-2 .rough-node .label,#mermaid-graph-2 .node .label,#mermaid-graph-2 .image-shape .label,#mermaid-graph-2 .icon-shape .label{text-align:center;}#mermaid-graph-2 .node.clickable{cursor:pointer;}#mermaid-graph-2 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mermaid-graph-2 .arrowheadPath{fill:lightgrey;}#mermaid-graph-2 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mermaid-graph-2 .flowchart-link{stroke:lightgrey;fill:none;}#mermaid-graph-2 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mermaid-graph-2 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mermaid-graph-2 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mermaid-graph-2 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mermaid-graph-2 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mermaid-graph-2 .cluster text{fill:#F9FFFE;}#mermaid-graph-2 .cluster span{color:#F9FFFE;}#mermaid-graph-2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-graph-2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mermaid-graph-2 rect.text{fill:none;stroke-width:0;}#mermaid-graph-2 .icon-shape,#mermaid-graph-2 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mermaid-graph-2 .icon-shape p,#mermaid-graph-2 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mermaid-graph-2 .icon-shape rect,#mermaid-graph-2 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mermaid-graph-2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="5" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-2_flowchart-v2-pointEnd"><path style="stroke-width: 1px; stroke-dasharray: 1px, 0px;" class="arrowMarkerPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="4.5" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-2_flowchart-v2-pointStart"><path style="stroke-width: 1px; stroke-dasharray: 1px, 0px;" class="arrowMarkerPath" d="M 0 5 L 10 10 L 10 0 z"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="11" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-2_flowchart-v2-circleEnd"><circle style="stroke-width: 1px; stroke-dasharray: 1px, 0px;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="-1" viewBox="0 0 10 10" class="marker flowchart-v2" id="mermaid-graph-2_flowchart-v2-circleStart"><circle style="stroke-width: 1px; stroke-dasharray: 1px, 0px;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="12" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="mermaid-graph-2_flowchart-v2-crossEnd"><path style="stroke-width: 2px; stroke-dasharray: 1px, 0px;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="-1" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="mermaid-graph-2_flowchart-v2-crossStart"><path style="stroke-width: 2px; stroke-dasharray: 1px, 0px;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_A_B_0" d="M77.433,196L87.863,196C98.292,196,119.15,196,139.342,196C159.533,196,179.058,196,188.821,196L198.583,196"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_1" d="M446.275,169L430.811,151.5C415.347,134,384.419,99,353.967,98.5C323.514,98,293.537,132,278.548,149L263.559,166"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_2" d="M435.35,169.758L421.707,159.465C408.064,149.172,380.778,128.586,354.023,128.207C327.269,127.827,301.047,147.655,287.935,157.569L274.824,167.482"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_3" d="M435.35,182.879L421.707,177.732C408.064,172.586,380.778,162.293,354.115,162.069C327.453,161.844,301.414,171.689,288.394,176.611L275.375,181.533"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_4" d="M435.35,196L421.707,196C408.064,196,380.778,196,354.158,196C327.539,196,301.586,196,288.61,196L275.633,196"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_5" d="M435.35,209.121L421.707,214.268C408.064,219.414,380.778,229.707,354.115,229.931C327.453,230.156,301.414,220.311,288.394,215.389L275.375,210.467"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_6" d="M435.35,222.242L421.707,232.535C408.064,242.828,380.778,263.414,354.023,263.793C327.269,264.173,301.047,244.345,287.935,234.431L274.824,224.518"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_7" d="M446.275,223L430.811,240.5C415.347,258,384.419,293,353.967,293.5C323.514,294,293.537,260,278.548,243L263.559,226"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_C_B_8" d="M452.239,223L435.781,247.833C419.324,272.667,386.408,322.333,353.896,322.889C321.384,323.445,289.276,274.891,273.223,250.614L257.169,226.336"></path><path marker-end="url(#mermaid-graph-2_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_B_C_9" d="M254.963,169L271.384,144.167C287.806,119.333,320.649,69.667,353.16,69.111C385.671,68.555,417.85,117.111,433.94,141.388L450.03,165.666"></path></g><g class="edgeLabels"><g transform="translate(140.00833129882812, 196)" class="edgeLabel"><g transform="translate(-37.57499694824219, -12)" class="label"><foreignObject height="24" width="75.14999389648438"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Guarantee</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 64)" class="edgeLabel"><g transform="translate(-53.875, -12)" class="label"><foreignObject height="24" width="107.75"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>User attributes</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 108)" class="edgeLabel"><g transform="translate(-42.208335876464844, -12)" class="label"><foreignObject height="24" width="84.41667175292969"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Master data</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 152)" class="edgeLabel"><g transform="translate(-52.39167022705078, -12)" class="label"><foreignObject height="24" width="104.78334045410156"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Exchange Rate</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 196)" class="edgeLabel"><g transform="translate(-49.73332977294922, -12)" class="label"><foreignObject height="24" width="99.46665954589844"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Profit Centers</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 240)" class="edgeLabel"><g transform="translate(-56.85832977294922, -12)" class="label"><foreignObject height="24" width="113.71665954589844"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Vendor Partners</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 284)" class="edgeLabel"><g transform="translate(-52.30000305175781, -12)" class="label"><foreignObject height="24" width="104.60000610351562"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Work Situation</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 328)" class="edgeLabel"><g transform="translate(-33.98332977294922, -12)" class="label"><foreignObject height="24" width="67.96665954589844"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Customer</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 372)" class="edgeLabel"><g transform="translate(-49.73332977294922, -12)" class="label"><foreignObject height="24" width="99.46665954589844"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Profit Centers</p></span></div></foreignObject></g></g><g transform="translate(353.49166107177734, 20)" class="edgeLabel"><g transform="translate(-37.57499694824219, -12)" class="label"><foreignObject height="24" width="75.14999389648438"><div class="labelBkg" xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel"><p>Guarantee</p></span></div></foreignObject></g></g></g><g class="nodes"><g transform="translate(42.71666717529297, 196)" id="flowchart-A-20" class="node default"><rect height="54" width="69.43333435058594" y="-27" x="-34.71666717529297" style="" class="basic label-container"></rect><g transform="translate(-4.716667175292969, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="9.433334350585938"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>A</p></span></div></foreignObject></g></g><g transform="translate(237.10832977294922, 196)" id="flowchart-B-21" class="node default"><rect height="54" width="69.05000305175781" y="-27" x="-34.525001525878906" style="" class="basic label-container"></rect><g transform="translate(-4.525001525878906, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="9.050003051757812"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>B</p></span></div></foreignObject></g></g><g transform="translate(470.1333236694336, 196)" id="flowchart-C-22" class="node default"><rect height="54" width="69.56666564941406" y="-27" x="-34.78333282470703" style="" class="basic label-container"></rect><g transform="translate(-4.783332824707031, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="9.566665649414062"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel"><p>C</p></span></div></foreignObject></g></g></g></g></g><text class="flowchartTitleText" y="-25" x="256.4583282470703" text-anchor="middle">Interfaces for B</text></svg>


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>


