diff --git a/bin/docs/assets/v0.63.6/app-dist/share.js b/bin/docs/assets/v0.63.6/app-dist/share.js
new file mode 100644
index 000000000..03ad92515
--- /dev/null
+++ b/bin/docs/assets/v0.63.6/app-dist/share.js
@@ -0,0 +1,23 @@
+/**
+ * Fetch note with given ID from backend
+ *
+ * @param noteId of the given note to be fetched. If false, fetches current note.
+ */
+async function fetchNote(noteId = null) {
+ if (!noteId) {
+ noteId = document.body.getAttribute("data-note-id");
+ }
+
+ const resp = await fetch(`api/notes/${noteId}`);
+
+ return await resp.json();
+}
+
+document.addEventListener('DOMContentLoaded', () => {
+ const toggleMenuButton = document.getElementById('toggleMenuButton');
+ const layout = document.getElementById('layout');
+
+ if (toggleMenuButton && layout) {
+ toggleMenuButton.addEventListener('click', () => layout.classList.toggle('showMenu'));
+ }
+}, false);
diff --git a/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css b/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css
new file mode 100644
index 000000000..47274e5f4
--- /dev/null
+++ b/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css
@@ -0,0 +1,551 @@
+/* !!!!!! TRILIUM CUSTOM CHANGES !!!!!! */
+
+.printed-content .ck-widget__selection-handle, .printed-content .ck-widget__type-around { /* gets rid of triangles: https://github.com/zadam/trilium/issues/1129 */
+ display: none;
+}
+
+/*
+ * CKEditor 5 (v41.0.0) content styles.
+ * Generated on Fri, 26 Jan 2024 10:23:49 GMT.
+ * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
+ */
+
+:root {
+ --ck-color-image-caption-background: hsl(0, 0%, 97%);
+ --ck-color-image-caption-text: hsl(0, 0%, 20%);
+ --ck-color-mention-background: hsla(341, 100%, 30%, 0.1);
+ --ck-color-mention-text: hsl(341, 100%, 30%);
+ --ck-color-selector-caption-background: hsl(0, 0%, 97%);
+ --ck-color-selector-caption-text: hsl(0, 0%, 20%);
+ --ck-highlight-marker-blue: hsl(201, 97%, 72%);
+ --ck-highlight-marker-green: hsl(120, 93%, 68%);
+ --ck-highlight-marker-pink: hsl(345, 96%, 73%);
+ --ck-highlight-marker-yellow: hsl(60, 97%, 73%);
+ --ck-highlight-pen-green: hsl(112, 100%, 27%);
+ --ck-highlight-pen-red: hsl(0, 85%, 49%);
+ --ck-image-style-spacing: 1.5em;
+ --ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);
+ --ck-todo-list-checkmark-size: 16px;
+}
+
+/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
+.ck-content .table .ck-table-resized {
+ table-layout: fixed;
+}
+/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
+.ck-content .table table {
+ overflow: hidden;
+}
+/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
+.ck-content .table td,
+.ck-content .table th {
+ overflow-wrap: break-word;
+ position: relative;
+}
+/* @ckeditor/ckeditor5-table/theme/table.css */
+.ck-content .table {
+ margin: 0.9em auto;
+ display: table;
+}
+/* @ckeditor/ckeditor5-table/theme/table.css */
+.ck-content .table table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ height: 100%;
+ border: 1px double hsl(0, 0%, 70%);
+}
+/* @ckeditor/ckeditor5-table/theme/table.css */
+.ck-content .table table td,
+.ck-content .table table th {
+ min-width: 2em;
+ padding: .4em;
+ border: 1px solid hsl(0, 0%, 75%);
+}
+/* @ckeditor/ckeditor5-table/theme/table.css */
+.ck-content .table table th {
+ font-weight: bold;
+ background: hsla(0, 0%, 0%, 5%);
+}
+/* @ckeditor/ckeditor5-table/theme/table.css */
+.ck-content[dir="rtl"] .table th {
+ text-align: right;
+}
+/* @ckeditor/ckeditor5-table/theme/table.css */
+.ck-content[dir="ltr"] .table th {
+ text-align: left;
+}
+/* @ckeditor/ckeditor5-table/theme/tablecaption.css */
+.ck-content .table > figcaption {
+ display: table-caption;
+ caption-side: top;
+ word-break: break-word;
+ text-align: center;
+ color: var(--ck-color-selector-caption-text);
+ background-color: var(--ck-color-selector-caption-background);
+ padding: .6em;
+ font-size: .75em;
+ outline-offset: -1px;
+}
+/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
+.ck-content .page-break {
+ position: relative;
+ clear: both;
+ padding: 5px 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
+.ck-content .page-break::after {
+ content: '';
+ position: absolute;
+ border-bottom: 2px dashed hsl(0, 0%, 77%);
+ width: 100%;
+}
+/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
+.ck-content .page-break__label {
+ position: relative;
+ z-index: 1;
+ padding: .3em .6em;
+ display: block;
+ text-transform: uppercase;
+ border: 1px solid hsl(0, 0%, 77%);
+ border-radius: 2px;
+ font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;
+ font-size: 0.75em;
+ font-weight: bold;
+ color: hsl(0, 0%, 20%);
+ background: hsl(0, 0%, 100%);
+ box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */
+.ck-content .media {
+ clear: both;
+ margin: 0.9em 0;
+ display: block;
+ min-width: 15em;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list {
+ list-style: none;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list li {
+ position: relative;
+ margin-bottom: 5px;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list li .todo-list {
+ margin-top: 5px;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input {
+ -webkit-appearance: none;
+ display: inline-block;
+ position: relative;
+ width: var(--ck-todo-list-checkmark-size);
+ height: var(--ck-todo-list-checkmark-size);
+ vertical-align: middle;
+ border: 0;
+ left: -25px;
+ margin-right: -15px;
+ right: 0;
+ margin-left: 0;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content[dir=rtl] .todo-list .todo-list__label > input {
+ left: 0;
+ margin-right: 0;
+ right: -25px;
+ margin-left: -15px;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input::before {
+ display: block;
+ position: absolute;
+ box-sizing: border-box;
+ content: '';
+ width: 100%;
+ height: 100%;
+ border: 1px solid hsl(0, 0%, 20%);
+ border-radius: 2px;
+ transition: 250ms ease-in-out box-shadow;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input::after {
+ display: block;
+ position: absolute;
+ box-sizing: content-box;
+ pointer-events: none;
+ content: '';
+ left: calc( var(--ck-todo-list-checkmark-size) / 3 );
+ top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
+ width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
+ height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
+ border-style: solid;
+ border-color: transparent;
+ border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
+ transform: rotate(45deg);
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input[checked]::before {
+ background: hsl(126, 64%, 41%);
+ border-color: hsl(126, 64%, 41%);
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input[checked]::after {
+ border-color: hsl(0, 0%, 100%);
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label .todo-list__label__description {
+ vertical-align: middle;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
+ position: absolute;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label > input,
+.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input {
+ cursor: pointer;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label > input:hover::before, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input:hover::before {
+ box-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1);
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input {
+ -webkit-appearance: none;
+ display: inline-block;
+ position: relative;
+ width: var(--ck-todo-list-checkmark-size);
+ height: var(--ck-todo-list-checkmark-size);
+ vertical-align: middle;
+ border: 0;
+ left: -25px;
+ margin-right: -15px;
+ right: 0;
+ margin-left: 0;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label > span[contenteditable=false] > input {
+ left: 0;
+ margin-right: 0;
+ right: -25px;
+ margin-left: -15px;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::before {
+ display: block;
+ position: absolute;
+ box-sizing: border-box;
+ content: '';
+ width: 100%;
+ height: 100%;
+ border: 1px solid hsl(0, 0%, 20%);
+ border-radius: 2px;
+ transition: 250ms ease-in-out box-shadow;
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::after {
+ display: block;
+ position: absolute;
+ box-sizing: content-box;
+ pointer-events: none;
+ content: '';
+ left: calc( var(--ck-todo-list-checkmark-size) / 3 );
+ top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
+ width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
+ height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
+ border-style: solid;
+ border-color: transparent;
+ border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
+ transform: rotate(45deg);
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::before {
+ background: hsl(126, 64%, 41%);
+ border-color: hsl(126, 64%, 41%);
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::after {
+ border-color: hsl(0, 0%, 100%);
+}
+/* @ckeditor/ckeditor5-list/theme/todolist.css */
+.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
+ position: absolute;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ol {
+ list-style-type: decimal;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ol ol {
+ list-style-type: lower-latin;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ol ol ol {
+ list-style-type: lower-roman;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ol ol ol ol {
+ list-style-type: upper-latin;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ol ol ol ol ol {
+ list-style-type: upper-roman;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ul {
+ list-style-type: disc;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ul ul {
+ list-style-type: circle;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ul ul ul {
+ list-style-type: square;
+}
+/* @ckeditor/ckeditor5-list/theme/list.css */
+.ck-content ul ul ul ul {
+ list-style-type: square;
+}
+/* @ckeditor/ckeditor5-image/theme/image.css */
+.ck-content .image {
+ display: table;
+ clear: both;
+ text-align: center;
+ margin: 0.9em auto;
+ min-width: 50px;
+}
+/* @ckeditor/ckeditor5-image/theme/image.css */
+.ck-content .image img {
+ display: block;
+ margin: 0 auto;
+ max-width: 100%;
+ min-width: 100%;
+ height: auto;
+}
+/* @ckeditor/ckeditor5-image/theme/image.css */
+.ck-content .image-inline {
+ /*
+ * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).;
+ * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root.
+ * This strange behavior does not happen with inline-flex.
+ */
+ display: inline-flex;
+ max-width: 100%;
+ align-items: flex-start;
+}
+/* @ckeditor/ckeditor5-image/theme/image.css */
+.ck-content .image-inline picture {
+ display: flex;
+}
+/* @ckeditor/ckeditor5-image/theme/image.css */
+.ck-content .image-inline picture,
+.ck-content .image-inline img {
+ flex-grow: 1;
+ flex-shrink: 1;
+ max-width: 100%;
+}
+/* @ckeditor/ckeditor5-image/theme/imageresize.css */
+.ck-content img.image_resized {
+ height: auto;
+}
+/* @ckeditor/ckeditor5-image/theme/imageresize.css */
+.ck-content .image.image_resized {
+ max-width: 100%;
+ display: block;
+ box-sizing: border-box;
+}
+/* @ckeditor/ckeditor5-image/theme/imageresize.css */
+.ck-content .image.image_resized img {
+ width: 100%;
+}
+/* @ckeditor/ckeditor5-image/theme/imageresize.css */
+.ck-content .image.image_resized > figcaption {
+ display: block;
+}
+/* @ckeditor/ckeditor5-image/theme/imagecaption.css */
+.ck-content .image > figcaption {
+ display: table-caption;
+ caption-side: bottom;
+ word-break: break-word;
+ color: var(--ck-color-image-caption-text);
+ background-color: var(--ck-color-image-caption-background);
+ padding: .6em;
+ font-size: .75em;
+ outline-offset: -1px;
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-block-align-left,
+.ck-content .image-style-block-align-right {
+ max-width: calc(100% - var(--ck-image-style-spacing));
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-align-left,
+.ck-content .image-style-align-right {
+ clear: none;
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-side {
+ float: right;
+ margin-left: var(--ck-image-style-spacing);
+ max-width: 50%;
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-align-left {
+ float: left;
+ margin-right: var(--ck-image-style-spacing);
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-align-right {
+ float: right;
+ margin-left: var(--ck-image-style-spacing);
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-block-align-right {
+ margin-right: 0;
+ margin-left: auto;
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-block-align-left {
+ margin-left: 0;
+ margin-right: auto;
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content p + .image-style-align-left,
+.ck-content p + .image-style-align-right,
+.ck-content p + .image-style-side {
+ margin-top: 0;
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-inline.image-style-align-left,
+.ck-content .image-inline.image-style-align-right {
+ margin-top: var(--ck-inline-image-style-spacing);
+ margin-bottom: var(--ck-inline-image-style-spacing);
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-inline.image-style-align-left {
+ margin-right: var(--ck-inline-image-style-spacing);
+}
+/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-inline.image-style-align-right {
+ margin-left: var(--ck-inline-image-style-spacing);
+}
+/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-yellow {
+ background-color: var(--ck-highlight-marker-yellow);
+}
+/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-green {
+ background-color: var(--ck-highlight-marker-green);
+}
+/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-pink {
+ background-color: var(--ck-highlight-marker-pink);
+}
+/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-blue {
+ background-color: var(--ck-highlight-marker-blue);
+}
+/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
+.ck-content .pen-red {
+ color: var(--ck-highlight-pen-red);
+ background-color: transparent;
+}
+/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
+.ck-content .pen-green {
+ color: var(--ck-highlight-pen-green);
+ background-color: transparent;
+}
+/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
+.ck-content blockquote {
+ overflow: hidden;
+ padding-right: 1.5em;
+ padding-left: 1.5em;
+ margin-left: 0;
+ margin-right: 0;
+ font-style: italic;
+ border-left: solid 5px hsl(0, 0%, 80%);
+}
+/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
+.ck-content[dir="rtl"] blockquote {
+ border-left: 0;
+ border-right: solid 5px hsl(0, 0%, 80%);
+}
+/* @ckeditor/ckeditor5-basic-styles/theme/code.css */
+.ck-content code {
+ background-color: hsla(0, 0%, 78%, 0.3);
+ padding: .15em;
+ border-radius: 2px;
+}
+/* @ckeditor/ckeditor5-font/theme/fontsize.css */
+.ck-content .text-tiny {
+ font-size: .7em;
+}
+/* @ckeditor/ckeditor5-font/theme/fontsize.css */
+.ck-content .text-small {
+ font-size: .85em;
+}
+/* @ckeditor/ckeditor5-font/theme/fontsize.css */
+.ck-content .text-big {
+ font-size: 1.4em;
+}
+/* @ckeditor/ckeditor5-font/theme/fontsize.css */
+.ck-content .text-huge {
+ font-size: 1.8em;
+}
+/* @ckeditor/ckeditor5-mention/theme/mention.css */
+.ck-content .mention {
+ background: var(--ck-color-mention-background);
+ color: var(--ck-color-mention-text);
+}
+/* @ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css */
+.ck-content hr {
+ margin: 15px 0;
+ height: 4px;
+ background: hsl(0, 0%, 87%);
+ border: 0;
+}
+/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */
+.ck-content pre {
+ padding: 1em;
+ color: hsl(0, 0%, 20.8%);
+ background: hsla(0, 0%, 78%, 0.3);
+ border: 1px solid hsl(0, 0%, 77%);
+ border-radius: 2px;
+ text-align: left;
+ direction: ltr;
+ tab-size: 4;
+ white-space: pre-wrap;
+ font-style: normal;
+ min-width: 200px;
+}
+/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */
+.ck-content pre code {
+ background: unset;
+ padding: 0;
+ border-radius: 0;
+}
+@media print {
+ /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
+ .ck-content .page-break {
+ padding: 0;
+ }
+ /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
+ .ck-content .page-break::after {
+ display: none;
+ }
+}
diff --git a/bin/docs/assets/v0.63.6/libraries/normalize.min.css b/bin/docs/assets/v0.63.6/libraries/normalize.min.css
new file mode 100644
index 000000000..87aa24dc5
--- /dev/null
+++ b/bin/docs/assets/v0.63.6/libraries/normalize.min.css
@@ -0,0 +1,2 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}
+/*# sourceMappingURL=normalize.min.css.map */
\ No newline at end of file
diff --git a/bin/docs/assets/v0.63.6/stylesheets/share.css b/bin/docs/assets/v0.63.6/stylesheets/share.css
new file mode 100644
index 000000000..718f8594c
--- /dev/null
+++ b/bin/docs/assets/v0.63.6/stylesheets/share.css
@@ -0,0 +1,165 @@
+body {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif;
+ line-height: 1.5;
+}
+
+#layout {
+ max-width: 1200px;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: row-reverse;
+}
+
+#menu {
+ padding: 25px;
+ flex-basis: 0;
+ flex-grow: 1;
+ overflow: auto;
+}
+
+#menu p {
+ margin: 0;
+}
+
+#menu > p {
+ font-weight: bold;
+ font-size: 110%;
+}
+
+#menu ul {
+ padding-left: 20px;
+}
+
+#main {
+ flex-basis: 0;
+ flex-grow: 3;
+ overflow: auto;
+ padding: 10px 20px 20px 20px;
+}
+
+#parentLink {
+ float: right;
+ margin-top: 20px;
+}
+
+#title {
+ margin: 0;
+ padding-top: 10px;
+}
+
+img {
+ max-width: 100%;
+}
+
+pre {
+ white-space: pre-wrap;
+ word-wrap: anywhere;
+}
+
+iframe.pdf-view {
+ width: 100%;
+ height: 800px;
+}
+
+#toggleMenuButton {
+ display: none;
+ position: fixed;
+ top: 8px;
+ left: 5px;
+ width: 1.4em;
+ border-radius: 5px;
+ border: 1px solid #aaa;
+ font-size: 2rem;
+ z-index: 10;
+ height: auto;
+ color: black;
+ cursor: pointer;
+}
+
+#childLinks.grid ul {
+ list-style-type: none;
+ display: flex;
+ flex-wrap: wrap;
+ padding: 0;
+}
+
+#childLinks.grid ul li {
+ width: 180px;
+ height: 140px;
+ padding: 10px;
+}
+
+#childLinks.grid ul li a {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ width: 100%;
+ border: 1px solid #ddd;
+ border-radius: 5px;
+ justify-content: center;
+ align-content: center;
+ text-align: center;
+ font-size: large;
+}
+
+#childLinks.grid ul li a:hover {
+ background: #eee;
+}
+
+#childLinks.list ul {
+ list-style-type: none;
+ display: inline-flex;
+ flex-wrap: wrap;
+ padding: 0;
+ margin-top: 5px;
+}
+
+#childLinks.list ul li {
+ margin-right: 20px;
+}
+
+#noteClippedFrom {
+ padding: 10px 0 10px 0;
+ margin: 20px 0 20px 0;
+ color: #666;
+ border: 1px solid #ddd;
+ border-left: 0;
+ border-right: 0;
+}
+
+#toggleMenuButton::after {
+ position: relative;
+ top: -2px;
+ left: 1px;
+}
+
+@media (max-width: 48em) {
+ #layout.showMenu #menu {
+ display: block;
+ margin-top: 40px;
+ }
+
+ #toggleMenuButton {
+ display: block;
+ }
+
+ #layout.showMenu #main {
+ display: none;
+ }
+
+ #title {
+ padding-left: 60px;
+ }
+
+ #layout.showMenu #toggleMenuButton::after {
+ content: "«";
+ }
+
+ #toggleMenuButton::after {
+ content: "»";
+ }
+
+ #menu {
+ display: none;
+ }
+}
diff --git a/docs/3jc1nUXyteo0.html b/docs/3jc1nUXyteo0.html
new file mode 100644
index 000000000..09753b687
--- /dev/null
+++ b/docs/3jc1nUXyteo0.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Themes
+
+
+
+
+
+
+ parent: Development and architecture
+
+
+
+
Themes
+
+
+
+
+
+
Server-side There are two themes embedded in the application:light, located in src\public\stylesheets\theme-light.cssdark, located in src\public\stylesheets\theme-dark.css The default theme is set only once, when the database is created and is managed by options_init#initNotSyncedOptions.On Electron, the choice between light and dark is done based on the OS preference. Otherwise, the theme is always dark. The theme is served via src\routes\index.ts, in the getThemeCssUrl method. Client-side The two predefined themes are hard-coded in the client in src\public\app\widgets\type_widgets\options\appearance\theme.js. The user-defined themes are obtained via a call to the server: options/user-themes. The theme retrieval is done via a request
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/4yYHqKbLovVX.html b/docs/4yYHqKbLovVX.html
index f2fb532a9..e75e6d9fd 100644
--- a/docs/4yYHqKbLovVX.html
+++ b/docs/4yYHqKbLovVX.html
@@ -40,13 +40,28 @@
@@ -76,20 +91,6 @@
- Internationalisation
-
-
-
-
-
-
-
-
-
-
-
-
-
Dependency Management
@@ -109,6 +110,360 @@
+
+
+
+
+
+
+
+
+ Having a simpler packaging system
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building and deployment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project maintenance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Development and architecture
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Environment Setup
+
+
+
+
+
diff --git a/docs/B8hxg4e66cVL.html b/docs/B8hxg4e66cVL.html
new file mode 100644
index 000000000..a87867176
--- /dev/null
+++ b/docs/B8hxg4e66cVL.html
@@ -0,0 +1,486 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Development and architecture
+
+
+
+
+
+
+ parent: Developer's Guide
+
+
+
+
Development and architecture
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/BhE2WFknKKHG.html b/docs/BhE2WFknKKHG.html
new file mode 100644
index 000000000..951da8d88
--- /dev/null
+++ b/docs/BhE2WFknKKHG.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Main
+
+
+
+
+
+
+ parent: CI
+
+
+
+
Main
+
+
+
+
+
+
The main workflow of the CI:
Builds the Docker image and publishes in the GitHub Docker registry. Builds using a portion of the delivery script artifacts for the following platforms:Windows x86_64 as .zip file Windows x86_64 installer (using Squirrel) macOS x86_64 and aarch64. Linux x86_64 Linux server x86_64. The main workflow of the CI runs on develop branches as well as any branch that starts with feature/update_.
Downloading the artifacts from the main branch Simply go to the develop branch on GitHub and look at the commit bar:
Press the green checkmark (or red cross if something went bad). Then look at the list of jobs and their status:
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.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/C09Dou56ffMe.html b/docs/C09Dou56ffMe.html
new file mode 100644
index 000000000..84c85f1a6
--- /dev/null
+++ b/docs/C09Dou56ffMe.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Having a simpler packaging system
+
+
+
+
+
+
+ parent: Dependency Management
+
+
+
+
Having a simpler packaging system
+
+
+
+
+
+
The current build scripts are a bit complicated and maintaining them is not easy.
Electron Forge seems more mature and has a boatload of features, including Flatpak, snaps, Windows installers & more.
Have a look also at the Plugins section since there are quite a few interesting things there as well.
Afterwards consider running a new round of Reducing binary size , especially taking into consideration removing of the unnecessary locales.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/GMta9hBHsXHQ.html b/docs/GMta9hBHsXHQ.html
new file mode 100644
index 000000000..ecae78fd1
--- /dev/null
+++ b/docs/GMta9hBHsXHQ.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Node.js, Electron and `better-sqlite3`
+
+
+
+
+
+
+ parent: Updating dependencies
+
+
+
+
Node.js, Electron and `better-sqlite3`
+
+
+
+
+
+
better-sqlite3 requires a native module in order to work. In order to ease the installation process, prebuilt binaries are provided by the library developers.
Trilium Next started with version 8.4.0 for better-sqlite3
better-sqlite3 versionSQLite version Node.js prebuilds Electron.js prebuilds 8.4.0 <3.43.0 v20 ??? 8.5.0 v20 v25 8.5.1 v26 8.5.2 v20 (macOS + arm64) 8.6.0 3.43.0 8.7.0 3.43.1 9.0.0 3.43.2 v27 9.1.0 3.44.0 9.1.1 macOS + Alpine 9.2.0 3.44.2 9.2.1 / 9.2.2 v28 9.3.0 3.45.0 9.4.0 3.45.1 9.4.1 Windows arm, arm64 9.4.2 <v29 9.4.3 <v29 9.4.4 v29 9.4.5 Better prebuilds 9.5.0 3.45.2 9.6.0 3.45.3 v30 10.0.0 v22 10.1.0 3.46.0 11.0.0 >21 11.1.0 (prerelease) v31 11.1.1 11.1.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/KRC2O84LekPz.html b/docs/KRC2O84LekPz.html
new file mode 100644
index 000000000..464a8a1b0
--- /dev/null
+++ b/docs/KRC2O84LekPz.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ i18n-ally
+
+
+
+
+
+
+ parent: Environment Setup
+
+
+
+
i18n-ally
+
+
+
+
+
+
i18n-ally is a VS Code extension that aids in internationalization.
It is currently integrated in the project and offers features such as:
Highlight, autocomplete translations. Display translations inline. Extract messages into translation. Extracting messages into translation Open any .js file and select an untranslated string inside a template (TPL). Press Ctrl+P and look for “i18n Ally: Extract text into i18n messages” Select the first template. Select the path of translation, taking into consideration the Guidelines (e.g. jump_to_note.search-for-note-by-its-name).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/PHqgH8FCfcod.html b/docs/PHqgH8FCfcod.html
new file mode 100644
index 000000000..a837b4355
--- /dev/null
+++ b/docs/PHqgH8FCfcod.html
@@ -0,0 +1,455 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Documentation
+
+
+
+
+
+
+ parent: Building and deployment
+
+
+
+
Documentation
+
+
+
+
+
+
+
This note has no content.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/QXCi6Y1SYulw.html b/docs/QXCi6Y1SYulw.html
index 3e5f58f87..34d8f0bd2 100644
--- a/docs/QXCi6Y1SYulw.html
+++ b/docs/QXCi6Y1SYulw.html
@@ -86,7 +86,7 @@ node_modules/i18next
+ I18NEXT
}Step 4. Using the library To import the library, simply use the following mechanism:
import library_loader from "./library_loader.js";
-await library_loader.requireLibrary(library_loader.I18NEXT);Make sure to replace I18NEXT with the library that was created at the previous steps.
Note that because we are not using a module management mechanism such as ES Modules or Common.js modules, the requireLibrary method does not actually return anything.
To benefit from the library, it must export on its own an object in window.
In the case of i18next, it sets window.i18next and that can be used directly:
i18next.init({});
+await library_loader.requireLibrary(library_loader.I18NEXT);Make sure to replace I18NEXT with the library that was created at the previous steps.
Note that because we are not using a module management mechanism such as ES Modules or Common.js modules, the requireLibrary method does not actually return anything.
To benefit from the library, it must export on its own an object in window.
In the case of i18next, it sets window.i18next and that can be used directly:
i18next.init({});Step 5. Adding Electron support For Electron, the node_modules are copied as a separate step by bin/copy-dist.ts.
Scroll all the way down to the nodeModulesFolder and append an entry for the newly added libraries.
@@ -115,20 +115,6 @@ await library_loader.requireLibrary(library_loader.I18NEXT);Make
- Internationalisation
-
-
-
-
-
-
-
-
-
-
-
-
-
Dependency Management
@@ -148,6 +134,360 @@ await library_loader.requireLibrary(library_loader.I18NEXT);Make
+
+
+
+
+
+
+
+
+ Having a simpler packaging system
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building and deployment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project maintenance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Development and architecture
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Environment Setup
+
+
+
+
+
diff --git a/docs/U5RtMeGPeZ29.html b/docs/U5RtMeGPeZ29.html
new file mode 100644
index 000000000..41c0da655
--- /dev/null
+++ b/docs/U5RtMeGPeZ29.html
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Synchronisation
+
+
+
+
+
diff --git a/docs/UTB518X6X9Uh.html b/docs/UTB518X6X9Uh.html
new file mode 100644
index 000000000..2b59c0dd3
--- /dev/null
+++ b/docs/UTB518X6X9Uh.html
@@ -0,0 +1,461 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Build deliveries locally
+
+
+
+
+
+
+ parent: Building and deployment
+
+
+
+
Build deliveries locally
+
+
+
+
+
+
In the project root:
Platform Architecture Application Build command macOS x86_64 Desktop / Electron app ./bin/build-mac-x64.shARM 64 Desktop / Electron app ./bin/build-mac-arm64.shLinux x86_64 Desktop / Electron app ./bin/build-linux-x64.shServer ./bin/build-server.shWindows x86_64 Desktop / Electron app ./bin/build-win-x64.sh
Under NixOS the following nix-shell is needed:
nix-shell -p jqFor Linux builds:
nix-shell -p jq fakeroot dpkgThe resulting build will be in the dist directory under the project root.
Testing the Linux builds under NixOS Desktop client Server $ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
+[nix-shell] cd dist/trilium-linux-x64
+[nix-shell] steam-run ./trilium$ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
+[nix-shell] cd dist/trilium-linux-x64-server
+[nix-shell] steam-run ./trilium.sh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/VS22Hq5PBFNf.html b/docs/VS22Hq5PBFNf.html
index 126d58524..0095e0ab9 100644
--- a/docs/VS22Hq5PBFNf.html
+++ b/docs/VS22Hq5PBFNf.html
@@ -49,6 +49,11 @@
class="type-text">Adding a new client library
+
+ Having a simpler packaging system
+
+
@@ -76,20 +81,6 @@
- Internationalisation
-
-
-
-
-
-
-
-
-
-
-
-
-
Dependency Management
@@ -109,6 +100,360 @@
+
+
+
+
+
+
+
+
+ Having a simpler packaging system
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building and deployment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project maintenance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Development and architecture
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Environment Setup
+
+
+
+
+
diff --git a/docs/X4N03xLYEWnN.html b/docs/X4N03xLYEWnN.html
new file mode 100644
index 000000000..9aa2a6e0b
--- /dev/null
+++ b/docs/X4N03xLYEWnN.html
@@ -0,0 +1,462 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ bettersqlite binaries
+
+
+
+
+
+
+ parent: Updating dependencies
+
+
+
+
bettersqlite binaries
+
+
+
+
+
+
The native node bindings better-sqlite3 has native Node bindings. With updates of better-sqlite3, but also of Electron and Node.js versions, these bindings need to be updated.
Note that Electron and Node.js versions need different versions of these bindings, since Electron usually packs a different version of Node.js.
During development, npm install tries to build or reuse prebuilt natives for the current Node.js version. This makes npm run start-server work out of the box. Trying to run npm run start-electron with these versions generally causes an error such as this:
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`).How the natives are handled Locally, this can be fixed by rebuilding the binaries, which is what npm run switch-electron does, which uses electron-rebuild under the hood.
When the deliveries are built (see Build deliveries locally ), it is not feasible to rebuild the dependencies since we are building for multiple platforms. Luckily, better-sqlite3 provides these prebuilt binaries from us, available as artifacts on their GitHub releases page .
The build script manages the natives for better-sqlite3 by keeping a copy of the .node file for every platform in bin/better-sqlite3.
Whenever the version of better-sqlite3 changes, the .node files must also be renewed based on their releases page. To simplify this process, a script was created in bin/better-sqlite3/update.sh.
How to update the natives The update script needs to know the version of Electron or Node.js for which to download the prebuilt binaries.
If you get errors during download, check on the releases page to ensure that this particular combination of Electron/Node actually exists for the given release.
To determine the NODE_MODULE_VERSION that is required, look for This version of Node.js requiresNODE_MODULE_VERSION in the error when starting Trilium via:
npm run start-electron (or run any Electron delivery ), case in which the ELECTRON_VERSION variable needs to be changed.npm run start-server (or run the Linux server delivery), case in which the NODE_VERSION variable needs to be changed.Check which files got changed after running the update script and for each platform that got changed, test it locally via Build deliveries locally or via the CI.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/XxqZW6JjkW2g.html b/docs/XxqZW6JjkW2g.html
new file mode 100644
index 000000000..bffc19454
--- /dev/null
+++ b/docs/XxqZW6JjkW2g.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Live reload
+
+
+
+
+
+
+ parent: Development and architecture
+
+
+
+
Live reload
+
+
+
+
+
+
Server live reload If running the server using npm run start-server, the server will watch for changes in src/public and trigger a frontend reload if that occurs.
Electron live reload Similarly, npm run start-electron supports live refresh as well.
However, a core difference is that Electron watches dist/src/public instead of src/public since Electron runs on its own copy of the files.
To ameliorate that, a separate watch script has been implemented which automatically copies files from src/public to dist/src/public whenever a change is detected. To run it:
npm run Technical details This mechanism is managed at server level by watching for changes inservices/ws.ts.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/Z9N9OKBXXLFW.html b/docs/Z9N9OKBXXLFW.html
new file mode 100644
index 000000000..d16eeb443
--- /dev/null
+++ b/docs/Z9N9OKBXXLFW.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Guidelines
+
+
+
+
+
+
+ parent: Internationalisation / Translations
+
+
+
+
Guidelines
+
+
+
+
+
+
Use hierarchy whenever appropriate, try to group the messages by:Modals (e.g. about.foo, jump_to_note.foo) Don't duplicate messages that are very widely used.One such example is aria-label="Close" which should go to a single message such as modal.close instead of being duplicated in every modal. On the other hand, don't overly generalise messages. A close 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. Use variable interpolation whenever appropriate.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. So instead of “Number of updates: “ + numUpdates + “.” use $(t("number_updates", { numUpdates })) where the message translation would appear as Number of updates: {{numUpdates}}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/ZlxZh8NH5frM.html b/docs/ZlxZh8NH5frM.html
new file mode 100644
index 000000000..b56c73abd
--- /dev/null
+++ b/docs/ZlxZh8NH5frM.html
@@ -0,0 +1,486 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building and deployment
+
+
+
+
+
+
+ parent: Developer's Guide
+
+
+
+
Building and deployment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/api/attachments/27Z989bSFWAc/image/image.png b/docs/api/attachments/27Z989bSFWAc/image/image.png
new file mode 100644
index 000000000..5eacee569
Binary files /dev/null and b/docs/api/attachments/27Z989bSFWAc/image/image.png differ
diff --git a/docs/api/attachments/XEUUvzBxh89z/image/image.png b/docs/api/attachments/XEUUvzBxh89z/image/image.png
new file mode 100644
index 000000000..2f13f1647
Binary files /dev/null and b/docs/api/attachments/XEUUvzBxh89z/image/image.png differ
diff --git a/docs/biDJ9KgbWLgt.html b/docs/biDJ9KgbWLgt.html
new file mode 100644
index 000000000..1583eae6c
--- /dev/null
+++ b/docs/biDJ9KgbWLgt.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Releasing a version
+
+
+
+
+
+
+ parent: Building and deployment
+
+
+
+
Releasing a version
+
+
+
+
+
+
On NixOS:
nix-shell -p dpkg fakeroot jq nodejs_20Then simply run from project root:
./bin/release.sh 1.2.3where 1.2.3 is the desired release version.
If a version ends with -beta, it will automatically be marked as pre-release in GitHub.
This will automatically generate a release in GitHub if everything goes according to plan.
Note that the Windows installer is not automatically uploaded yet, it has to be taken from the main workflow of the CI from the develop branch .
Make sure to check test the artifacts of the release.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/btM6L9JtG301.html b/docs/btM6L9JtG301.html
new file mode 100644
index 000000000..dcb786e94
--- /dev/null
+++ b/docs/btM6L9JtG301.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Running a development build
+
+
+
+
+
+
+ parent: Building and deployment
+
+
+
+
Running a development build
+
+
+
+
+
+
Run server Run with default settings:
npm run start-serverRun with custom port:
TRILIUM_PORT=8082 npm run start-serverRun Electron Rebuild better-sqlite3 dependency:
npm run switch-electronThen run Electron:
npm run start-electronTo run Electron using the same data directory as the production version:
npm run start-electron-no-dirWhen done, switch back the better-sqlite3 dependency:
npm run switch-server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/d3dnvVOhur16.html b/docs/d3dnvVOhur16.html
new file mode 100644
index 000000000..671dbdfbf
--- /dev/null
+++ b/docs/d3dnvVOhur16.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Content hashing
+
+
+
+
+
+
+ parent: Synchronisation
+
+
+
+
Content hashing
+
+
+
+
+
+
Entity hashing is done in content_hash#getEntityHashes.
It works by looking at the entity_changes table and going through each of the entity names/types:blobsattributesrevisionsattachmentsnotesbranchesetapi_tokensoptions For some reason note_reordering entities are ignored specifically. All the rows in entity_changes are then ordered alphabetically, based on their entityId. Every entity row is then grouped by entityName and then by sector. The sector is defined as the first character of the id. The hash is altered to add the isErased value as well since the hash of deleted entries is not updated. For each sector, the hash is calculated using utils.hash, using SHA1 encoded as Base64.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/hkrBX8KE1HQl.html b/docs/hkrBX8KE1HQl.html
index 0b7abfe87..eb8e7b19a 100644
--- a/docs/hkrBX8KE1HQl.html
+++ b/docs/hkrBX8KE1HQl.html
@@ -20,19 +20,19 @@
- Internationalisation
+ Internationalisation / Translations
- parent: Developer's Guide
+ parent: Development and architecture
-
Internationalisation
+
Internationalisation / Translations
@@ -42,11 +42,29 @@
"about": {
"title": "About TriliumNext Notes"
}
-}
Adding a new locale To add a new locale, go to src/public/translations with your favorite text editor and copy the en directory.
Rename the copy to the ISO code (e.g. fr, ro) of the language being translated.
Translations with a country-language combination, using their corresponding ISO code (e.g. fr_FR, fr_BE), has not been tested yet.
Changing the language Since the internationalisation process is in its early stages, there is no user-facing way to switch the language.
To change the language manually, edit src/public/app/services/i18n.js and look for the line containing lng: "en". Replace en with the desired language code (from the ones available in src/public/translations).
Recommendations Use hierarchy whenever appropriate, try to group the messages by:Modals (e.g. about.foo, jump_to_note.foo) Don't duplicate messages that are very widely used.One such example is aria-label="Close" which should go to a single message such as modal.close instead of being duplicated in every modal. On the other hand, don't overly generalise messages. A close 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. Use variable interpolation whenever appropriate.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. So instead of “Number of updates: “ + numUpdates + “.” use $(t("number_updates", { numUpdates })) where the message translation would appear as Number of updates: {{numUpdates}}. Client-side translations Component-level translations Most of the client translations are present in the various widgets and layouts.
Translation support has to be added manually for every file.
The first step is to add the translation import with a relative import. For example, if we are in the src/public/app/widgets/dialogs directory, the import would look as follows:
import { t } from "../../services/i18n.js";Afterwards, simply replace the hard-coded message with:
${t("msgid")}where msgid is the key of the message being translated.
Template-level translations Templates are .ejs files present in src/views, these are used to prepare the root layout for desktop, mobile applications as well as setup (onboarding) and the shared notes view.
Due to using a different approach, it is not possible yet to translate those files.
Server-side translations Currently the server-side messages are not translatable. They will be added as a separate step.
+}
Follow the Guidelines when creating a new message.
Adding a new locale To add a new locale, go to src/public/translations with your favorite text editor and copy the en directory.
Rename the copy to the ISO code (e.g. fr, ro) of the language being translated.
Translations with a country-language combination, using their corresponding ISO code (e.g. fr_FR, fr_BE), has not been tested yet.
Changing the language Since the internationalisation process is in its early stages, there is no user-facing way to switch the language.
To change the language manually, edit src/public/app/services/i18n.js and look for the line containing lng: "en". Replace en with the desired language code (from the ones available in src/public/translations).
Client-side translations Component-level translations Most of the client translations are present in the various widgets and layouts.
Translation support has to be added manually for every file.
The first step is to add the translation import with a relative import. For example, if we are in the src/public/app/widgets/dialogs directory, the import would look as follows:
import { t } from "../../services/i18n.js";Afterwards, simply replace the hard-coded message with:
${t("msgid")}where msgid is the key of the message being translated.
Variables In the translation, enclose the variables with {{ and }}:
{
+ "key": "{{what}} is {{how}}"
+}Then pass the arguments when reading the translation:
t('key', { what: 'i18next', how: 'great' })Template-level translations Templates are .ejs files present in src/views, these are used to prepare the root layout for desktop, mobile applications as well as setup (onboarding) and the shared notes view.
Due to using a different approach, it is not possible yet to translate those files.
Server-side translations Currently the server-side messages are not translatable. They will be added as a separate step.
+
+
+
+ Child notes:
+
+
+
+
+
@@ -71,20 +89,6 @@
- Internationalisation
-
-
-
-
-
-
-
-
-
-
-
-
-
Dependency Management
@@ -104,6 +108,360 @@
+
+
+
+
+
+
+
+
+ Having a simpler packaging system
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Building and deployment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project maintenance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Development and architecture
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Environment Setup
+
+
+
+
+
diff --git a/docs/jvdjFBOCCrOa.html b/docs/jvdjFBOCCrOa.html
new file mode 100644
index 000000000..3db03c34d
--- /dev/null
+++ b/docs/jvdjFBOCCrOa.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Testing compatibility
+
+
+
+
+
+
+ parent: Updating dependencies
+
+
+
+
Testing compatibility
+
+
+
+
+
+
better-sqlite3 versionSQLite version Compatibility 8.4.0 <3.43.0 Compatible, same version. 8.6.0 3.43.0 8.7.0 3.43.1 9.0.0 3.43.2 9.1.0 + 9.1.1 3.44.0 9.2.0 + 9.2.1 + 9.2.2 3.44.2 9.3.0 3.45.0 9.4.0, 9.4.1, 9.4.2, 9.4.3, 9.4.4, 9.4.5 3.45.1 9.5.0 3.45.2 9.6.0 / 10.0.0 3.45.3 10.1.0 / 11.0.0 / 11.1.1 / 11.1.2 3.46.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/mPGbEmYGitWe.html b/docs/mPGbEmYGitWe.html
new file mode 100644
index 000000000..14e1247a0
--- /dev/null
+++ b/docs/mPGbEmYGitWe.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Build information
+
+
+
+
+
+
+ parent: Development and architecture
+
+
+
+
Build information
+
+
+
+
+
+
Provides context about when the build was made and the corresponding Git revision. The information is displayed to the client when going in the about dialog. The build information is hard-coded in src/services/build.ts. This file is generated automatically via npm run update-build-info which itself is run automatically whenever making a build in the CI, or a local delivery .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/oXLcQUniOWvl.html b/docs/oXLcQUniOWvl.html
new file mode 100644
index 000000000..8b3f5d4ff
--- /dev/null
+++ b/docs/oXLcQUniOWvl.html
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Environment Setup
+
+
+
+
+
+
+ parent: Developer's Guide
+
+
+
+
Environment Setup
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/rU1hxvgqlA9x.html b/docs/rU1hxvgqlA9x.html
new file mode 100644
index 000000000..632d75c2c
--- /dev/null
+++ b/docs/rU1hxvgqlA9x.html
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CI
+
+
+
+
+
diff --git a/docs/s5gsYTbPQr6c.html b/docs/s5gsYTbPQr6c.html
new file mode 100644
index 000000000..400fd8e01
--- /dev/null
+++ b/docs/s5gsYTbPQr6c.html
@@ -0,0 +1,483 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Updating dependencies
+
+
+
+
+
+
+ parent: Project maintenance
+
+
+
+
Updating dependencies
+
+
+
+
+
+
Dependency Things to check for a basic sanity check better-sqlite3See bettersqlite binaries . jsdomNote map Clipper Note similarity async-mutexaxiosCan't be directly tested, as it's exposed only via the backend script API. saxCheck any action is reported from server to client (e.g. delete a note). ejsdayjssemverApplication should start. https-proxy-agent??? saxiniAffects config, generally if the application starts then it should be OK.
+
+
+
+
+
+
+
+ Child notes:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/xtBYDVZPb0gr.html b/docs/xtBYDVZPb0gr.html
new file mode 100644
index 000000000..908ef69ce
--- /dev/null
+++ b/docs/xtBYDVZPb0gr.html
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Project maintenance
+
+
+
+
+
+
+ parent: Developer's Guide
+
+
+
+
Project maintenance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+