docs(user): mention changes to the geomap button

This commit is contained in:
Elian Doran
2026-08-18 21:45:59 +03:00
parent 5d5c080c8f
commit fbdbec7f3e
15 changed files with 303 additions and 276 deletions
@@ -15,9 +15,14 @@
<a
class="reference-link" href="#root/_hidden/_options/_optionsTextNotes">Text Notes</a>&nbsp;and&nbsp;<a class="reference-link" href="#root/_hidden/_options/_optionsCodeNotes">Code Notes</a>.</p>
<h2>Changing a note's read-only behavior</h2>
<p>Via the&nbsp;<a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>,
by going to the <em>Basic Properties</em> tab and looking for the <em>Editable</em> selection.
The following options are possible:</p>
<p>A note's read-only behavior can be changed via:</p>
<ul>
<li>On the New layout,&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_8YBEPzcpUgxw">Note buttons</a>&nbsp;→ <em>Editable</em> on
the new layout</li>
<li>For the old layout via the&nbsp;<a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>,
by going to the <em>Basic Properties</em> tab and looking for the <em>Editable</em> selection.</li>
</ul>
<p>The following options are possible:</p>
<ul>
<li><strong>Auto</strong>
<br>This is the default behavior in which the note will be editable by default,
@@ -42,8 +47,13 @@
</ul>
<h2>Temporarily editing a read-only note</h2>
<p>When accessing a read-only note, it's possible to temporarily edit it
by using the
<img src="Read-Only Notes_image.png">button in the&nbsp;<a class="reference-link" href="#root/_help_XpOYSgsLkTJy">Floating buttons</a>&nbsp;area.</p>
by:</p>
<ul>
<li>Pressing the <em>Read-only</em> badge on the&nbsp;<a class="reference-link"
href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_IjZS7iK5EXtb">New Layout</a>.</li>
<li>Or pressing the
<img src="Read-Only Notes_image.png">button in the&nbsp;<a class="reference-link" href="#root/_help_XpOYSgsLkTJy">Floating buttons</a>&nbsp;area.</li>
</ul>
<p>When pressed, the note will become editable but will become read-only
again after navigating to a different note.</p>
<h2>Special read-only behavior</h2>
@@ -48,8 +48,9 @@ class="image">
the <em>Inline title</em>. Apart from changing the note type, it's also
possible to apply a <a href="#root/_help_KC1HB96bqqHX">template</a>.</p>
<p>The switcher will disappear as soon as a text is entered.</p>
<img src="6_New Layout_image.png"
width="735" height="143">
<p>
<img src="6_New Layout_image.png" width="735" height="143">
</p>
<h3>Note badges</h3>
<p>Note badges appear near the fixed note title and indicate important information
about the note such as whether it is read-only. Some of the badges are
@@ -83,7 +84,7 @@ class="image">
</figure>
<p>The following sections have been made collapsible:</p>
<ul>
<li><em>Promoted Attributes</em>
<li class="ck-list-marker-italic"><em>Promoted Attributes</em>
<ul>
<li>For full-height notes such as&nbsp;<a class="reference-link" href="#root/_help_grjYqerjn243">Canvas</a>,
the promoted attributes are collapsed by default to make room.</li>
@@ -93,8 +94,8 @@ class="image">
</ul>
</li>
<li><em>Edited Notes</em>, which appears for&nbsp;<a class="reference-link"
href="#root/_help_l0tKav7yLHGF">Day Notes</a>&nbsp;is now shown underneath the
title.
href="#root/_help_l0tKav7yLHGF">[missing note]</a>&nbsp;is now shown underneath
the title.
<ul>
<li>Whether the section is collapsed or not depends on the choice in&nbsp;
<a
@@ -221,12 +222,12 @@ class="image">
<p>Most importantly, v0.105.0 splits the sidebar into multiple tabs with
additional functionality:</p>
<ul>
<li><a class="reference-link" href="#root/_help_2dcGDhp9WFKb">Outline tab</a>, which
gathers the table of contents and highlights lists.</li>
<li><a class="reference-link" href="#root/_help_uNtgN0cUKEBc">Attributes tab</a>,
<li><a class="reference-link" href="#root/_help_2dcGDhp9WFKb">[missing note]</a>,
which gathers the table of contents and highlights lists.</li>
<li><a class="reference-link" href="#root/_help_uNtgN0cUKEBc">[missing note]</a>,
which provides a graphical method of editing labels, relations and (promoted)
attribute definitions.</li>
<li>A dedicated&nbsp;<a class="reference-link" href="#root/_help_LrKznOtw9cQD">AI chat tab</a>.</li>
<li>A dedicated&nbsp;<a class="reference-link" href="#root/_help_LrKznOtw9cQD">[missing note]</a>.</li>
<li><a class="reference-link" href="#root/_help_KRlZFoIH0j6p">Connections tab</a>,
which groups together the note map, note paths, backlinks and similar notes.</li>
</ul>
@@ -50,21 +50,17 @@
<h2>Adding a marker using the map</h2>
<h3>Adding a new note using the plus button</h3>
<ol>
<li>
<p>To create a marker, first navigate to the desired point on the map. Then
press the <em>Add marker</em> button at the center-bottom of the map.</p>
</li>
<li>To create a marker, first navigate to the desired point on the map. Then
press the <em>Add marker</em> button at the center-bottom of the map.</li>
<li>
<p>Once pressed, the map will enter in the insert mode, as illustrated by
the notification. Additionally, a preview of the marker will be shown at
the cursor position.</p>
<p>Simply click the point on the map where to place the marker. To cancel,
press either the &nbsp;<kbd>Escape</kbd> key or press again the <em>Add marker</em> button.</p>
</li>
<li>
<p>Once clicked, the marker will show up on the map and a popup will show
to the right with the title already selected to be changed.</p>
press either the &nbsp;Escape key or press again the <em>Add marker</em> button.</p>
</li>
<li>Once clicked, the marker will show up on the map and a popup will show
to the right with the title already selected to be changed.</li>
</ol>
<h3>Adding a new note using the contextual menu</h3>
<ol>
@@ -106,7 +102,7 @@
underneath the title bar.</li>
</ul>
<p>After clicking the button to move the marker, click at the desired position
on the map to replace it. To cancel the operation, press <kbd>Escape</kbd>.</p>
on the map to replace it. To cancel the operation, press Escape.</p>
<aside
class="admonition note">
<p>If the map is locked for editing (see below), the map needs to be unlocked
@@ -155,7 +151,7 @@ class="admonition note">
<ul>
<li>Press the X button at the top-right of the popup.</li>
<li>In the map, press anywhere outside the popup.</li>
<li>Or simply press the <kbd>Escape</kbd> key.</li>
<li>Or simply press the Escape key.</li>
</ul>
<p>When a marker is clicked, the map will automatically adjust the viewport
so that the marker is still visible with the popup open. The currently
@@ -270,17 +266,17 @@ class="admonition note">
builtin markers, or custom markers that are part of the track), only that
marker is brought into view, as opposed to the entire route.</p>
<h2>Read-only mode</h2>
<p>When a map is in read-only all editing features will be disabled such
as:</p>
<p>When a map is <a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/BFs8mudNFgCS/_help_CoFPLs3dRlXc">read-only</a> all
editing features will be disabled such as:</p>
<ul>
<li>The add button at the bottom of the map.</li>
<li>Repositioning markers.</li>
<li>Editing from the contextual menu (removing locations or adding new items).</li>
</ul>
<p>To enable read-only mode simply press the <em>Lock</em> icon from the&nbsp;
<a
class="reference-link" href="#root/_help_8YBEPzcpUgxw">Note buttons</a>&nbsp;(or&nbsp;<a class="reference-link" href="#root/_help_XpOYSgsLkTJy">Floating buttons</a>&nbsp;for
the old layout). To disable it, press the button again.</p>
<p>To set a map as read-only, go to&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_8YBEPzcpUgxw">Note buttons</a>&nbsp;→ <em>Editable</em> → <em>Read-only</em> (on
the new layout, or in Basic Properties on the&nbsp;<a class="reference-link"
href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_BlN9DFI679QC">Ribbon</a>&nbsp;for
the old layout).</p>
<h2>Configuration</h2>
<h3>Map Style</h3>
<p>The styling of the map can be adjusted in the&nbsp;<a class="reference-link"
@@ -318,7 +314,7 @@ class="admonition note">
</figure>
<p>Trilium v0.105.0 introduces a 3D view, courtesy of MapLibre GL. To enter
3D mode, simply press the corresponding button at the bottom-right of the
map or press <kbd>Ctrl</kbd> and drag across the map.</p>
map or press Ctrl and drag across the map.</p>
<p>The buildings will only appear from zoom 14 onwards to avoid lag.</p>
<aside
class="admonition note">
@@ -5,46 +5,44 @@
<p>Global events are attached to the script note via label. Simply create
a <code spellcheck="false">run</code> label with some of these values and
script note will be executed once the event occurs.</p>
<figure class="table">
<table>
<thead>
<tr>
<th>Label</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code spellcheck="false">run</code>
</td>
<td>
<p>Defines on which events script should run. Possible values are:</p>
<ul>
<li><code spellcheck="false">backendStartup</code> - when Trilium backend starts
up</li>
<li><code spellcheck="false">hourly</code> - run once an hour. You can use
additional label <code spellcheck="false">runAtHour</code> to specify at
which hour, on the back-end.</li>
<li><code spellcheck="false">daily</code> - run once a day, on the back-end</li>
</ul>
</td>
</tr>
<tr>
<td><code spellcheck="false">runOnInstance</code>
</td>
<td>Specifies that the script should only run on a particular&nbsp;<a class="reference-link"
href="#root/_help_c5xB8m4g2IY6">Trilium instance</a>.</td>
</tr>
<tr>
<td><code spellcheck="false">runAtHour</code>
</td>
<td>On which hour should this run. Should be used together with <code spellcheck="false">#run=hourly</code>.
Can be defined multiple times for more runs during the day.</td>
</tr>
</tbody>
</table>
</figure>
<p>Frontend scripts also have similar&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/CdNpE2pqjmI6/yIhgI5H7A2Sm/_help_irkwjdNtjcxR">Events</a>,
<table>
<thead>
<tr>
<th>Label</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code spellcheck="false">run</code>
</td>
<td>
<p>Defines on which events script should run. Possible values are:</p>
<ul>
<li><code spellcheck="false">backendStartup</code> - when Trilium backend starts
up</li>
<li><code spellcheck="false">hourly</code> - run once an hour. You can use
additional label <code spellcheck="false">runAtHour</code> to specify at
which hour, on the back-end.</li>
<li><code spellcheck="false">daily</code> - run once a day, on the back-end</li>
</ul>
</td>
</tr>
<tr>
<td><code spellcheck="false">runOnInstance</code>
</td>
<td>Specifies that the script should only run on a particular&nbsp;<a class="reference-link"
href="#root/_help_c5xB8m4g2IY6">Trilium instance</a>.</td>
</tr>
<tr>
<td><code spellcheck="false">runAtHour</code>
</td>
<td>On which hour should this run. Should be used together with <code spellcheck="false">#run=hourly</code>.
Can be defined multiple times for more runs during the day.</td>
</tr>
</tbody>
</table>
<p>Frontend scripts also have similar&nbsp;<a class="reference-link" href="#root/_help_irkwjdNtjcxR">Events</a>,
such as when the application starts.</p>
<aside class="admonition note">
<p>One script can be triggered on multiple events, this can be done by adding
@@ -162,5 +160,5 @@ if (attr.value === "Health") {
note.removeLabel("color");
}</code></pre>
<h2>Safe mode</h2>
<p>While <a href="#root/pOsGYCXsbNQG/tC7s2alapj8V/_help_64ZTlUPgEPtW">safe mode</a> is
active, scripts with events won't trigger.</p>
<p>While <a href="#root/_help_64ZTlUPgEPtW">safe mode</a> is active, scripts with
events won't trigger.</p>
@@ -5,8 +5,8 @@
<table>
<thead>
<tr>
<th>&nbsp;</th>
<th>&nbsp;</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
@@ -43,7 +43,7 @@
<h2>Scripts</h2>
<p>Scripts don't have any special requirements. They can be run manually
using the <em>Execute</em> button on the code note or they can be run automatically,
see&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/CdNpE2pqjmI6/yIhgI5H7A2Sm/_help_irkwjdNtjcxR">Events</a>.</p>
see&nbsp;<a class="reference-link" href="#root/_help_irkwjdNtjcxR">Events</a>.</p>
<h2>Widgets</h2>
<p>Widgets require a certain format in order for Trilium to be able to integrate
them into the UI.</p>
@@ -3,7 +3,7 @@
<code
spellcheck="false">addButtonToToolbar</code>API which will only create widgets for desktop.</p>
<p>Instead, a custom launcher widget can be created using the&nbsp;<a class="reference-link"
href="#root/pOsGYCXsbNQG/CdNpE2pqjmI6/yIhgI5H7A2Sm/_help_4Gn3psZKsfSm">Launch Bar Widgets</a>&nbsp;documentation.</p>
href="#root/_help_4Gn3psZKsfSm">Launch Bar Widgets</a>&nbsp;documentation.</p>
</aside>
<p>In this example we are going to extend the functionality of&nbsp;<a class="reference-link"
href="#root/_help_xYjQUYhpbUEW">Task Manager</a>&nbsp;showcase (which comes by
@@ -39,15 +39,14 @@
<a
href="#root/_help_s8alTXmpFR61">refresh the application</a>.</p>
<h2>Understanding how the script works</h2>
<figure class="table">
<table class="ck-table-resized">
<colgroup>
<table class="ck-table-resized">
<colgroup>
<col style="width:50%;">
<col style="width:50%;">
<col style="width:50%;">
</colgroup>
<tbody>
<tr>
<td><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({
</colgroup>
<tbody>
<tr>
<td><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({
title: "New task",
icon: "task",
shortcut: "alt+n",
@@ -55,84 +54,83 @@
// [...]
}
});</code></pre>
</td>
<td>
<p>This uses the <a href="#root/_help_yIhgI5H7A2Sm">Front-end API</a> to create a
icon in the&nbsp;<a class="reference-link" href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>,
by specifying:</p>
<ul>
<li>A title</li>
<li>A corresponding boxicons icon (without the <code spellcheck="false">bx-</code> prefix).</li>
<li>Optionally, a keyboard shortcut to assign to it.</li>
<li>The action, which will be executed when the button is pressed.</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">const taskNoteId = await api.runOnBackend(() =&gt; {
</td>
<td>
<p>This uses the <a href="#root/_help_yIhgI5H7A2Sm">Front-end API</a> to create a
icon in the&nbsp;<a class="reference-link" href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>,
by specifying:</p>
<ul>
<li>A title</li>
<li>A corresponding boxicons icon (without the <code spellcheck="false">bx-</code> prefix).</li>
<li>Optionally, a keyboard shortcut to assign to it.</li>
<li>The action, which will be executed when the button is pressed.</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">const taskNoteId = await api.runOnBackend(() =&gt; {
// Shown below.
return resp.note.noteId;
});</code></pre>
</td>
<td>
<ul>
<li>This portion of code is actually executed on the server (backend) and
not on the client (i.e. browser).
<ul>
<li>The reason is that the creating notes is the responsibility of the server.</li>
</ul>
</li>
<li>Here we can also see that it is possible to return results from the server
execution and read them in the client (<code spellcheck="false">taskNoteId</code>).</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">const todoRootNote = api.getNoteWithLabel("taskTodoRoot");</code></pre>
</td>
<td>
<ul>
<li>Here we identify a note with the <a href="#root/_help_zEY4DaJG4YT5">label</a>
<code
spellcheck="false">#taskTodoRoot</code>. This is how the&nbsp;<a class="reference-link" href="#root/_help_xYjQUYhpbUEW">Task Manager</a>&nbsp;showcase
knows where to place all the different tasks.</li>
<li>Normally this might return a <code spellcheck="false">null</code> value
if no such note could be identified, but error handling is outside the
scope of this example.&nbsp;</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">const resp = api.createTextNote(todoRootNote.noteId, "New task", "")</code></pre>
</td>
<td>
<ul>
<li>We create a new child note within the to-do root note (first argument)
with the title “New task" (second argument) and no content by default (third
argument).</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">await api.waitUntilSynced();</code></pre>
</td>
<td>
<ul>
<li>Back on the client, since we created a new note on the server, we now
need to wait for the change to be reflected in the client.</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">await api.activateNewNote(taskNoteId);</code></pre>
</td>
<td>
<ul>
<li>Since we know the <a href="#root/_help_m1lbrzyKDaRB">ID</a> of the newly created
note, all we have to do now is to show this note to the user.</li>
</ul>
</td>
</tr>
</tbody>
</table>
</figure>
</td>
<td>
<ul>
<li>This portion of code is actually executed on the server (backend) and
not on the client (i.e. browser).
<ul>
<li>The reason is that the creating notes is the responsibility of the server.</li>
</ul>
</li>
<li>Here we can also see that it is possible to return results from the server
execution and read them in the client (<code spellcheck="false">taskNoteId</code>).</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">const todoRootNote = api.getNoteWithLabel("taskTodoRoot");</code></pre>
</td>
<td>
<ul>
<li>Here we identify a note with the <a href="#root/_help_zEY4DaJG4YT5">label</a>
<code
spellcheck="false">#taskTodoRoot</code>. This is how the&nbsp;<a class="reference-link" href="#root/_help_xYjQUYhpbUEW">Task Manager</a>&nbsp;showcase
knows where to place all the different tasks.</li>
<li>Normally this might return a <code spellcheck="false">null</code> value
if no such note could be identified, but error handling is outside the
scope of this example.&nbsp;</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">const resp = api.createTextNote(todoRootNote.noteId, "New task", "")</code></pre>
</td>
<td>
<ul>
<li>We create a new child note within the to-do root note (first argument)
with the title “New task" (second argument) and no content by default (third
argument).</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">await api.waitUntilSynced();</code></pre>
</td>
<td>
<ul>
<li>Back on the client, since we created a new note on the server, we now
need to wait for the change to be reflected in the client.</li>
</ul>
</td>
</tr>
<tr>
<td><pre><code class="language-text-x-trilium-auto">await api.activateNewNote(taskNoteId);</code></pre>
</td>
<td>
<ul>
<li>Since we know the <a href="#root/_help_m1lbrzyKDaRB">ID</a> of the newly created
note, all we have to do now is to show this note to the user.</li>
</ul>
</td>
</tr>
</tbody>
</table>
@@ -18,5 +18,5 @@
<a
class="reference-link" href="#root/_help_GPERMystNGTB">Events</a>&nbsp;for more information.</p>
<h2>Safe mode</h2>
<p>While <a href="#root/pOsGYCXsbNQG/tC7s2alapj8V/_help_64ZTlUPgEPtW">safe mode</a> is
active, scripts with events won't trigger.</p>
<p>While <a href="#root/_help_64ZTlUPgEPtW">safe mode</a> is active, scripts with
events won't trigger.</p>
@@ -30,14 +30,9 @@
</ol>
<h2>Mobile layout</h2>
<p>Custom launch bar widgets are also supported on the&nbsp;<a class="reference-link"
href="#root/pOsGYCXsbNQG/Otzi9La2YAUX/_help_RDslemsQ6gCp">Mobile Frontend</a>.
To do so:</p>
href="#root/_help_RDslemsQ6gCp">Mobile Frontend</a>. To do so:</p>
<ol>
<li>
<p>Go to&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/Vc8PjrjAGuOp/_help_x3i7MxGccDuM">Global menu</a>&nbsp;→ <em>Advanced</em> → <em>Show Hidden Subtree</em>.</p>
</li>
<li>
<p>Look for <em>Mobile Launch Bar</em> and follow the same creation mechanism
as in the previous section.</p>
</li>
<li>Go to&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;→ <em>Advanced</em> → <em>Show Hidden Subtree</em>.</li>
<li>Look for <em>Mobile Launch Bar</em> and follow the same creation mechanism
as in the previous section.</li>
</ol>
@@ -16,7 +16,7 @@ A real database observed in 2026 held ~165 000 entity changes against only ~12 0
`content_hash#getEntityHashes` folds the flag into the per-sector hash:
```js
```
entityHashMap[sector] = (entityHashMap[sector] || "") + hash + isErased;
```
@@ -33,7 +33,7 @@ A manual `DELETE FROM entity_changes WHERE isErased = 1` only sticks if it is do
The same wall was already hit for blobs and special-cased in `erase#eraseUnusedBlobs`, which purges their change rows outright instead of tombstoning them:
```js
```
// blobs are not marked as erased in entity_changes, they are just purged completely
// this is because technically every keystroke can create a new blob and there would be just too many
sql.executeMany(`DELETE FROM entity_changes WHERE entityName = 'blobs' AND entityId IN (???)`, unusedBlobIds);
@@ -45,4 +45,4 @@ That exception was never generalised, so every other entity type still accumulat
The cost is invisible on native clients — better-sqlite3 handles a few hundred thousand rows without complaint. It is only fatal on the WASM targets (standalone in the browser, and the Capacitor mobile app built on it), where SQLite runs synchronously and a long transaction blocks the thread. This is latent debt that the newer targets exposed rather than created.
Any real fix has to address the hash coupling above. The plausible directions are a per-instance acknowledged-id watermark that permits coordinated collection, a snapshot/bootstrap path so fresh clients do not replay history, or generalising the blob purge to other high-churn entity types.
Any real fix has to address the hash coupling above. The plausible directions are a per-instance acknowledged-id watermark that permits coordinated collection, a snapshot/bootstrap path so fresh clients do not replay history, or generalising the blob purge to other high-churn entity types.
@@ -2,7 +2,7 @@
The repository ships **three** independent ZIP implementations. This looks like an obvious consolidation target and is not one — each is anchored by a constraint the others cannot satisfy. This page exists so the analysis is not repeated.
| Library | Declared by | Used for |
|---|---|---|
| --- | --- | --- |
| `jszip` | `packages/commons` | The XLSX container, via `exceljs`; also `renderSpreadsheetToCsvZip` |
| `fflate` | `apps/standalone` | The browser note `ZipProvider` (`lightweight/zip_provider.ts`) |
| `archiver` + `yauzl` | `apps/server` | The Node `ZipProvider` used by server and desktop |
@@ -21,4 +21,4 @@ fflate is the deliberate lighter choice for the browser: roughly 30 KB against j
`packages/commons` is intentionally **browser-pure** — its library `tsconfig` does not include `@types/node`; only the spec `tsconfig` does. jszip's `index.d.ts` carries a `/// <reference types="node" />`, which has been silently supplying the `Buffer` global type to `parse_from_xlsx.ts`.
If jszip ever does leave commons, `bytesToBase64`'s reference to `Buffer` breaks. The fix is to reach it through `globalThis` rather than re-adding `@types/node`, which would undo the browser-purity constraint.
If jszip ever does leave commons, `bytesToBase64`'s reference to `Buffer` breaks. The fix is to reach it through `globalThis` rather than re-adding `@types/node`, which would undo the browser-purity constraint.
@@ -19,7 +19,7 @@ The two views then disagree, in a way that produces exactly the symptom above:
* **Recent Changes reads the database directly.** `routes/api/recent_changes.ts` queries `notes` by raw SQL, so it sees the new row.
* **The tree and `tree/load` read Becca**, which in process B has no such note. The client renders any entry it cannot resolve through Froca as a deleted-note link.
* **Hovering that link calls `/api/deleted-notes/:noteId/metadata`**, which selects `... WHERE noteId = ? AND isDeleted = 1` and throws `NotFoundError` when it finds nothing — and it finds nothing precisely because the note is *alive*.
* **Hovering that link calls `/api/deleted-notes/:noteId/metadata`**, which selects `... WHERE noteId = ? AND isDeleted = 1` and throws `NotFoundError` when it finds nothing — and it finds nothing precisely because the note is _alive_.
Restarting the second instance reloads Becca from disk, which is why the note then appears.
@@ -37,4 +37,4 @@ The same applies to any automation pointed at a running instance: a REST or MCP
## Avoiding it
Give each instance its own data directory (`TRILIUM_DATA_DIR`) whenever two are running at once. The development server already does this by default (`apps/server/data`); the installed application and a locally built desktop app do not.
Give each instance its own data directory (`TRILIUM_DATA_DIR`) whenever two are running at once. The development server already does this by default (`apps/server/data`); the installed application and a locally built desktop app do not.
+103 -82
View File
@@ -6190,6 +6190,20 @@
"value": "bx bx-edit-alt",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "8YBEPzcpUgxw",
"isInheritable": false,
"position": 110
},
{
"type": "relation",
"name": "internalLink",
"value": "IjZS7iK5EXtb",
"isInheritable": false,
"position": 120
}
],
"format": "markdown",
@@ -14897,20 +14911,6 @@
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
"value": "8YBEPzcpUgxw",
"isInheritable": false,
"position": 60
},
{
"type": "relation",
"name": "internalLink",
"value": "XpOYSgsLkTJy",
"isInheritable": false,
"position": 70
},
{
"type": "relation",
"name": "internalLink",
@@ -14945,6 +14945,27 @@
"value": "",
"isInheritable": false,
"position": 30
},
{
"type": "relation",
"name": "internalLink",
"value": "CoFPLs3dRlXc",
"isInheritable": false,
"position": 100
},
{
"type": "relation",
"name": "internalLink",
"value": "8YBEPzcpUgxw",
"isInheritable": false,
"position": 110
},
{
"type": "relation",
"name": "internalLink",
"value": "BlN9DFI679QC",
"isInheritable": false,
"position": 120
}
],
"format": "markdown",
@@ -20606,33 +20627,40 @@
"isInheritable": false,
"position": 70
},
{
"type": "relation",
"name": "internalLink",
"value": "irkwjdNtjcxR",
"isInheritable": false,
"position": 80
},
{
"type": "relation",
"name": "internalLink",
"value": "GhurYZjh8e1V",
"isInheritable": false,
"position": 100
"position": 90
},
{
"type": "relation",
"name": "internalLink",
"value": "M8IppdwVHSjG",
"isInheritable": false,
"position": 110
"position": 100
},
{
"type": "relation",
"name": "internalLink",
"value": "Q2z6av6JZVWm",
"isInheritable": false,
"position": 120
"position": 110
},
{
"type": "relation",
"name": "internalLink",
"value": "SynTBQiBsdYJ",
"isInheritable": false,
"position": 130
"position": 120
},
{
"type": "label",
@@ -20647,13 +20675,6 @@
"value": "bx bx-window",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "irkwjdNtjcxR",
"isInheritable": false,
"position": 140
}
],
"format": "markdown",
@@ -21091,52 +21112,59 @@
{
"type": "relation",
"name": "internalLink",
"value": "xYjQUYhpbUEW",
"value": "4Gn3psZKsfSm",
"isInheritable": false,
"position": 10
},
{
"type": "relation",
"name": "internalLink",
"value": "xYmIYSP6wE3F",
"value": "xYjQUYhpbUEW",
"isInheritable": false,
"position": 20
},
{
"type": "relation",
"name": "internalLink",
"value": "6f9hih2hXXZk",
"value": "xYmIYSP6wE3F",
"isInheritable": false,
"position": 30
},
{
"type": "relation",
"name": "internalLink",
"value": "zEY4DaJG4YT5",
"value": "6f9hih2hXXZk",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "s8alTXmpFR61",
"value": "zEY4DaJG4YT5",
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
"value": "yIhgI5H7A2Sm",
"value": "s8alTXmpFR61",
"isInheritable": false,
"position": 60
},
{
"type": "relation",
"name": "internalLink",
"value": "m1lbrzyKDaRB",
"value": "yIhgI5H7A2Sm",
"isInheritable": false,
"position": 70
},
{
"type": "relation",
"name": "internalLink",
"value": "m1lbrzyKDaRB",
"isInheritable": false,
"position": 80
},
{
"type": "label",
"name": "iconClass",
@@ -21150,13 +21178,6 @@
"value": "new-task-button",
"isInheritable": false,
"position": 90
},
{
"type": "relation",
"name": "internalLink",
"value": "4Gn3psZKsfSm",
"isInheritable": false,
"position": 100
}
],
"format": "markdown",
@@ -21306,6 +21327,13 @@
"isInheritable": false,
"position": 70
},
{
"type": "relation",
"name": "internalLink",
"value": "RDslemsQ6gCp",
"isInheritable": false,
"position": 80
},
{
"type": "label",
"name": "iconClass",
@@ -21319,13 +21347,6 @@
"value": "launch-bar-widgets",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "RDslemsQ6gCp",
"isInheritable": false,
"position": 80
}
],
"format": "markdown",
@@ -21769,6 +21790,27 @@
"type": "text",
"mime": "text/html",
"attributes": [
{
"type": "relation",
"name": "internalLink",
"value": "HI6GBBIduIgv",
"isInheritable": false,
"position": 10
},
{
"type": "relation",
"name": "internalLink",
"value": "GPERMystNGTB",
"isInheritable": false,
"position": 20
},
{
"type": "relation",
"name": "internalLink",
"value": "64ZTlUPgEPtW",
"isInheritable": false,
"position": 30
},
{
"type": "label",
"name": "iconClass",
@@ -21782,27 +21824,6 @@
"value": "events",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "HI6GBBIduIgv",
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
"value": "GPERMystNGTB",
"isInheritable": false,
"position": 60
},
{
"type": "relation",
"name": "internalLink",
"value": "64ZTlUPgEPtW",
"isInheritable": false,
"position": 70
}
],
"format": "markdown",
@@ -21956,10 +21977,24 @@
{
"type": "relation",
"name": "internalLink",
"value": "zEY4DaJG4YT5",
"value": "irkwjdNtjcxR",
"isInheritable": false,
"position": 30
},
{
"type": "relation",
"name": "internalLink",
"value": "zEY4DaJG4YT5",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "64ZTlUPgEPtW",
"isInheritable": false,
"position": 50
},
{
"type": "label",
"name": "shareAlias",
@@ -21973,20 +22008,6 @@
"value": "bx bx-rss",
"isInheritable": false,
"position": 20
},
{
"type": "relation",
"name": "internalLink",
"value": "irkwjdNtjcxR",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "64ZTlUPgEPtW",
"isInheritable": false,
"position": 50
}
],
"format": "markdown",
@@ -11,7 +11,12 @@ In addition, it's possible to change the number of characters at which the autom
## Changing a note's read-only behavior
Via the <a class="reference-link" href="../UI%20Elements/Ribbon.md">Ribbon</a>, by going to the _Basic Properties_ tab and looking for the _Editable_ selection. The following options are possible:
A note's read-only behavior can be changed via:
* On the New layout, <a class="reference-link" href="../UI%20Elements/Note%20buttons.md">Note buttons</a> → _Editable_ on the new layout
* For the old layout via the <a class="reference-link" href="../UI%20Elements/Ribbon.md">Ribbon</a>, by going to the _Basic Properties_ tab and looking for the _Editable_ selection.
The following options are possible:
* **Auto**
This is the default behavior in which the note will be editable by default, unless it becomes large enough to trigger read-only mode.
@@ -31,7 +36,10 @@ Apart from using the ribbon as previously mentioned, it's also possible to use [
## Temporarily editing a read-only note
When accessing a read-only note, it's possible to temporarily edit it by using the ![](Read-Only%20Notes_image.png) button in the <a class="reference-link" href="../UI%20Elements/Floating%20buttons.md">Floating buttons</a> area.
When accessing a read-only note, it's possible to temporarily edit it by:
* Pressing the _Read-only_ badge on the <a class="reference-link" href="../UI%20Elements/New%20Layout.md">New Layout</a>.
* Or pressing the ![](Read-Only%20Notes_image.png) button in the <a class="reference-link" href="../UI%20Elements/Floating%20buttons.md">Floating buttons</a> area.
When pressed, the note will become editable but will become read-only again after navigating to a different note.
@@ -55,7 +55,7 @@ The following sections have been made collapsible:
* _Promoted Attributes_
* For full-height notes such as <a class="reference-link" href="../../Note%20Types/Canvas.md">Canvas</a>, the promoted attributes are collapsed by default to make room.
* The keyboard shortcut previously used to trigger the promoted attributes ribbon tab (which was no longer working) has been repurposed to toggle the promoted attributes instead.
* _Edited Notes_, which appears for <a class="reference-link" href="../../Advanced%20Usage/Advanced%20Showcases/Day%20Notes.md">Day Notes</a> is now shown underneath the title.
* _Edited Notes_, which appears for <a class="reference-link" href="../../Advanced%20Usage/Advanced%20Showcases/Day%20Notes.md">[missing note]</a> is now shown underneath the title.
* Whether the section is collapsed or not depends on the choice in <a class="reference-link" href="Options.md">Options</a> → Appearance.
* _Search Properties_, which appears for the full <a class="reference-link" href="../Navigation/Search.md">Search</a> and <a class="reference-link" href="../../Note%20Types/Saved%20Search.md">Saved Search</a>.
@@ -125,9 +125,9 @@ The sidebar (also known as the right pane) also received some important changes.
Most importantly, v0.105.0 splits the sidebar into multiple tabs with additional functionality:
* <a class="reference-link" href="Right%20Sidebar/Outline%20tab.md">Outline tab</a>, which gathers the table of contents and highlights lists.
* <a class="reference-link" href="Right%20Sidebar/Attributes%20tab.md">Attributes tab</a>, which provides a graphical method of editing labels, relations and (promoted) attribute definitions.
* A dedicated <a class="reference-link" href="Right%20Sidebar/AI%20chat%20tab.md">AI chat tab</a>.
* <a class="reference-link" href="Right%20Sidebar/Outline%20tab.md">[missing note]</a>, which gathers the table of contents and highlights lists.
* <a class="reference-link" href="Right%20Sidebar/Attributes%20tab.md">[missing note]</a>, which provides a graphical method of editing labels, relations and (promoted) attribute definitions.
* A dedicated <a class="reference-link" href="Right%20Sidebar/AI%20chat%20tab.md">[missing note]</a>.
* <a class="reference-link" href="Right%20Sidebar/Connections%20tab.md">Connections tab</a>, which groups together the note map, note paths, backlinks and similar notes.
The previous iteration of the sidebar would appear contextually, depending on whether there are any items to be displayed. This caused occasional content shifts when moving between two panes in a split view. In the new layout, the sidebar acts more like the <a class="reference-link" href="Note%20Tree.md">Note Tree</a> pane, remaining visible even if there is nothing to display.
+6 -6
View File
@@ -44,7 +44,7 @@ The position on the map and the zoom are saved inside the map note and restored
1. To create a marker, first navigate to the desired point on the map. Then press the _Add marker_ button at the center-bottom of the map.
2. Once pressed, the map will enter in the insert mode, as illustrated by the notification. Additionally, a preview of the marker will be shown at the cursor position.
Simply click the point on the map where to place the marker. To cancel, press either the  <kbd>Escape</kbd> key or press again the _Add marker_ button.
Simply click the point on the map where to place the marker. To cancel, press either the  Escape key or press again the _Add marker_ button.
3. Once clicked, the marker will show up on the map and a popup will show to the right with the title already selected to be changed.
### Adding a new note using the contextual menu
@@ -81,7 +81,7 @@ Once a marker is set, it can be repositioned using one of the two ways:
* By right clicking the marker and selecting _Move to another location_.
* By clicking the marker to open the popup and selecting the _Move to another location_ button underneath the title bar.
After clicking the button to move the marker, click at the desired position on the map to replace it. To cancel the operation, press <kbd>Escape</kbd>.
After clicking the button to move the marker, click at the desired position on the map to replace it. To cancel the operation, press Escape.
> [!NOTE]
> If the map is locked for editing (see below), the map needs to be unlocked before moving the marker.
@@ -112,7 +112,7 @@ To dismiss the popup:
* Press the X button at the top-right of the popup.
* In the map, press anywhere outside the popup.
* Or simply press the <kbd>Escape</kbd> key.
* Or simply press the Escape key.
When a marker is clicked, the map will automatically adjust the viewport so that the marker is still visible with the popup open. The currently selected marker is shown slightly bigger.
@@ -190,13 +190,13 @@ When clicking on the markers of a track (whether it's the start or stop builtin
## Read-only mode
When a map is in read-only all editing features will be disabled such as:
When a map is [read-only](../Basic%20Concepts%20and%20Features/Notes/Read-Only%20Notes.md) all editing features will be disabled such as:
* The add button at the bottom of the map.
* Repositioning markers.
* Editing from the contextual menu (removing locations or adding new items).
To enable read-only mode simply press the _Lock_ icon from the <a class="reference-link" href="../Basic%20Concepts%20and%20Features/UI%20Elements/Note%20buttons.md">Note buttons</a> (or <a class="reference-link" href="../Basic%20Concepts%20and%20Features/UI%20Elements/Floating%20buttons.md">Floating buttons</a> for the old layout). To disable it, press the button again.
To set a map as read-only, go to <a class="reference-link" href="../Basic%20Concepts%20and%20Features/UI%20Elements/Note%20buttons.md">Note buttons</a> → _Editable_ → _Read-only_ (on the new layout, or in Basic Properties on the <a class="reference-link" href="../Basic%20Concepts%20and%20Features/UI%20Elements/Ribbon.md">Ribbon</a> for the old layout).
## Configuration
@@ -223,7 +223,7 @@ The default theme is Versatiles Colorful (vector).
<figure class="image"><img style="aspect-ratio:2727/1642;" src="2_Geo Map_image.png" width="2727" height="1642"></figure>
Trilium v0.105.0 introduces a 3D view, courtesy of MapLibre GL. To enter 3D mode, simply press the corresponding button at the bottom-right of the map or press <kbd>Ctrl</kbd> and drag across the map.
Trilium v0.105.0 introduces a 3D view, courtesy of MapLibre GL. To enter 3D mode, simply press the corresponding button at the bottom-right of the map or press Ctrl and drag across the map.
The buildings will only appear from zoom 14 onwards to avoid lag.