User Guide
+ +The sub-children of this note are automatically synced.
+diff --git a/.gitattributes b/.gitattributes index 9f1ce2646..73bf98eb0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ package-lock.json linguist-generated=true **/package-lock.json linguist-generated=true +src/public/app/doc_notes/en/User[[:space:]]Guide/** linguist-generated=true libraries/** linguist-vendored \ No newline at end of file diff --git a/src/public/app/doc_notes/en/User Guide/!!!meta.json b/src/public/app/doc_notes/en/User Guide/!!!meta.json new file mode 100644 index 000000000..526ad8776 --- /dev/null +++ b/src/public/app/doc_notes/en/User Guide/!!!meta.json @@ -0,0 +1,7775 @@ +{ + "formatVersion": 2, + "appVersion": "0.92.3-beta", + "files": [ + { + "isClone": false, + "noteId": "pOsGYCXsbNQG", + "notePath": [ + "pOsGYCXsbNQG" + ], + "title": "User Guide", + "notePosition": 80, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "User Guide.html", + "attachments": [], + "dirFileName": "User Guide", + "children": [ + { + "isClone": false, + "noteId": "tC7s2alapj8V", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V" + ], + "title": "Advanced Usage", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-rocket", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "attachments": [], + "dirFileName": "Advanced Usage", + "children": [ + { + "isClone": false, + "noteId": "zEY4DaJG4YT5", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "zEY4DaJG4YT5" + ], + "title": "Attributes", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "R7abl2fc6Mxi", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "p9kXRFAkwN4o", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "J5Ex1ZrMbyJ6", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "9sRHySam5fXb", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "u3YFHC9tQlpm", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R9pX4DGra2Vt", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "47ZrP6FNuoG8", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 90 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bwZpz2ajCEwO", + "isInheritable": false, + "position": 100 + }, + { + "type": "label", + "name": "shareAlias", + "value": "attributes", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Attributes.html", + "attachments": [ + { + "attachmentId": "P4eRVtGFoHh2", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Attributes_image.png" + }, + { + "attachmentId": "ZuUT0WgJVR2j", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Attributes_image.png" + } + ], + "dirFileName": "Attributes", + "children": [ + { + "isClone": false, + "noteId": "bwZpz2ajCEwO", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "zEY4DaJG4YT5", + "bwZpz2ajCEwO" + ], + "title": "Attribute Inheritance", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "KC1HB96bqqHX", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "attribute-inheritance", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Attribute Inheritance.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "OFXdgB2nNk1F", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "zEY4DaJG4YT5", + "OFXdgB2nNk1F" + ], + "title": "Promoted Attributes", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bwZpz2ajCEwO", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "imageLink", + "value": "rxH2Dm1jn6YT", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "promoted-attributes", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Promoted Attributes.html", + "attachments": [ + { + "attachmentId": "4EcBRWF9iCk2", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Promoted Attributes_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "KC1HB96bqqHX", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "zEY4DaJG4YT5", + "KC1HB96bqqHX" + ], + "title": "Template", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "bwZpz2ajCEwO", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xYjQUYhpbUEW", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "imageLink", + "value": "Y8kzZ5MSZLCC", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "imageLink", + "value": "uuGrYX41lWN0", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "9sRHySam5fXb", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iRwzGnHPzonm", + "isInheritable": false, + "position": 90 + }, + { + "type": "relation", + "name": "internalLink", + "value": "47ZrP6FNuoG8", + "isInheritable": false, + "position": 100 + }, + { + "type": "label", + "name": "shareAlias", + "value": "template", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Template.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "iRwzGnHPzonm", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "iRwzGnHPzonm" + ], + "title": "Relation Map", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BCkXAVs63Ttv", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "imageLink", + "value": "EH6qNioOHeyT", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "imageLink", + "value": "xeZPrfi77XPu", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "imageLink", + "value": "N98UhifxrVpZ", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "kBrnXNG3Hplm", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "relation-map", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Relation Map.html", + "attachments": [ + { + "attachmentId": "x92CIQzusTuc", + "title": "relation-map-dev-process-demo.gif", + "role": "image", + "mime": "image/gif", + "position": 10, + "dataFileName": "Relation Map_relation-map-.gif" + } + ] + }, + { + "isClone": false, + "noteId": "BCkXAVs63Ttv", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "BCkXAVs63Ttv" + ], + "title": "Note Map", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iRwzGnHPzonm", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-map", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Note Map.html", + "attachments": [ + { + "attachmentId": "F48iB3BbITHb", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Note Map_image.png" + }, + { + "attachmentId": "scmGuoLQPj8C", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Note Map_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "R9pX4DGra2Vt", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "R9pX4DGra2Vt" + ], + "title": "Sharing", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "5GcxcE9fP9xX", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "Ky3qOJJMZ731", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "imageLink", + "value": "lCtZz2Z59wPT", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "imageLink", + "value": "jEQNvpyaXIWE", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bwZpz2ajCEwO", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Wy267RK4M69c", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "sharing", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-share-alt", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Sharing.html", + "attachments": [], + "dirFileName": "Sharing", + "children": [ + { + "isClone": false, + "noteId": "Qjt68inQ2bRj", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "R9pX4DGra2Vt", + "Qjt68inQ2bRj" + ], + "title": "Serving directly the content of a note", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Serving directly the content o.html", + "attachments": [ + { + "attachmentId": "eizmhhmocL6L", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Serving directly the conte.png" + }, + { + "attachmentId": "xicVjsf2Kmaz", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Serving directly the conte.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "6f9hih2hXXZk", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "6f9hih2hXXZk" + ], + "title": "Code Notes", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "code-notes", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Code Notes.html", + "attachments": [ + { + "attachmentId": "hajUVeLs3EOM", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Code Notes_image.png" + }, + { + "attachmentId": "OTcapNOcNaBL", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Code Notes_image.png" + } + ], + "dirFileName": "Code Notes", + "children": [ + { + "isClone": false, + "noteId": "CdNpE2pqjmI6", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "6f9hih2hXXZk", + "CdNpE2pqjmI6" + ], + "title": "Scripts", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GLks18SNjxmC", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "5668rwcirq1t", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GPERMystNGTB", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "imageLink", + "value": "DVJl4l3T8EG2", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "RDslemsQ6gCp", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "scripts", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Scripts.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "GLks18SNjxmC", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "6f9hih2hXXZk", + "GLks18SNjxmC" + ], + "title": "Script API", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "script-api", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Script API.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "GPERMystNGTB", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "6f9hih2hXXZk", + "GPERMystNGTB" + ], + "title": "Events", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "events", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Events.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "MgibgPcfeuGz", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "6f9hih2hXXZk", + "MgibgPcfeuGz" + ], + "title": "Custom Widgets", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "3sCPPL0LEC1S", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "custom-widget", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Custom Widgets.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "5668rwcirq1t", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "5668rwcirq1t" + ], + "title": "Advanced Showcases", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iRwzGnHPzonm", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R7abl2fc6Mxi", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xYjQUYhpbUEW", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "shareAlias", + "value": "advanced-showcases", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Advanced Showcases.html", + "attachments": [], + "dirFileName": "Advanced Showcases", + "children": [ + { + "isClone": false, + "noteId": "l0tKav7yLHGF", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "5668rwcirq1t", + "l0tKav7yLHGF" + ], + "title": "Day Notes", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xYjQUYhpbUEW", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R7abl2fc6Mxi", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "KC1HB96bqqHX", + "isInheritable": false, + "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "day-notes", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-calendar", + "isInheritable": false, + "position": 40 + } + ], + "format": "html", + "dataFileName": "Day Notes.html", + "attachments": [ + { + "attachmentId": "9wmaElfXYjWM", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Day Notes_image.png" + }, + { + "attachmentId": "FL40jUEj7xLt", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Day Notes_image.png" + }, + { + "attachmentId": "H3Iy9PpIDd0Z", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "2_Day Notes_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "R7abl2fc6Mxi", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "5668rwcirq1t", + "R7abl2fc6Mxi" + ], + "title": "Weight Tracker", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GLks18SNjxmC", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "KC1HB96bqqHX", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "weight-tracker", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Weight Tracker.html", + "attachments": [ + { + "attachmentId": "Ah5QpwUUEGf8", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Weight Tracker_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "xYjQUYhpbUEW", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "5668rwcirq1t", + "xYjQUYhpbUEW" + ], + "title": "Task Manager", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "92KeXdKh3Ca1", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "kBrnXNG3Hplm", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bwZpz2ajCEwO", + "isInheritable": false, + "position": 90 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GPERMystNGTB", + "isInheritable": false, + "position": 100 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 110 + }, + { + "type": "label", + "name": "shareAlias", + "value": "task-manager", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Task Manager.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "J5Ex1ZrMbyJ6", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "J5Ex1ZrMbyJ6" + ], + "title": "Custom Request Handler", + "notePosition": 80, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GLks18SNjxmC", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "d3fAXQ2diepH", + "isInheritable": false, + "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "custom-request-handler", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Custom Request Handler.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "d3fAXQ2diepH", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "d3fAXQ2diepH" + ], + "title": "Custom Resource Providers", + "notePosition": 90, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Custom Resource Providers.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "pgxEVkzLl1OP", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "pgxEVkzLl1OP" + ], + "title": "ETAPI (REST API)", + "notePosition": 100, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "etapi", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "ETAPI (REST API).html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "47ZrP6FNuoG8", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "47ZrP6FNuoG8" + ], + "title": "Default Note Title", + "notePosition": 110, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "KC1HB96bqqHX", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "default-note-title", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Default Note Title.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "wX4HbRucYSDD", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "wX4HbRucYSDD" + ], + "title": "Database", + "notePosition": 130, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iRwzGnHPzonm", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R7abl2fc6Mxi", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xYjQUYhpbUEW", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Wy267RK4M69c", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "oyIAJ9PvvwHX", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Gzjqa934BdH4", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "database", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-data", + "isInheritable": false, + "position": 50 + } + ], + "format": "html", + "dataFileName": "Database.html", + "attachments": [], + "dirFileName": "Database", + "children": [ + { + "isClone": false, + "noteId": "oyIAJ9PvvwHX", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "wX4HbRucYSDD", + "oyIAJ9PvvwHX" + ], + "title": "Manually altering the database", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "YKWqdJhzi2VY", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Manually altering the database.html", + "attachments": [ + { + "attachmentId": "0740ph4lJ4rv", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Manually altering the data.png" + }, + { + "attachmentId": "fJlFqdEOpLrF", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Manually altering the data.png" + }, + { + "attachmentId": "lAsR2tqMXurk", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Manually altering the data.png" + }, + { + "attachmentId": "uvaARhqiU4M5", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "3_Manually altering the data.png" + }, + { + "attachmentId": "W4710rPIeZjF", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_Manually altering the data.png" + }, + { + "attachmentId": "wL249F7azfME", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "5_Manually altering the data.png" + }, + { + "attachmentId": "yC5HdtMbAaaF", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "6_Manually altering the data.png" + } + ], + "dirFileName": "Manually altering the database", + "children": [ + { + "isClone": false, + "noteId": "YKWqdJhzi2VY", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "wX4HbRucYSDD", + "oyIAJ9PvvwHX", + "YKWqdJhzi2VY" + ], + "title": "SQL Console", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Vc8PjrjAGuOp", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-data", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "SQL Console.html", + "attachments": [ + { + "attachmentId": "1YS10Qg7S4YR", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "SQL Console_image.png" + }, + { + "attachmentId": "827EgLgWhZWF", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_SQL Console_image.png" + }, + { + "attachmentId": "gIbK7NNLu3iZ", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_SQL Console_image.png" + }, + { + "attachmentId": "pP87PB9ELjQn", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_SQL Console_image.png" + } + ] + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "Gzjqa934BdH4", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "Gzjqa934BdH4" + ], + "title": "Configuration (config.ini or environment variables)", + "notePosition": 140, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "configuration", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Configuration (config.ini or e.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "ivYnonVFBxbQ", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "ivYnonVFBxbQ" + ], + "title": "Bulk actions", + "notePosition": 150, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Bulk actions.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "s3YCWHBfmYuM", + "notePath": [ + "pOsGYCXsbNQG", + "s3YCWHBfmYuM" + ], + "title": "Quick Start", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "JXFeNgU8Xnp1", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "poXkQfguuA0U", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "RDslemsQ6gCp", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "quick-start", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-run", + "isInheritable": false, + "position": 40 + } + ], + "format": "html", + "dataFileName": "Quick Start.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "FJ4qLB6X4fyS", + "notePath": [ + "pOsGYCXsbNQG", + "FJ4qLB6X4fyS" + ], + "title": "What's new", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "81SGnPGMk7Xc", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "NRnIZmSMc5sj", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "rC3pL2aptaRE", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xWbu3jpNWapp", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BMf2nEbYlcUt", + "isInheritable": false, + "position": 50 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-star", + "isInheritable": false, + "position": 60 + } + ], + "format": "html", + "dataFileName": "What's new.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "gh7bpGYxajRS", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS" + ], + "title": "Basic Concepts", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-help-circle", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "attachments": [], + "dirFileName": "Basic Concepts", + "children": [ + { + "isClone": false, + "noteId": "Vc8PjrjAGuOp", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "Vc8PjrjAGuOp" + ], + "title": "UI Elements", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [ + { + "attachmentId": "0CaTtahPNa2i", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "UI Elements_image.png" + }, + { + "attachmentId": "vbrDuqZjshed", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_UI Elements_image.png" + } + ], + "dirFileName": "UI Elements", + "children": [ + { + "isClone": false, + "noteId": "x3i7MxGccDuM", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "Vc8PjrjAGuOp", + "x3i7MxGccDuM" + ], + "title": "Global menu", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Global menu.html", + "attachments": [ + { + "attachmentId": "8fNGILWWQodv", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Global menu_image.png" + }, + { + "attachmentId": "PhNb7G9OgPVt", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Global menu_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "BFs8mudNFgCS", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS" + ], + "title": "Note", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "iPIMuisry3hd", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "m523cpzocqaD", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iRwzGnHPzonm", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GTwFsgaA0lCt", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "ODY7qQn5m2FT", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CoFPLs3dRlXc", + "isInheritable": false, + "position": 90 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Note.html", + "attachments": [], + "dirFileName": "Note", + "children": [ + { + "isClone": false, + "noteId": "p9kXRFAkwN4o", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "p9kXRFAkwN4o" + ], + "title": "Note Icons", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "iuAfnapzpRCB", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "R1L2vUshJD82", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-icons", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Note Icons.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "QEAPj01N5f7w", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "QEAPj01N5f7w" + ], + "title": "Links", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "N6O1qfBGcbFH", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "dPcRcDZwyGAO", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BCkXAVs63Ttv", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "links", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Links.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "mT0HEkOsz6i1", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "mT0HEkOsz6i1" + ], + "title": "Images", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "0vhv7lsOLy82", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "kBrnXNG3Hplm", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "images", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Images.html", + "attachments": [ + { + "attachmentId": "MTsRB4C0yvKX", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Images_image.png" + }, + { + "attachmentId": "PUjxzv10IJkx", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Images_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "0vhv7lsOLy82", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "0vhv7lsOLy82" + ], + "title": "Attachments", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R7abl2fc6Mxi", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "attachments", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Attachments.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "IakOLONlIfGI", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "IakOLONlIfGI" + ], + "title": "Cloning Notes", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "BqvIJUHkWrvH", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "A9Oc6YKKc65v", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "cloning-notes", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Cloning Notes.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "bwg0e8ewQMak", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "bwg0e8ewQMak" + ], + "title": "Protected Notes", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "zaUtPWl8NcCt", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "protected-notes", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Protected Notes.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "MKmLg5x6xkor", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "MKmLg5x6xkor" + ], + "title": "Archived Notes", + "notePosition": 80, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "1fkGrskxHx5u", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bwZpz2ajCEwO", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "eIg8jdvaoNNd", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "archived-notes", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Archived Notes.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "vZWERwf8U3nx", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "vZWERwf8U3nx" + ], + "title": "Note Revisions", + "notePosition": 90, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "MA2uvkVloWXl", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-revisions", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Note Revisions.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "aGlEvb9hyDhS", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "aGlEvb9hyDhS" + ], + "title": "Sorting Notes", + "notePosition": 100, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "sorting", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Sorting Notes.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "BMf2nEbYlcUt", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "BMf2nEbYlcUt" + ], + "title": "Right-to-Left Support", + "notePosition": 110, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "iPIMuisry3hd", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-align-right", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Right-to-Left Support.html", + "attachments": [ + { + "attachmentId": "hLJbTJdMAAjW", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Right-to-Left Support_imag.png" + }, + { + "attachmentId": "J25q0es2PQGJ", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Right-to-Left Support_imag.png" + }, + { + "attachmentId": "oW5LpuCUuq1z", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Right-to-Left Support_imag.png" + }, + { + "attachmentId": "ox7Zs0BvBGBD", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Right-to-Left Support_imag.png" + }, + { + "attachmentId": "V7U0KMPHxH2I", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_Right-to-Left Support_imag.png" + } + ] + }, + { + "isClone": false, + "noteId": "NRnIZmSMc5sj", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "NRnIZmSMc5sj" + ], + "title": "Export as PDF", + "notePosition": 120, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-file-pdf", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Export as PDF.html", + "attachments": [ + { + "attachmentId": "NfSjRsArIQHy", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Export as PDF_image.png" + }, + { + "attachmentId": "Om2EmdZr54vy", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Export as PDF_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "CoFPLs3dRlXc", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "BFs8mudNFgCS", + "CoFPLs3dRlXc" + ], + "title": "Read-Only Notes", + "notePosition": 130, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iPIMuisry3hd", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "read-only-note", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-edit-alt", + "isInheritable": false, + "position": 40 + } + ], + "format": "html", + "dataFileName": "Read-Only Notes.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "wArbEsdSae6g", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g" + ], + "title": "Navigation", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "Navigation", + "children": [ + { + "isClone": false, + "noteId": "kBrnXNG3Hplm", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g", + "kBrnXNG3Hplm" + ], + "title": "Tree Concepts", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "tree-concepts", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Tree Concepts.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "oPVyFC7WL2Lp", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g", + "oPVyFC7WL2Lp" + ], + "title": "Tree Manipulation", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "sLZ7Bcq9p8E9", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "qL7381ZG0lMK", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "A9Oc6YKKc65v", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "tree-manipulation", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Tree Manipulation.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "MMiBEQljMQh2", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g", + "MMiBEQljMQh2" + ], + "title": "Note Navigation", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "snfWRIih71MM", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "wpFu8PhUu7e7", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-navigation", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Note Navigation.html", + "attachments": [ + { + "attachmentId": "jDuwVaU8bNtG", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Note Navigation_image.png" + }, + { + "attachmentId": "Pae5L9DXlzQW", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Note Navigation_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "eIg8jdvaoNNd", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g", + "eIg8jdvaoNNd" + ], + "title": "Search", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "A9Oc6YKKc65v", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "search", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Search.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "u3YFHC9tQlpm", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g", + "u3YFHC9tQlpm" + ], + "title": "Bookmarks", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "sag6ww9q4pgW", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "HEtnpiQrEvjl", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "bookmarks", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Bookmarks.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "OR8WJ7Iz9K4U", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g", + "OR8WJ7Iz9K4U" + ], + "title": "Note Hoisting", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "AiBOf1LIykMC", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "MMiBEQljMQh2", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "9sRHySam5fXb", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-hoisting", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Note Hoisting.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "9sRHySam5fXb", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "wArbEsdSae6g", + "9sRHySam5fXb" + ], + "title": "Workspace", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "OR8WJ7Iz9K4U", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "workspace", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Workspace.html", + "attachments": [ + { + "attachmentId": "V4TIsmtBh8P7", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Workspace_image.png" + }, + { + "attachmentId": "vZSH2mOKzWBx", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Workspace_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "A9Oc6YKKc65v", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "A9Oc6YKKc65v" + ], + "title": "Keyboard Shortcuts", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "MMiBEQljMQh2", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iPIMuisry3hd", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "QEAPj01N5f7w", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "eIg8jdvaoNNd", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "shareAlias", + "value": "keyboard-shortcuts", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Keyboard Shortcuts.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "Wy267RK4M69c", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "Wy267RK4M69c" + ], + "title": "Themes", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "zaQnUsJTbvjr", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "uVF9DAmAmEWC", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "VbjZvtUek0Ln", + "isInheritable": false, + "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "themes", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Themes.html", + "attachments": [ + { + "attachmentId": "rwK3vuBgh7sY", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Themes_image.png" + } + ], + "dirFileName": "Themes", + "children": [ + { + "isClone": false, + "noteId": "VbjZvtUek0Ln", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "Wy267RK4M69c", + "VbjZvtUek0Ln" + ], + "title": "Theme Gallery", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "theme-gallery", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Theme Gallery.html", + "attachments": [ + { + "attachmentId": "wob20Q0zLkMq", + "title": "preview.jpg", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Theme Gallery_preview.jpg" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "mHbBMPDPkVV5", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "mHbBMPDPkVV5" + ], + "title": "Import & Export", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "Import & Export", + "children": [ + { + "isClone": false, + "noteId": "Oau6X9rCuegd", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "mHbBMPDPkVV5", + "Oau6X9rCuegd" + ], + "title": "Markdown", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "Y9mwMwSGAaSb", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "xMQSqWySvWBZ", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "imageLink", + "value": "QUqKzK4LHMVA", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "imageLink", + "value": "e3qPZSsTbUZP", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "markdown", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Markdown.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "syuSEKf2rUGr", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "mHbBMPDPkVV5", + "syuSEKf2rUGr" + ], + "title": "Evernote", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "evernote-import", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Evernote.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "GnhlmrATVqcH", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "mHbBMPDPkVV5", + "GnhlmrATVqcH" + ], + "title": "OneNote", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "onenote", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "OneNote.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "rC3pL2aptaRE", + "notePath": [ + "pOsGYCXsbNQG", + "gh7bpGYxajRS", + "rC3pL2aptaRE" + ], + "title": "Zen mode", + "notePosition": 80, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-yin-yang", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Zen mode.html", + "attachments": [ + { + "attachmentId": "Asn6uBNwt6JI", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Zen mode_image.png" + }, + { + "attachmentId": "cOMcKGJQYs8Y", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Zen mode_image.png" + }, + { + "attachmentId": "ghjyT4LkrZrU", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "2_Zen mode_image.png" + }, + { + "attachmentId": "HGcQUOEXJ3Sp", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Zen mode_image.png" + }, + { + "attachmentId": "jtzLZ0J0GMub", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "4_Zen mode_image.png" + }, + { + "attachmentId": "lqQtSNb8loOS", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "5_Zen mode_image.png" + }, + { + "attachmentId": "LX31yc6Jnksw", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "6_Zen mode_image.png" + }, + { + "attachmentId": "NVSyQubZNFy7", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "7_Zen mode_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "KSZ04uQ2D1St", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St" + ], + "title": "Note Types", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-edit", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "attachments": [], + "dirFileName": "Note Types", + "children": [ + { + "isClone": false, + "noteId": "iPIMuisry3hd", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "iPIMuisry3hd" + ], + "title": "Text", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "FtmPLgGmgZVC", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "oRWfJLUbb7j7", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CoFPLs3dRlXc", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "S6Xx8QIWTV66", + "isInheritable": false, + "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "text-notes", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Text.html", + "attachments": [ + { + "attachmentId": "lHWL7KkEhmM3", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Text_image.png" + }, + { + "attachmentId": "yGknq3nsWpef", + "title": "bx-edit-alt.svg", + "role": "image", + "mime": "image/svg+xml", + "position": 10, + "dataFileName": "Text_bx-edit-alt.svg" + } + ], + "dirFileName": "Text", + "children": [ + { + "isClone": false, + "noteId": "veGu4faJErEM", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "iPIMuisry3hd", + "veGu4faJErEM" + ], + "title": "Content language", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "BMf2nEbYlcUt", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Content language.html", + "attachments": [ + { + "attachmentId": "TlBagKsAj5ax", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Content language_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "S6Xx8QIWTV66", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "iPIMuisry3hd", + "S6Xx8QIWTV66" + ], + "title": "Lists", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-list-ul", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Lists.html", + "attachments": [ + { + "attachmentId": "5cmICTYfg13g", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Lists_image.png" + }, + { + "attachmentId": "6jl7tboJfutt", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Lists_image.png" + }, + { + "attachmentId": "d4XfLoK5srYZ", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "2_Lists_image.png" + }, + { + "attachmentId": "eL11eZMPwpmH", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "3_Lists_image.png" + }, + { + "attachmentId": "EnkTpdeLJ6Ft", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "4_Lists_image.png" + }, + { + "attachmentId": "If3k6Tt5cPBt", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "5_Lists_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "FVuX89AJuFSw", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "FVuX89AJuFSw" + ], + "title": "Code", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-code", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Code.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "m523cpzocqaD", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "m523cpzocqaD" + ], + "title": "Saved Search", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "rVtYANyVhE9U", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "9sRHySam5fXb", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "saved-search", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-file-find", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Saved Search.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "joqzSrDccPKf", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "joqzSrDccPKf" + ], + "title": "Relation Map", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-network-chart", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Relation Map.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "bdUJEHsAPYQR", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "bdUJEHsAPYQR" + ], + "title": "Note Map", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-network-chart", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Note Map.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "HcABDtFCkbFN", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "HcABDtFCkbFN" + ], + "title": "Render Note", + "notePosition": 90, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-extension", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Render Note.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "GTwFsgaA0lCt", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "GTwFsgaA0lCt" + ], + "title": "Book", + "notePosition": 110, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "book-note", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-book", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Book.html", + "attachments": [ + { + "attachmentId": "BmpgL4ol4jJo", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Book_image.png" + }, + { + "attachmentId": "lpq3QC1C5LWg", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "1_Book_image.png" + } + ], + "dirFileName": "Book", + "children": [ + { + "isClone": false, + "noteId": "xWbu3jpNWapp", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "GTwFsgaA0lCt", + "xWbu3jpNWapp" + ], + "title": "Calendar View", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-calendar", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Calendar View.html", + "attachments": [ + { + "attachmentId": "37CfbqKYcOtd", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Calendar View_image.png" + }, + { + "attachmentId": "6w8hjC47rS2H", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Calendar View_image.png" + }, + { + "attachmentId": "akAHcIEcGnWR", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Calendar View_image.png" + }, + { + "attachmentId": "AU7dnIevWPrz", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Calendar View_image.png" + }, + { + "attachmentId": "AzRAe3io7LxA", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_Calendar View_image.png" + }, + { + "attachmentId": "COiR1tnE86i1", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "5_Calendar View_image.png" + }, + { + "attachmentId": "fOdCNTs2BuI0", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "6_Calendar View_image.png" + }, + { + "attachmentId": "GeEGbbeQ1qy9", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "7_Calendar View_image.png" + }, + { + "attachmentId": "gQvwJGB5a4c1", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "8_Calendar View_image.png" + }, + { + "attachmentId": "HfBu0m3WXtn2", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "9_Calendar View_image.png" + }, + { + "attachmentId": "ho00OJTNrxVI", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "10_Calendar View_image.png" + }, + { + "attachmentId": "irfNX8n4159U", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "11_Calendar View_image.png" + }, + { + "attachmentId": "KF56rdNuOwWd", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "12_Calendar View_image.png" + }, + { + "attachmentId": "oBWr5GL6cUAZ", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "13_Calendar View_image.png" + }, + { + "attachmentId": "oS6yUoQtfhpg", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "14_Calendar View_image.png" + }, + { + "attachmentId": "PYHfGSBQpr0y", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "15_Calendar View_image.png" + }, + { + "attachmentId": "rYaJQN8tjfsG", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "16_Calendar View_image.png" + }, + { + "attachmentId": "u2c09UpZghff", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "17_Calendar View_image.png" + }, + { + "attachmentId": "UCQb1diHfd02", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "18_Calendar View_image.png" + }, + { + "attachmentId": "xqgGyeWWqLyg", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "19_Calendar View_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "s1aBHPd79XYj", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "s1aBHPd79XYj" + ], + "title": "Mermaid Diagrams", + "notePosition": 120, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "r44dpvA1xFu8", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "opAFABmyb3CU", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "mermaid-diagrams", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-selection", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Mermaid Diagrams.html", + "attachments": [], + "dirFileName": "Mermaid Diagrams", + "children": [ + { + "isClone": false, + "noteId": "opAFABmyb3CU", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "s1aBHPd79XYj", + "opAFABmyb3CU" + ], + "title": "ELK on", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "mermaid", + "mime": "text/plain", + "attributes": [], + "dataFileName": "ELK on.txt", + "attachments": [ + { + "attachmentId": "biyznKlYQ7my", + "title": "mermaid-export.svg", + "role": "image", + "mime": "image/svg+xml", + "position": 10, + "dataFileName": "ELK on_mermaid-export.svg" + } + ] + }, + { + "isClone": false, + "noteId": "r44dpvA1xFu8", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "s1aBHPd79XYj", + "r44dpvA1xFu8" + ], + "title": "ELK off", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "mermaid", + "mime": "text/plain", + "attributes": [], + "dataFileName": "ELK off.txt", + "attachments": [ + { + "attachmentId": "rQI7SXljnpJM", + "title": "mermaid-export.svg", + "role": "image", + "mime": "image/svg+xml", + "position": 10, + "dataFileName": "ELK off_mermaid-export.svg" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "grjYqerjn243", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "grjYqerjn243" + ], + "title": "Canvas", + "notePosition": 140, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-pen", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Canvas.html", + "attachments": [ + { + "attachmentId": "DC9fvvootwwZ", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Canvas_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "1vHRoWCEjj0L", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "1vHRoWCEjj0L" + ], + "title": "Web View", + "notePosition": 150, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-globe-alt", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Web View.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "gBbsAeiuUxI5", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "gBbsAeiuUxI5" + ], + "title": "Mind Map", + "notePosition": 160, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-sitemap", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Mind Map.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "81SGnPGMk7Xc", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "81SGnPGMk7Xc" + ], + "title": "Geo map", + "notePosition": 170, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-map-alt", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Geo map.html", + "attachments": [ + { + "attachmentId": "1f07O0Z25ZRr", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Geo map_image.png" + }, + { + "attachmentId": "3oh61qhNLu7D", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Geo map_image.png" + }, + { + "attachmentId": "6wUkw5RWE39e", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Geo map_image.png" + }, + { + "attachmentId": "aCSNn9QlgHFi", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Geo map_image.png" + }, + { + "attachmentId": "aCuXZY7WV4li", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_Geo map_image.png" + }, + { + "attachmentId": "agH6yREFgsoU", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "5_Geo map_image.png" + }, + { + "attachmentId": "AHyDUM6R5HeG", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "6_Geo map_image.png" + }, + { + "attachmentId": "CcjWLhE3KKfv", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "7_Geo map_image.png" + }, + { + "attachmentId": "DapDey8gMiFc", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "8_Geo map_image.png" + }, + { + "attachmentId": "fQy8R1vxKhwN", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "9_Geo map_image.png" + }, + { + "attachmentId": "gJ4Yz80jxcbn", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "10_Geo map_image.png" + }, + { + "attachmentId": "Mx2xwNIk76ZS", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "11_Geo map_image.png" + }, + { + "attachmentId": "oaahbsMRbqd2", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "12_Geo map_image.png" + }, + { + "attachmentId": "pGf1p74KKGU4", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "13_Geo map_image.png" + }, + { + "attachmentId": "tDWsliJj9ncm", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "14_Geo map_image.png" + }, + { + "attachmentId": "tfa1TRUatWEh", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "15_Geo map_image.png" + }, + { + "attachmentId": "USbvJ38T4AKA", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "16_Geo map_image.png" + }, + { + "attachmentId": "x6yBLIsY2LSv", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "17_Geo map_image.png" + }, + { + "attachmentId": "ZvTlu9WMd37z", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "18_Geo map_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "pKK96zzmvBGf", + "notePath": [ + "pOsGYCXsbNQG", + "pKK96zzmvBGf" + ], + "title": "Theme development", + "notePosition": 100, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-palette", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "attachments": [], + "dirFileName": "Theme development", + "children": [ + { + "isClone": false, + "noteId": "7NfNr5pZpVKV", + "notePath": [ + "pOsGYCXsbNQG", + "pKK96zzmvBGf", + "7NfNr5pZpVKV" + ], + "title": "Creating a custom theme", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "WFGzWeUK6arS", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Creating a custom theme.html", + "attachments": [ + { + "attachmentId": "14xpFnX5GIkZ", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Creating a custom theme_im.png" + }, + { + "attachmentId": "EzM9s8bCnJ85", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Creating a custom theme_im.png" + }, + { + "attachmentId": "M3C6oYYIakiS", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Creating a custom theme_im.png" + }, + { + "attachmentId": "PY4a4fueTRUZ", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Creating a custom theme_im.png" + }, + { + "attachmentId": "QkaP2Ge0lagI", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_Creating a custom theme_im.png" + }, + { + "attachmentId": "yJVfT7rjp4tI", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "5_Creating a custom theme_im.png" + } + ] + }, + { + "isClone": false, + "noteId": "WFGzWeUK6arS", + "notePath": [ + "pOsGYCXsbNQG", + "pKK96zzmvBGf", + "WFGzWeUK6arS" + ], + "title": "Customize the Next theme", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Customize the Next theme.html", + "attachments": [ + { + "attachmentId": "3fAj97aV2noG", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Customize the Next theme_i.png" + } + ] + }, + { + "isClone": false, + "noteId": "WN5z4M8ASACJ", + "notePath": [ + "pOsGYCXsbNQG", + "pKK96zzmvBGf", + "WN5z4M8ASACJ" + ], + "title": "Reference", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "d3fAXQ2diepH", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Reference.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "AlhDUqhENtH7", + "notePath": [ + "pOsGYCXsbNQG", + "pKK96zzmvBGf", + "AlhDUqhENtH7" + ], + "title": "Custom app-wide CSS", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Custom app-wide CSS.html", + "attachments": [ + { + "attachmentId": "fkMLaf6reA6I", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Custom app-wide CSS_image.png" + }, + { + "attachmentId": "TIerrMjmeich", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Custom app-wide CSS_image.png" + }, + { + "attachmentId": "YUrNq5vsCwHe", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Custom app-wide CSS_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "k2Gc17NbaAwb", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb" + ], + "title": "Developer Guides", + "notePosition": 120, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bxl-javascript", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "attachments": [], + "dirFileName": "Developer Guides", + "children": [ + { + "isClone": false, + "noteId": "yIhgI5H7A2Sm", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "yIhgI5H7A2Sm" + ], + "title": "Frontend Basics", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "GLks18SNjxmC", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "SynTBQiBsdYJ", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "frontend-basics", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Frontend Basics.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "SynTBQiBsdYJ", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "SynTBQiBsdYJ" + ], + "title": "Widget Basics", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GLks18SNjxmC", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "widget-basics", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Widget Basics.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "es8OU2GuguFU", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "es8OU2GuguFU" + ], + "title": "Examples", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "Examples", + "children": [ + { + "isClone": false, + "noteId": "7kZPMD0uFwkH", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "es8OU2GuguFU", + "7kZPMD0uFwkH" + ], + "title": "Downloading responses from Google Forms", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Downloading responses from Goo.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "DL92EjAaXT26", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "es8OU2GuguFU", + "DL92EjAaXT26" + ], + "title": "Using promoted attributes to configure scripts", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Using promoted attributes to c.html", + "attachments": [ + { + "attachmentId": "7P3jzVEa1mk7", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Using promoted attributes .png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "CXny4YWKsD7z", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "CXny4YWKsD7z" + ], + "title": "REST API", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "REST API", + "children": [ + { + "isClone": false, + "noteId": "cqCjxpN8NhbH", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "CXny4YWKsD7z", + "cqCjxpN8NhbH" + ], + "title": "ETAPI", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "ETAPI", + "children": [ + { + "isClone": false, + "noteId": "9qPsTWBorUhQ", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "CXny4YWKsD7z", + "cqCjxpN8NhbH", + "9qPsTWBorUhQ" + ], + "title": "API Reference", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "webView", + "mime": "", + "attributes": [ + { + "type": "label", + "name": "webViewSrc", + "value": "/etapi/docs", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "API Reference.dat", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "0vTSyvhPTAOz", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "CXny4YWKsD7z", + "0vTSyvhPTAOz" + ], + "title": "Internal API", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "Internal API", + "children": [ + { + "isClone": false, + "noteId": "z8O2VG4ZZJD7", + "notePath": [ + "pOsGYCXsbNQG", + "k2Gc17NbaAwb", + "CXny4YWKsD7z", + "0vTSyvhPTAOz", + "z8O2VG4ZZJD7" + ], + "title": "API Reference", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "webView", + "mime": "", + "attributes": [ + { + "type": "label", + "name": "webViewSrc", + "value": "/api/docs", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "API Reference.dat", + "attachments": [] + } + ] + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "Otzi9La2YAUX", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX" + ], + "title": "Installation & Setup", + "notePosition": 160, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-cog", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "attachments": [], + "dirFileName": "Installation & Setup", + "children": [ + { + "isClone": false, + "noteId": "poXkQfguuA0U", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "poXkQfguuA0U" + ], + "title": "Desktop Installation", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l2VkvOwUNfZj", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "desktop-installation", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Desktop Installation.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "WOcw2SLH6tbX", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX" + ], + "title": "Server Installation", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "rWX5eY045zbE", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "3tW6mORuTHnB", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "J1Bb6lVlwU5T", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "DCmT6e7clMoP", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "moVgBcoxE3EK", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "RDslemsQ6gCp", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l2VkvOwUNfZj", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 90 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Gzjqa934BdH4", + "isInheritable": false, + "position": 100 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 110 + }, + { + "type": "relation", + "name": "internalLink", + "value": "fDLvzOx29Pfg", + "isInheritable": false, + "position": 120 + }, + { + "type": "label", + "name": "shareAlias", + "value": "server-installation", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Server Installation.html", + "attachments": [], + "dirFileName": "Server Installation", + "children": [ + { + "isClone": false, + "noteId": "Dgg7bR3b6K9j", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Dgg7bR3b6K9j" + ], + "title": "1. Installing the server", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "1. Installing the server", + "children": [ + { + "isClone": false, + "noteId": "3tW6mORuTHnB", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Dgg7bR3b6K9j", + "3tW6mORuTHnB" + ], + "title": "Packaged server installation", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l2VkvOwUNfZj", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "packaged-server-installation", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Packaged server installation.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "rWX5eY045zbE", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Dgg7bR3b6K9j", + "rWX5eY045zbE" + ], + "title": "Docker Server Installation", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "ud6MShXL4WpO", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "fDLvzOx29Pfg", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "docker-server-installation", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Docker Server Installation.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "moVgBcoxE3EK", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Dgg7bR3b6K9j", + "moVgBcoxE3EK" + ], + "title": "NixOS server installation", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "nixos-server-installation", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "NixOS server installation.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "J1Bb6lVlwU5T", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Dgg7bR3b6K9j", + "J1Bb6lVlwU5T" + ], + "title": "Manual server installation", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "l2VkvOwUNfZj", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "manual-server-installation", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Manual server installation.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "DCmT6e7clMoP", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Dgg7bR3b6K9j", + "DCmT6e7clMoP" + ], + "title": "Kubernetes server installation", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "kubernetes-server-installation", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Kubernetes server installation.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "vcjrb3VVYPZI", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "vcjrb3VVYPZI" + ], + "title": "2. Reverse proxy", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "attachments": [], + "dirFileName": "2. Reverse proxy", + "children": [ + { + "isClone": false, + "noteId": "ud6MShXL4WpO", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "vcjrb3VVYPZI", + "ud6MShXL4WpO" + ], + "title": "Nginx", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "nginx-proxy-setup", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Nginx.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "fDLvzOx29Pfg", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "vcjrb3VVYPZI", + "fDLvzOx29Pfg" + ], + "title": "Apache", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "apache-proxy-setup", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Apache.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "l2VkvOwUNfZj", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "l2VkvOwUNfZj" + ], + "title": "TLS Configuration", + "notePosition": 100, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Gzjqa934BdH4", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "tls-configuration", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "TLS Configuration.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "7DAiwaf8Z7Rz", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "7DAiwaf8Z7Rz" + ], + "title": "Multi-Factor Authentication", + "notePosition": 110, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "multi-factor-authentication", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareHiddenFromTree", + "value": "", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Multi-Factor Authentication.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "KaM3TfD7mP78", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "KaM3TfD7mP78" + ], + "title": "Reverse proxy setup", + "notePosition": 120, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Reverse proxy setup.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "cbkrhQjrkKrh", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "cbkrhQjrkKrh" + ], + "title": "Synchronization", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "676Ekdv73T7I", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "SDHWNDsB68aJ", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "imageLink", + "value": "qGTyyKX4TceE", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "l2VkvOwUNfZj", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "poXkQfguuA0U", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "vZWERwf8U3nx", + "isInheritable": false, + "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "synchronization", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Synchronization.html", + "attachments": [ + { + "attachmentId": "s3fKDqHslToK", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Synchronization_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "RDslemsQ6gCp", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "RDslemsQ6gCp" + ], + "title": "Mobile Frontend", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "TFAiJIXJFfqv", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "fi37V32TNyzm", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bwg0e8ewQMak", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "mobile-frontend", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Mobile Frontend.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "MtPxeAWVAzMg", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "MtPxeAWVAzMg" + ], + "title": "Web Clipper", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "l0tKav7yLHGF", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "web-clipper", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Web Clipper.html", + "attachments": [ + { + "attachmentId": "fhKf5Otv0M5Y", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Web Clipper_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "n1lujUxCwipy", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "n1lujUxCwipy" + ], + "title": "Upgrading TriliumNext", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "rWX5eY045zbE", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "ODY7qQn5m2FT", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "upgrading-trilium", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Upgrading TriliumNext.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "ODY7qQn5m2FT", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "ODY7qQn5m2FT" + ], + "title": "Backup", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "Gzjqa934BdH4", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "backup", + "isInheritable": false, + "position": 20 + } + ], + "format": "html", + "dataFileName": "Backup.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "tAassRL4RSQL", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "tAassRL4RSQL" + ], + "title": "Data directory", + "notePosition": 80, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "ODY7qQn5m2FT", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "data-directory", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-folder-open", + "isInheritable": false, + "position": 40 + } + ], + "format": "html", + "dataFileName": "Data directory.html", + "attachments": [ + { + "attachmentId": "NONZTci1YkNe", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Data directory_image.png" + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "i6dbnitykE5D", + "notePath": [ + "pOsGYCXsbNQG", + "i6dbnitykE5D" + ], + "title": "FAQ", + "notePosition": 170, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BCkXAVs63Ttv", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "shareAlias", + "value": "faq", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-question-mark", + "isInheritable": false, + "position": 40 + } + ], + "format": "html", + "dataFileName": "FAQ.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "BgmBlOIl72jZ", + "notePath": [ + "pOsGYCXsbNQG", + "BgmBlOIl72jZ" + ], + "title": "Troubleshooting", + "notePosition": 180, + "prefix": null, + "isExpanded": true, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "MgibgPcfeuGz", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "x59R8J8KV5Bp", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "ODY7qQn5m2FT", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "qzNzp9LYQyPT", + "isInheritable": false, + "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "troubleshooting", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-bug", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Troubleshooting.html", + "attachments": [], + "dirFileName": "Troubleshooting", + "children": [ + { + "isClone": false, + "noteId": "wy8So3yZZlH9", + "notePath": [ + "pOsGYCXsbNQG", + "BgmBlOIl72jZ", + "wy8So3yZZlH9" + ], + "title": "Reporting issues", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "html", + "dataFileName": "Reporting issues.html", + "attachments": [] + }, + { + "isClone": false, + "noteId": "x59R8J8KV5Bp", + "notePath": [ + "pOsGYCXsbNQG", + "BgmBlOIl72jZ", + "x59R8J8KV5Bp" + ], + "title": "Anonymized Database", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "anonymized-database", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Anonymized Database.html", + "attachments": [ + { + "attachmentId": "xh9biKiOnMJv", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Anonymized Database_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "qzNzp9LYQyPT", + "notePath": [ + "pOsGYCXsbNQG", + "BgmBlOIl72jZ", + "qzNzp9LYQyPT" + ], + "title": "Error logs", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "imageLink", + "value": "zIQ1XGaUbB7i", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "imageLink", + "value": "v8H3fXMFPki0", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "x59R8J8KV5Bp", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "error-logs", + "isInheritable": false, + "position": 30 + } + ], + "format": "html", + "dataFileName": "Error logs.html", + "attachments": [ + { + "attachmentId": "8b6d0LUU1aMl", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Error logs_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "vdlYGAcpXAgc", + "notePath": [ + "pOsGYCXsbNQG", + "BgmBlOIl72jZ", + "vdlYGAcpXAgc" + ], + "title": "Synchronization fails with 504 Gateway Timeout", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "ud6MShXL4WpO", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "dataFileName": "Synchronization fails with 504.html", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "Wxt3vVlxlYLi", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi" + ], + "title": "Attachments", + "notePosition": 190, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareHiddenFromTree", + "value": "", + "isInheritable": false, + "position": 10 + } + ], + "format": "html", + "attachments": [], + "dirFileName": "Attachments", + "children": [ + { + "isClone": false, + "noteId": "HEtnpiQrEvjl", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "HEtnpiQrEvjl" + ], + "title": "bookmark-folder.png", + "notePosition": 160, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "bookmark-folder.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "bookmark-folder.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "sag6ww9q4pgW", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "sag6ww9q4pgW" + ], + "title": "bookmarks.gif", + "notePosition": 170, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "bookmarks.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "bookmarks.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "W9yOvDvpsEtR", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "W9yOvDvpsEtR" + ], + "title": "bookmarks.png", + "notePosition": 180, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "bookmarks.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "bookmarks.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "DVJl4l3T8EG2", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "DVJl4l3T8EG2" + ], + "title": "button-script.png", + "notePosition": 190, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "button-script.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "button-script.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "oZfQufNxgrZ9", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "oZfQufNxgrZ9" + ], + "title": "canvas-note-image.png", + "notePosition": 200, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "canvas-note-image.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "canvas-note-image.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "BJpEsPXDjVLh", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "BJpEsPXDjVLh" + ], + "title": "chrome-trilium-web-clipper.png", + "notePosition": 210, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "chrome-trilium-web-clipper.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "chrome-trilium-web-clipper.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "8jgXl1RUGL4H", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "8jgXl1RUGL4H" + ], + "title": "code-note.png", + "notePosition": 230, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "code-note.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "code-note.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "BqvIJUHkWrvH", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "BqvIJUHkWrvH" + ], + "title": "create-clone.gif", + "notePosition": 240, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "create-clone.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "create-clone.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "N6O1qfBGcbFH", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "N6O1qfBGcbFH" + ], + "title": "create-external-link.gif", + "notePosition": 250, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "create-external-link.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "create-external-link.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "dPcRcDZwyGAO", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "dPcRcDZwyGAO" + ], + "title": "create-link-to-note.gif", + "notePosition": 260, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "create-link-to-note.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "create-link-to-note.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "3sCPPL0LEC1S", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "3sCPPL0LEC1S" + ], + "title": "Custom-widget image.png", + "notePosition": 270, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "Custom-widget image.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "Custom-widget image.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "ruEpqTPbi0CT", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "ruEpqTPbi0CT" + ], + "title": "custom-widget-image.png", + "notePosition": 280, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "custom-widget-image.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "custom-widget-image.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "aa84l6zJyAVH", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "aa84l6zJyAVH" + ], + "title": "cut-to-subnote.gif", + "notePosition": 290, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "cut-to-subnote.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "cut-to-subnote.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "zaQnUsJTbvjr", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "zaQnUsJTbvjr" + ], + "title": "dark-theme.png", + "notePosition": 300, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "dark-theme.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "dark-theme.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "sLZ7Bcq9p8E9", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "sLZ7Bcq9p8E9" + ], + "title": "drag-and-drop.gif", + "notePosition": 330, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "drag-and-drop.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "drag-and-drop.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "v8H3fXMFPki0", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "v8H3fXMFPki0" + ], + "title": "error-logs-export-subtree.png", + "notePosition": 350, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "error-logs-export-subtree.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "error-logs-export-subtree.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "zIQ1XGaUbB7i", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "zIQ1XGaUbB7i" + ], + "title": "error-logs-firefox-context-men.png", + "notePosition": 360, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "error-logs-firefox-context-men.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "error-logs-firefox-context.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "1fkGrskxHx5u", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "1fkGrskxHx5u" + ], + "title": "hide-archived.png", + "notePosition": 370, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "hide-archived.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "hide-archived.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "JXFeNgU8Xnp1", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "JXFeNgU8Xnp1" + ], + "title": "home-button.svg", + "notePosition": 380, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/svg+xml", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "home-button.svg", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "home-button.svg", + "attachments": [] + }, + { + "isClone": false, + "noteId": "snfWRIih71MM", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "snfWRIih71MM" + ], + "title": "jump-to.gif", + "notePosition": 390, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "jump-to.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "jump-to.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "e3qPZSsTbUZP", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "e3qPZSsTbUZP" + ], + "title": "markdown-export-note.gif", + "notePosition": 410, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "markdown-export-note.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "markdown-export-note.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "QUqKzK4LHMVA", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "QUqKzK4LHMVA" + ], + "title": "markdown-export-subtree.gif", + "notePosition": 420, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "markdown-export-subtree.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "markdown-export-subtree.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "xMQSqWySvWBZ", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "xMQSqWySvWBZ" + ], + "title": "markdown-file-import.gif", + "notePosition": 430, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "markdown-file-import.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "markdown-file-import.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "Y9mwMwSGAaSb", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "Y9mwMwSGAaSb" + ], + "title": "markdown-inline-import.gif", + "notePosition": 440, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "markdown-inline-import.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "markdown-inline-import.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "1YUO9Ij4XIwE", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "1YUO9Ij4XIwE" + ], + "title": "math.gif", + "notePosition": 450, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "math.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "math.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "fJ7nbsprnKr7", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "fJ7nbsprnKr7" + ], + "title": "mermaid.png", + "notePosition": 460, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "mermaid.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "mermaid.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "TFAiJIXJFfqv", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "TFAiJIXJFfqv" + ], + "title": "mobile-smartphone.png", + "notePosition": 470, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "mobile-smartphone.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "mobile-smartphone.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "fi37V32TNyzm", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "fi37V32TNyzm" + ], + "title": "mobile-tablet.png", + "notePosition": 480, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "mobile-tablet.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "mobile-tablet.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "qL7381ZG0lMK", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "qL7381ZG0lMK" + ], + "title": "move-note-with-keyboard.gif", + "notePosition": 490, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "move-note-with-keyboard.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "move-note-with-keyboard.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "AiBOf1LIykMC", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "AiBOf1LIykMC" + ], + "title": "note-hoisting.gif", + "notePosition": 500, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "note-hoisting.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "note-hoisting.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "iuAfnapzpRCB", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "iuAfnapzpRCB" + ], + "title": "note-icon-change.png", + "notePosition": 510, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "note-icon-change.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "note-icon-change.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "R1L2vUshJD82", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "R1L2vUshJD82" + ], + "title": "note-icon-gallery.png", + "notePosition": 520, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "note-icon-gallery.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "note-icon-gallery.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "mWxLjZrNAoV7", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "mWxLjZrNAoV7" + ], + "title": "note-map.png", + "notePosition": 530, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "note-map.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "note-map.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "MA2uvkVloWXl", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "MA2uvkVloWXl" + ], + "title": "note-revisions.png", + "notePosition": 540, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "note-revisions.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "note-revisions.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "umjOUcnZi4z2", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "umjOUcnZi4z2" + ], + "title": "promoted-attributes-queen.png", + "notePosition": 550, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "promoted-attributes-queen.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "promoted-attributes-queen.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "rxH2Dm1jn6YT", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "rxH2Dm1jn6YT" + ], + "title": "promoted-attributes.png", + "notePosition": 560, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "promoted-attributes.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "promoted-attributes.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "zaUtPWl8NcCt", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "zaUtPWl8NcCt" + ], + "title": "protecting-note.gif", + "notePosition": 570, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "protecting-note.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "protecting-note.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "wpFu8PhUu7e7", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "wpFu8PhUu7e7" + ], + "title": "recent-notes.gif", + "notePosition": 580, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "recent-notes.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "recent-notes.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "EH6qNioOHeyT", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "EH6qNioOHeyT" + ], + "title": "relation-map-dev-process.png", + "notePosition": 590, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "relation-map-dev-process.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "relation-map-dev-process.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "N98UhifxrVpZ", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "N98UhifxrVpZ" + ], + "title": "relation-map-family-demo.gif", + "notePosition": 600, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "relation-map-family-demo.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "relation-map-family-demo.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "xeZPrfi77XPu", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "xeZPrfi77XPu" + ], + "title": "relation-map-family.png", + "notePosition": 610, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "relation-map-family.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "relation-map-family.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "rVtYANyVhE9U", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "rVtYANyVhE9U" + ], + "title": "saved-search-image.gif", + "notePosition": 620, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "saved-search-image.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "saved-search-image.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "VvQ2QZOyZhZZ", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "VvQ2QZOyZhZZ" + ], + "title": "saved-search.gif", + "notePosition": 630, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/gif", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "saved-search.gif", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "saved-search.gif", + "attachments": [] + }, + { + "isClone": false, + "noteId": "V01a3OdC9O06", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "V01a3OdC9O06" + ], + "title": "screenshot.png", + "notePosition": 640, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "screenshot.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "screenshot.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "lCtZz2Z59wPT", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "lCtZz2Z59wPT" + ], + "title": "share-multiple-notes-web.png", + "notePosition": 650, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "share-multiple-notes-web.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "share-multiple-notes-web.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "Ky3qOJJMZ731", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "Ky3qOJJMZ731" + ], + "title": "share-single-note-web.png", + "notePosition": 660, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "share-single-note-web.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "share-single-note-web.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "5GcxcE9fP9xX", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "5GcxcE9fP9xX" + ], + "title": "share-single-note.png", + "notePosition": 670, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "share-single-note.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "share-single-note.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "jEQNvpyaXIWE", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "jEQNvpyaXIWE" + ], + "title": "shared-list.png", + "notePosition": 680, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "shared-list.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "shared-list.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "OFHiQYnGo2rr", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "OFHiQYnGo2rr" + ], + "title": "split.png", + "notePosition": 690, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "split.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "split.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "uVF9DAmAmEWC", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "uVF9DAmAmEWC" + ], + "title": "steel-blue.png", + "notePosition": 710, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "steel-blue.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "steel-blue.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "676Ekdv73T7I", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "676Ekdv73T7I" + ], + "title": "sync-config.png", + "notePosition": 720, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "sync-config.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "sync-config.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "qGTyyKX4TceE", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "qGTyyKX4TceE" + ], + "title": "sync-in-progress.png", + "notePosition": 730, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "sync-in-progress.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "sync-in-progress.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "SDHWNDsB68aJ", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "SDHWNDsB68aJ" + ], + "title": "sync-init.png", + "notePosition": 740, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "sync-init.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "sync-init.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "92KeXdKh3Ca1", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "92KeXdKh3Ca1" + ], + "title": "task-manager.png", + "notePosition": 750, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "task-manager.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "task-manager.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "uuGrYX41lWN0", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "uuGrYX41lWN0" + ], + "title": "template-create-instance-note.png", + "notePosition": 760, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "template-create-instance-note.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "template-create-instance-n.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "Y8kzZ5MSZLCC", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "Y8kzZ5MSZLCC" + ], + "title": "template.png", + "notePosition": 770, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "template.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "template.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "oRWfJLUbb7j7", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "oRWfJLUbb7j7" + ], + "title": "text-notes-formatting-block.png", + "notePosition": 780, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "text-notes-formatting-block.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "text-notes-formatting-bloc.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "FtmPLgGmgZVC", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "FtmPLgGmgZVC" + ], + "title": "text-notes-formatting-inline.png", + "notePosition": 790, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "text-notes-formatting-inline.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "text-notes-formatting-inli.png", + "attachments": [] + }, + { + "isClone": false, + "noteId": "skY4DIE2Iks5", + "notePath": [ + "pOsGYCXsbNQG", + "Wxt3vVlxlYLi", + "skY4DIE2Iks5" + ], + "title": "text-notes-image.png", + "notePosition": 800, + "prefix": null, + "isExpanded": false, + "type": "image", + "mime": "image/png", + "attributes": [ + { + "type": "label", + "name": "originalFileName", + "value": "text-notes-image.png", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "text-notes-image.png", + "attachments": [] + } + ] + } + ] + }, + { + "noImport": true, + "dataFileName": "navigation.html" + }, + { + "noImport": true, + "dataFileName": "index.html" + }, + { + "noImport": true, + "dataFileName": "style.css" + } + ] +} \ No newline at end of file diff --git a/src/public/app/doc_notes/en/User Guide/User Guide.html b/src/public/app/doc_notes/en/User Guide/User Guide.html new file mode 100644 index 000000000..2e335be7f --- /dev/null +++ b/src/public/app/doc_notes/en/User Guide/User Guide.html @@ -0,0 +1,21 @@ + + +
+ + + +The sub-children of this note are automatically synced.
+Trilium offers advanced functionality through Scripts and + Promoted Attributes. To illustrate these features, we've prepared + several showcases available in the demo notes:
+It's important to note that these examples are not natively supported + by Trilium out of the box; instead, they demonstrate what you can build + within Trilium.
+A common pattern in note-taking is that a lot of notes will be centered + around a certain date - e.g. you have some tasks which needs to be done + on a certain date, you have meeting minutes from a certain date, you have + your thoughts etc. and it all revolves around a date on which they occurred. + For this reason, it makes sense to create a certain "day workspace" which + will centralize all those notes relevant for a certain date.
+For this, Trilium provides a concept of "day note". Trilium semi-automatically + generates a single note for each day. Under this note you can save all + those relevant notes.
+Select an existing day note, and the menubar contains a calendar widget. + Select any day to create a note for that day.
+
+
+
This pattern works well also because of Cloning Notes functionality + - note can appear in multiple places in the note tree, so besides appearing + under day note, it can also be categorized into other notes.
+ +
+
+
You can see the structure of day notes appearing under "Journal" note + - there's a note for the whole year 2017, under it, you have "12 - December" + which then contains "18 - Monday". This is our "day note" which contains + some text in its content and also has some child notes (some of them are + from Task manager).
+You can also notice how this day note has promoted attribute "weight" + where you can track your daily weight. This data is then used in Weight tracker.
+ +Trilium provides template functionality, + and it could be used together with day notes.
+You can define one of the following relations on the root of the journal
+ (identified by #calendarRoot
label):
All of these are relations. When Trilium creates a new note for year or
+ month or date, it will take a look at the root and attach a corresponding ~template
relation
+ to the newly created role. Using this, you can e.g. create your daily template
+ with e.g. checkboxes for daily routine etc.
It's possible to customize the title of generated date notes by defining
+ a #datePattern
label on a root calendar note (identified by #calendarRoot
label).
+ Following are possible values:
{dayInMonthPadded} - {weekDay}
day notes are named e.g. "24
+ - Monday"{dayInMonthPadded}: {weekDay3}
day notes are named e.g. "24:
+ Mon"{dayInMonthPadded}: {weekDay2}
day notes are named e.g. "24:
+ Mo"{isoDate} - {weekDay}
day notes are named e.g. "2020-12-24
+ - Monday"{ordinal}
is replaced with the ordinal date (e.g. 1st, 2nd,
+ 3rd) etc.It is also possible to customize the title of generated month notes through
+ the #monthPattern
attribute, much like #datePattern
.
+ The options are:
{monthNumberPadded}
results in a number like 09
for
+ September, and 11
for November{month}
results in the full month name (e.g. September
or October
){shortMonth3}
is replaced with the first 3 letters of the
+ month, e.g. Jan, Feb, etc.{shortMonth4}
is replaced with the first 4 letters of the
+ month, e.g. Sept, Octo, etc.The default is {monthNumberPadded} - {month}
+
Trilium has some special support for day notes in the form of backend Script API - + see e.g. getDayNote() function.
+Day (and year, month) notes are created with a label - e.g. #dateNote="2018-08-16"
this
+ can then be used by other scripts to add new notes to day note etc.
Journal also has relation child:child:child:template=Day template
(see
+ [[attribute inheritance]]) which effectively adds [[template]] to day notes
+ (grand-grand-grand children of Journal).
Task Manager is a promoted attributes and + scriptsshowcase present in the demo notes.
+ +
+
+
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.
+Task Manager also integrates with day notes - + notes are cloned into + day note to both todoDate note and doneDate note (with prefix of + either "TODO" or "DONE").
+ +New tasks are created in the TODO note which has ~child:template
+ relation(see attribute inheritance)
+ pointing to the task template.
Task template defines several promoted attributes -
+ todoDate, doneDate, tags, location. Importantly it also defines ~runOnAttributeChange
relation
+ - event handler which is run on
+ attribute change. This script 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.
There's also "button" note which contains simple script which adds a button + to create new note (task) in the TODO note.
+api.addButtonToToolbar({
+ title: 'New task',
+ icon: 'check',
+ shortcut: 'alt+n',
+ action: async () => {
+ // creating notes is backend (server) responsibility so we need to pass
+ // the control there
+ const taskNoteId = await api.runOnBackend(async () => {
+ 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);
+ }
+});
+ In the demo screenshot above you may notice that TODO tasks are in red + color and DONE tasks are green.
+This is done by having this CSS code note which + defines extra CSS classes:
+span.fancytree-node.todo .fancytree-title {
+ color: red !important;
+}
+
+span.fancytree-node.done .fancytree-title {
+ color: green !important;
+}
+ This code note has #appCss
+ labelwhich is recognized by Trilium on startup and loaded as CSS into
+ the application.
Second part of this functionality is based in event handler described
+ above which assigns #cssClass
label to the task to either "done"
+ or "todo" based on the task status.
+
+
The Weight Tracker
is a Script API showcase
+ present in the demo notes.
By adding weight
as a promoted attribute in
+ the template from which day notes are
+ created, you can aggregate the data and plot weight change over time.
The Weight Tracker
note in the screenshot above is of the type Render Note
.
+ That type of note doesn't have any useful content itself. Instead it is
+ a placeholder where a script can
+ render its output.
Scripts for Render Notes
are defined in a relation called ~renderNote
.
+ In this example, it's the Weight Tracker
's child Implementation
.
+ The Implementation consists of two code notes that
+ contain some HTML and JavaScript respectively, which load all the notes
+ with a weight
attribute and display their values in a chart.
To actually render the chart, we're using a third party library called + chart.jswhich is imported as an attachment, since it's not built into + Trilium.
+ +Here's the content of the script which is placed in a code note of
+ type JS Frontend
:
async function getChartData() {
+ const days = await api.runOnBackend(async () => {
+ 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 && weight) {
+ days.push({ date, weight });
+ }
+ }
+
+ days.sort((a, b) => a.date > b.date ? 1 : -1);
+
+ return days;
+ });
+
+ const datasets = [
+ {
+ label: "Weight (kg)",
+ backgroundColor: 'red',
+ borderColor: 'red',
+ data: days.map(day => day.weight),
+ fill: false,
+ spanGaps: true,
+ datalabels: {
+ display: false
+ }
+ }
+ ];
+
+ return {
+ datasets: datasets,
+ labels: days.map(day => day.date)
+ };
+}
+
+const ctx = $("#canvas")[0].getContext("2d");
+
+new chartjs.Chart(ctx, {
+ type: 'line',
+ data: await getChartData()
+});
+ In the link map of the Weight Tracker
, there is a note called Button
.
+ Open it and delete or comment out its contents. The Weight Tracker
button
+ will disappear after you restart Trilium.
In Trilium, attributes are key-value pairs assigned to notes, providing + additional metadata or functionality. There are two primary types of attributes:
+These attributes play a crucial role in organizing, categorising, and + enhancing the functionality of notes.
+
+
+
Labels in Trilium can be used for a variety of purposes:
+#year=1999
, #genre="sci-fi"
, or #author="Neal Stephenson"
+ Labels are also searchable, enhancing note retrieval.
+ +**disableVersioning**
: Disables automatic versioning, ideal
+ for large, unimportant notes like script libraries**versioningLimit**
: Used to limit the number of revisions
+ for a single note**calendarRoot**
: Marks the note as the root for day notes.
+ Only one note should carry this label**archived**
: Hides notes from default search results and
+ dialogs**excludeFromExport**
: Excludes notes and their subtrees
+ from export operations**run**
: Specifies events to trigger scripts (e.g., frontendStartup
, hourly
)**runAtHour**
: Defines specific hours for scripts to run,
+ used with #run=hourly
+ **disableInclusion**
: Prevents a script from being included
+ in parent script executions**sorted**
: Automatically sorts child notes alphabetically
+ by title**top**
: Keeps the note at the top of its parent's list,
+ useful with sorted
+ **hidePromotedAttributes**
: Hides certain attributes in the
+ note's display**readOnly**
: Sets the note to read-only mode, applicable
+ to text and code notes**autoReadOnlyDisabled**
: Disables automatic read-only mode
+ for large notes**appCss**
: Marks CSS notes used to modify Trilium’s appearance**appTheme**
: Marks full CSS themes available in Trilium's
+ options**cssClass**
: Adds a CSS class to the note's representation
+ in the tree**iconClass**
: Adds a CSS class to the note's icon, useful
+ for distinguishing notes visually. See note icons
+ **pageSize**
: Specifies the number of items per page in note
+ listings**customRequestHandler**
and **customResourceProvider**
:
+ Refer to Custom request handler
+ **widget**
: Marks a note as a custom widget, added to Trilium's
+ component tree**workspace**
and related attributes: See
+ Workspacefor more details**searchHome**
: Specifies the parent for new search notes**inbox**
: Designates a default location for new notes created
+ via the sidebar**sqlConsoleHome**
: Default location for SQL console notes**bookmarked**
and **bookmarkFolder**
:
+ See Bookmarks
+ **shareXXX**
: See Sharing
+ **keyboardShortcut**
: Assigns a keyboard shortcut to open
+ the note**displayRelations**
and **hideRelations**
:
+ Manages the display of note relations**titleTemplate**
: See Default note title
+ **template**
: Makes the note available as a template**toc**
: Controls the visibility of the table of contents**color**
: Defines the color of the note in the tree and
+ links**hideChildrenOverview**
: Hides child notes in the parent
+ note's editor**viewType**
: Sets the view of child notes (grid or list)Relations define connections between notes, similar to links.
+ +runOnNoteCreation
or runOnNoteChange
,
+ which trigger scripts on specific actionstemplate
, renderNote
, widget
,
+ and sharing-related relationsAttributes in Trilium can be "multivalued", meaning multiple attributes + with the same name can coexist.
+ +Special labels create "label/attribute" definitions, enhancing the organization + and management of attributes. For more details, see Promoted attributes.
+ +Trilium supports attribute inheritance, allowing child notes to inherit + attributes from their parents. For more information, see Attribute inheritance.
+In Trilium, attributes can be automatically inherited by child notes if
+ they have the isInheritable
flag set to true
. This
+ means the attribute (a key-value pair) is applied to the note and all its
+ descendants.
The archived
label can be set to be inheritable, allowing you
+ to hide a whole subtree of notes from searches and other dialogs by applying
+ this label at the top level.
Copying inheritance differs from standard inheritance by using a child:
prefix
+ in the attribute name. This prefix causes new child notes to automatically
+ receive specific attributes from the parent note. These attributes are
+ independent of the parent and will persist even if the note is moved elsewhere.
#child:attributeName
+ #child:child:attributeName
, where each child down the hierarchy
+ receives the appropriate attribute.If a parent note has the label #child:exampleAttribute
, all
+ newly created child notes will inherit the #exampleAttribute
label.
+ This can be useful for setting default properties for notes in a specific
+ section.
Attributes can also be inherited from templates. + When a new note is created using a template, it inherits the attributes + defined in that template. This is particularly useful for maintaining consistency + across notes that follow a similar structure or function.
+Promoted attributes are attributes which + are considered important and thus are "promoted" onto the main note UI. + See example below:
+
+
+
You can see the note having kind of form with several fields. Each of + these is just regular attribute, the only difference is that they appear + on the note itself.
+Attributes can be pretty useful since they allow for querying and script + automation etc. but they are also inconveniently hidden. This allows you + to select few of the important ones and push them to the front of the user.
+Now, how do we make attribute to appear on the UI?
+ +Attribute is always name-value pair where both name and value are strings.
+Attribute definition specifies how should this value be interpreted + - is it just string, or is it a date? Should we allow multiple values or + note? And importantly, should we promote the attribute or not?
+
+
+
You can notice tag attribute definition. These "definition" attributes + define how the "value" attributes should behave.
+So there's one attribute for value and one for definition. But notice + how definition attribute is Inheritable, + meaning that it's also applied to all descendant note. So in a way, this + definition is used for the whole subtree while "value" attributes are applied + only for this note.
+ +Some relations always occur in pairs - my favorite example is on the family.
+ If you have a note representing husband and note representing wife, then
+ there might be a relation between those two of isPartnerOf
.
+ This is bidirectional relationship - meaning that if a relation is pointing
+ from husband to wife then there should be always another relation pointing
+ from wife to husband.
Another example is with parent - child relationship. Again these always
+ occur in pairs, but in this case it's not exact same relation - the one
+ going from parent to child might be called isParentOf
and the
+ other one going from child to parent might be called isChildOf
.
Relation definition allows you to specify such "inverse relation" - for
+ the relation you just define you specify which is the inverse relation.
+ Note that in the second example we should have two relation definitions
+ - one for isParentOf
which defines isChildOf
as inverse
+ relation and then second relation definition for isChildOf
which
+ defines isParentOf
as inverse relation.
What this does internally is that whenever we save a relation which has + defined inverse relation, we check that this inverse relation exists on + the relation target note. Similarly, when we delete relation, we also delete + inverse relation on the target note.
+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:
+#isInheritable=false
are inherited
+ by the instance notes, although only inheritable attributes are further
+ inherited by the children of the instance notes.A typical example would be a "Book" template note, which might include:
+
+
+
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.
+To create an instance note through the UI:
+
+
+
For the template to appear in the menu, the template note must have the #template
label.
+ Do not confuse this with the ~template
relation, which links
+ the instance note to the template note. If you use workspaces,
+ you can also mark templates with #workspaceTemplate
to display
+ them only in the workspace.
Templates can also be added or changed after note creation by creating
+ a ~template
relation pointing to the desired template note.
From a visual perspective, templates can define #iconClass
and #cssClass
attributes,
+ allowing all instance notes (e.g., books) to display a specific icon and
+ CSS style.
Explore the concept further in the demo notes, + including examples like the Relation Map, + Task Manager, and Day Notes.
+Additionally, see default note title for
+ creating title templates. Note templates and title templates can be combined
+ by creating a #titleTemplate
for a template note.
For more complex scenarios, it is possible to type in a JavaScript expression + in order to apply the necessary changes.
+To apply a suffix (- suffix
in this example), to the note
+ title:
note.title = note.title + " - suffix";
+ To alter attributes of a note in a bulk action, such as setting the #shareAlias
label
+ to the title of the note:
note.setLabel("shareAlias", note.title)
+ Trilium supports creating "code" notes, i.e. notes which contain some + sort of formal code - be it programming language (C++, JavaScript), structured + data (JSON, XML) or other types of codes (CSS etc.).
+This can be useful for a few things:
+
+
+
Trilium supports syntax highlighting for many languages, but by default + displays only some of them (to reduce the number of items). You can add + extra languages in Options -> Code notes.
+ +An alternative to the code note is a "code block" - feature of a text + note which can add short snippets of code to the text editor. Starting + with TriliumNext v0.90.12, the code blocks also support syntax highlighting.
+
+
+
It's possible to create custom widget in three possible locations where + you can display your custom content.
+Positions are:
+left-pane
+ center-pane
+ note-detail-pane
- located within center-pane
,
+ but specific to note (split)right-pane
+ Create a code note of type JS frontend and give it a **#widget**
label.
/*
+ * This defines a custom widget which displays number of words and characters in a current text note.
+ * To be activated for a given note, add label 'wordCount' to the note, you can also make it inheritable and thus activate it for the whole subtree.
+ *
+ * See it in action in "Books" and its subtree.
+ */
+const TPL = `
+ Word count:
+
+
+
+
+ Character count:
+
+`;
+
+class WordCountWidget extends api.NoteContextAwareWidget {
+ static get parentWidget() { return 'center-pane'; }
+
+ get position() { return 100; } // higher value means position towards the bottom/right
+
+ isEnabled() {
+ return super.isEnabled()
+ && this.note.type === 'text'
+ && this.note.hasLabel('wordCount');
+ }
+
+ doRender() {
+ this.$widget = $(TPL);
+ this.$wordCount = this.$widget.find('.word-count');
+ this.$characterCount = this.$widget.find('.character-count');
+ return this.$widget;
+ }
+
+ async refreshWithNote(note) {
+ const {content} = await note.getNoteComplement();
+
+ const text = $(content).text(); // get plain text only
+
+ const counts = this.getCounts(text);
+
+ this.$wordCount.text(counts.words);
+ this.$characterCount.text(counts.characters);
+ }
+
+ getCounts(text) {
+ const chunks = text
+ .split(/[\s-+:,/\\]+/)
+ .filter(chunk => chunk !== '');
+
+ let words;
+
+ if (chunks.length === 1 && chunks[0] === '') {
+ words = 0;
+ }
+ else {
+ words = chunks.length;
+ }
+
+ const characters = chunks.join('').length;
+
+ return {words, characters};
+ }
+
+ async entitiesReloadedEvent({loadResults}) {
+ if (loadResults.isNoteContentReloaded(this.noteId)) {
+ this.refresh();
+ }
+ }
+}
+
+module.exports = WordCountWidget;
+ After you make changes it is necessary to restart Trilium so that the + layout can be rebuilt.
+ +On the bottom you can see the resulting widget:
+
+
+
Script notes can be triggered by events. Note + that these are backend events and thus relation need to point to the "JS + backend" code note.
+ +Global events are attached to the script note via label. Simply create + e.g. "run" label with some of these values and script note will be executed + once the event occurs.
+run
+ frontendStartup
- executes on frontend upon startupmobileStartup
- executes on mobile frontend upon startupbackendStartup
- executes on backend upon startuphourly
- executes once an hour on backenddaily
- executes once a day on backendOther events are bound to some entity, these are defined as relations - + meaning that script is triggered only if note has this script attached + to it through relations (or it can inherit it).
+runOnNoteCreation
- executes when note is created on backendrunOnNoteTitleChange
- executes when note title is changed
+ (includes note creation as well)runOnNoteContentChange
- executes when note content is changed
+ (includes note creation as well).runOnNoteChange
- executes when note is changed (includes
+ note creation as well)runOnNoteDeletion
- executes when note is being deletedrunOnBranchCreation
- executes when a branch is created. Branch
+ is a link between parent note and child note and is created e.g. when cloning
+ or moving note.runOnBranchChange
(since v0.62) - executes when a branch is
+ changed - either expanded status or prefix are changed.runOnBranchDeletion
- executes when a branch is delete. Branch
+ is a link between parent note and child note and is deleted e.g. when moving
+ note (old branch/link is deleted).runOnChildNoteCreation
- executes when new note is created
+ under this noterunOnAttributeCreation
- executes when new attribute is created
+ under this noterunOnAttributeChange
- executes when attribute is changed
+ under this noteTrilium offers a "Script API" that enables scripts to perform various + useful functions. There are two main APIs available:
+Please note that the Script API is currently experimental and may undergo + changes in future updates.
+Trilium supports creating code notes, + i.e. notes which allow you to store some programming code and highlight + it. Special case is JavaScript code notes which can also be executed inside + Trilium which can in conjunction with Script API provide + extra functionality.
+ +To go further I must explain basic architecture of Trilium - in its essence + it is a classic web application - it has these two main components:
+So we have frontend and backend, each with their own set of responsibilities, + but their common feature is that they both run JavaScript code. Add to + this the fact, that we're able to create JavaScript [[code notes]] and + we're onto something.
+ +Let's take a look at our demo script (shipped with default Trilium database) + - Task manager. One of the things this script does is adding a button to + the Trilium interface which will allow user to easily add new Task (TODO + item).
+
+
+
First take a look at the red circle all the way on the top - this what + we want to achieve - new button in UI which will create new note representing + a task/todo item.
+Red point below the first one marks the note type we have created for + this script - it's "JavaScript frontend". It's frontend because adding + button to UI is clearly frontend responsibility.
+In the note content you can see the code which calls one of the API methods, + this one is specifically meant to add new buttons. Code needs to set few + button properties:
+Saving the note to the database is backend's responsibility, so we immediately + pass control to the backend and ask it to create a note. Once this is done, + we show the newly created note so that the user can set the task title + and maybe some attributes.
+ +So we have a script which will add the button to the toolbar. But how + can we execute it? One possibility is to click on "play" icon (marked by + red circle). The problem with this is that this UI change is time bound + by Trilium runtime so when we restart Trilium, button won't be there.
+We need to execute it every time Trilium starts up, but we probably don't + want to have to manually click on play button on every start up.
+The solution is marked by red circle at the bottom - this note has label #run=frontendStartup
-
+ this is one of the "system" labels which Trilium understands. As you might
+ guess, this will cause all such labeled script notes to be executed once
+ Trilium frontend starts up.
(#run=frontendStartup
does not work for Mobile frontend -
+ if you want to have scripts running there, give the script #run=mobileStartup
label)
You can see more scripting with explanation in Advanced showcases +
+ +See Events.
+ +See Script API.
+Trilium supports configuration via a file named config.ini
and
+ environment variables. Please review the file named config-sample.ini in
+ the Notes repository to
+ see what values are supported.
You can provide the same values via environment variables instead of the config.ini
file,
+ and these environment variables use the following format:
TRILIUM_
and
+ use underscores to represent the INI section structure.TRILIUM_<SECTION>_<KEY>=<VALUE>
+ For example, if you have this in your config.ini:
+[Network]
+host=localhost
+port=8080
+ You can override these values using environment variables:
+TRILIUM_NETWORK_HOST=0.0.0.0
+TRILIUM_NETWORK_PORT=9000
+ The code will:
+config.ini
file as beforeTRILIUM_
+ Trilium provides a mechanism for scripts to
+ open a public REST endpoint. This opens a way for various integrations
+ with other services - a simple example would be creating new note from
+ Slack by issuing a slash command (e.g. /trilium buy milk
).
Let's take a look at an example. The goal is to provide a REST endpoint + to which we can send title and content and Trilium will create a note.
+We'll start with creating a JavaScript backend code note containing:
+const {req, res} = api;
+const {secret, title, content} = req.body;
+
+if (req.method == 'POST' && secret === 'secret-password') {
+ // notes must be saved somewhere in the tree hierarchy specified by a parent note.
+ // This is defined by a relation from this code note to the "target" parent note
+ // alternetively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note)
+ const targetParentNoteId = api.currentNote.getRelationValue('targetNote');
+
+ const {note} = api.createTextNote(targetParentNoteId, title, content);
+ const notePojo = note.getPojo();
+
+ res.status(201).json(notePojo);
+}
+else {
+ res.send(400);
+}
+ This script note has also following two attributes:
+#customRequestHandler
with value create-note
+ ~targetNote
pointing to a note where new notes should
+ be savedLet's test this by using an HTTP client to send a request:
+POST http://my.trilium.org/custom/create-note
+Content-Type: application/json
+
+{
+ "secret": "secret-password",
+ "title": "hello",
+ "content": "world"
+}+++++++++++++++++++++++++++++++++++++++++++++++
+ Notice the /custom
part in the request path - Trilium considers
+ any request with this prefix as "custom" and tries to find a matching handler
+ by looking at all notes which have customRequestHandler
label.
+ Value of this label then contains a regular expression which will match
+ the request path (in our case trivial regex "create-note").
Trilium will then find our code note created above and execute it. api.req
, api.res
are
+ set to request and
+ responseobjects from which we can get details of the request and also
+ respond.
In the code note we check the request method and then use trivial authentication + - keep in mind that these endpoints are by default totally unauthenticated, + and you need to take care of this yourself.
+Once we pass these checks we will just create the desired note using + Script API.
+ +Another common use case is that you want to just expose a file note -
+ in such case you create label customResourceProvider
(value
+ is again path regex).
For more information, see Custom Resource Providers.
+ +api.req
and api.res
are Express.js objects - you
+ can always look into its documentation for
+ details.
REST request paths often contain parameters in the URL, e.g.:
+http://my.trilium.org/custom/notes/123
+ The last part is dynamic so the matching of the URL must also be dynamic
+ - for this reason the matching is done with regular expressions. Following customRequestHandler
value
+ would match it:
notes/([0-9]+)
+ Additionally, this also defines a matching group with the use of parenthesis
+ which then makes it easier to extract the value. The matched groups are
+ available in api.pathParams
:
const noteId = api.pathParams[0];
+ Often you also need query params (as in e.g. http://my.trilium.org/custom/notes?noteId=123
),
+ you can get those with standard express req.query.noteId
.
A custom resource provider allows any file imported into Trilium (images, + fonts, stylesheets) to be publicly accessible via a URL.
+A potential use case for this is to add embed a custom font alongside + a theme.
+ +#customResourceProvider=hello
.<protocol>://<host>/custom/hello
(where <protocol>
is
+ either http
or https
based on your setup, and <host>
is
+ the host or IP to your Trilium server instance). If you are running the
+ TriliumNext application without a server, use http://localhost:37840
as
+ the base URL.Instead of hello
, the name can be:
fonts/Roboto.ttf
, which would be accessible
+ via <host>/custom/fonts/Roboto.ttf
.hello/.*
which will be accessible via /custom/hello/1
, /custom/hello/2
, /custom/hello/world
,
+ etc.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 #customResourceProvider=fonts/myfont.ttf
attribute.
Then modify the theme CSS to point to:
+@font-face {
+ font-family: customFont;
+ src: url("/custom/fonts/myfont.ttf");
+}
+
+div {
+ font-family: customFont;
+}
+ Your Trilium data is stored in a SQLite database
+ which contains all notes, tree structure, metadata, and most of the configuration.
+ The database file is named document.db
and is stored in the
+ application's default Data directory.
When you run Trilium for the first time, it will generate a new database + containing demo notes. These notes showcase its many features, such as:
+There are some cases in which you may want to restore the original demo + notes. For example, if you experimented with some of the more advanced + features and want to see the original reference, or if you simply want + to explore the latest version of the demo notes, which might showcase new + features.
+You can easily restore the demo notes by using Trilium's built-in import + feature by importing them:
+Trilium provides a lot of flexibility, and with it, opportunities for + advanced users to tweak it. If you need to explore or modify the database + directly, you can use a tool such as SQLite Browser to + work directly on the database file.
+See Manually altering the database for + more information.
+ +If you are experimenting with Trilium and want to return it to its original + state, you can do that by deleting the current database. When you restart + the application, it will generate a new database containing the original + demo notes.
+To delete the database, simply go to the data directory and
+ delete the document.db
file (and any other files starting with document.db
).
If you do not need to preserve any configurations that might be stored
+ in the config.ini
file, you can just delete all of the data directory's contents
+ to fully restore the application to its original state. You can also review
+ the configuration file
+ to provide all config.ini
values as environment variables instead.
There are some situations where modifying the SQLite database that Trilium + uses is desirable.
+If you are doing any advanced development or troubleshooting where you
+ manually modify the database, you might want to consider creating backups
+ of your document.db
file.
The SQL Console is Trilium's built-in database editor.
+See SQL Console.
+ +Sometimes the SQL Console cannot be used (for example if the application + cannot start).
+When making external modifications, consider closing the desktop application. + If modifying the server database, then stop the service or Docker container.
+ +DB Browser for SQLite is a cross-platform editor that can be used to alter + the database using a graphical user interface.
+To do so:
+
+
+
First, start the SQLite 3 CLI by specifying the path to the database:
+sqlite3 ~/.local/share/trilium-data/document.db
+ ;
character..quit
and enter.The SQL Console is Trilium's built-in database editor.
+It can be accessed by going to the global menu → + Advanced → Open SQL Console.
+
+
+
Hovering the mouse over one of the tables listed at the top of the document + will show the columns and their data type.
+Only one SQL statement can be run at once.
+To run the statement, press the
+ icon.
For queries that return a result, the data will displayed in a table.
+
+
+
SQL queries or commands can be saved into a dedicated note.
+To do so, simply write the query and press the
+ button. Once saved, the note will appear in Day Notes.
When a new note is created, its name is by default "new note". In some + cases, it can be desirable to have a different or even a dynamic default + note title.
+For this use case, Trilium (since v0.52) supports #titleTemplate
+ label. You can create such a label for a given note, assign it a value,
+ and this value will be used as a default title when creating child notes.
+ As with other labels, you can make it inheritable to apply recursively,
+ and you can even place it on the root note to have it applied globally
+ everywhere.
As an example use case, imagine you collect books you've read in a given + year like this:
+Now, to the parent note "2022 Books" you can assign label #titleTemplate="[Author name]: [Book title], [Publication year]"
.
And all children of "2022 Books" will be created with initial title "[Author + name]: [Book title], [Publication year]". There's no artificial intelligence + here, the idea is to just prompt you to manually fill in the pieces of + information into the note title by yourself.
+ +The value of #titleTemplate
is evaluated at the point of note's
+ creation as a JavaScript string, which means it can be enriched with the
+ help of JS string interpolation with dynamic data.
As an example, imagine you collect server outage incidents and write some + notes. It looks like this:
+You can automatize the date assignment by assigning a label #titleTemplate="${now.format('YYYY-MM-DD')}: "
to
+ the parent note "Incidents". Whenever a new child note is created, the
+ title template is evaluated with the injected now object.
Second variable injected is parentNote,
+ an example could be #titleTemplate="${parentNote.getLabelValue('authorName')}'s literary works"
.
See also [[template]] which provides + similar capabilities, including default note's content.
+ETAPI is Trilium's public/external REST API. It is available since Trilium + v0.50.
+The documentation is in OpenAPI format, available here.
+trilium-py is a third-party + Python implementation for ETAPI client, you can use Python to communicate + with Trilium.
+ +All operations have to be authenticated using a token. You can get this
+ token either from Options -> ETAPI or programmatically using the /auth/login
REST
+ call (see the spec):
GET https://myserver.com/etapi/app-info
+Authorization: ETAPITOKEN
+ Alternatively, since 0.56 you can also use basic auth format:
+GET https://myserver.com/etapi/app-info
+Authorization: Basic BATOKEN
+ BATOKEN = BASE64(username + ':' + password)
- this is
+ a standard Basic Auth serializationusername
is "etapi"password
is the generated ETAPI token described above.Basic Auth is meant to be used with tools which support only basic auth.
+Note map is a visualisation of connections between notes.
+This provides an insight into a structure ("web") of notes.
+There are two types of note map:
+ +Shows relations between notes:
+
+
+
Shows hierarchical map of notes:
+
+
+
Relation map is a similar concept, with + some differences:
+Relation map is a type of note which + visualizes notes and their relations. See + an example:
+ +This is a basic example how you can create simple diagram using relation + maps:
+
+
+
And this is how you can create it:
+
+
+
We start completely from scratch by first creating new note called "Development + process" and changing its type to "Relation map". After that we create + new notes one by one and place them by clicking into the map. We also drag + relationsbetween notes and name them. That's all!
+Items on the map - "Specification", "Development", "Testing" and "Demo" + are actually notes which have been created under "Development process" + note - you can click on them and write some content. Connections between + notes are called "relations".
+ +This is more complicated demo using some advanced concepts. Resulting + diagram is here:
+
+
+
This is how you get to it:
+
+
+
There are several steps here:
+Relation definitions mentioned above come from "Person template" note + which is assigned to any child of "My Family Tree" relation note. You can + play with the whole thing in the demo notes.
+ +You can specify which relations should be displayed with comma delimited
+ names of relations in displayRelations
label.
Alternatively, you can specify comma delimited list of relation names
+ in hideRelations
which will display all relations, except for
+ the ones defined in the label.
Trilium allows you to share selected notes as publicly accessible read-only + documents. This feature is particularly useful for publishing content directly + from your Trilium notes, making it accessible to others online.
+ +To use the sharing feature, you must have a server installation of + Trilium. This is necessary because the notes will be hosted from the server.
+ +Enable Sharing: To share a note, toggle the Shared
switch
+ within the note's interface. Once sharing is enabled, an URL will appear,
+ which you can click to access the shared note.
+
+
Access the Shared Note: 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 localhost (127.0.0.1)
.
+
+
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.
+
+
+
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.
+ +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.
+ +To protect shared notes with a username and password, you can use the #shareCredentials
attribute.
+ Add this label to the note with the format #shareCredentials="username:password"
.
+ To protect an entire subtree, make sure the label is inheritable.
The default shared page is basic in design, but you can customize it using + your own CSS:
+~shareCss
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 #shareHiddenFromTree
label.#shareOmitDefaultCss
label to avoid conflicts with Trilium's
+ default stylesheet.You can inject custom JavaScript into the shared note using the ~shareJs
relation.
+ This allows you to access note attributes or traverse the note tree using
+ the fetchNote()
API, which retrieves note data based on its
+ ID.
Example:
+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);
+}
+ Shared notes typically have URLs like http://domain.tld/share/knvU8aJy4dJ7
,
+ where the last part is the note's ID. You can make these URLs more user-friendly
+ by adding the #shareAlias
label to individual notes (e.g., #shareAlias=highlighting
).
+ This will change the URL to http://domain.tld/share/highlighting
.
Important:
+/
) within aliases to create subpaths is not
+ supported.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.
+
+
+
To customize the favicon for your shared pages, create a relation ~shareFavicon
pointing
+ to a file note containing the favicon (e.g., in .ico
format).
You can designate a specific note or folder as the root of your shared
+ content by adding the #shareRoot
label. This note will be linked
+ when visiting [http://domain.tld/share](http://domain/share)
,
+ making it easier to use Trilium as a fully-fledged website. Consider combining
+ this with the #shareIndex
label, which will display a list of
+ all shared notes.
#shareRaw
label
+ to share a note without any HTML wrapper.#shareDisallowRobotIndexing
label
+ to prevent search engines from indexing the shared page by including a noindex, follow
meta
+ tag and X-Robots-Tag: noindex
header.#shareIndex
label,
+ the content will display a list of all shared note roots.While the sharing feature is powerful, it has some limitations:
+Some of these limitations may be addressed in future updates.
+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.
+A note displayed as a web page (HTML) | +A note displayed as a raw format | +
---|---|
+ ![]() |
+
+ ![]() |
+
Simply add the #shareRaw
attribute and the note will always
+ be rendered raw when accessed from the share URL.
Append ?raw
to the URL to display a note in its raw format
+ regardless of whether the #shareRaw
attribute is added on the
+ note.
+
+
Trilium can import ENEX files which are used by Evernote for backup/export. + One ENEX file represents content (notes and resources) of one notebook.
+ +To export ENEX file, you need to have a legacy desktop version + of Evernote (i.e. not web/mobile). Right click on notebook and select export + and follow the wizard.
+ +Once you have ENEX file, you can import it to Trilium. Right click on + some note (to which you want to import the file), click on "Import" and + select the ENEX file.
+After importing the ENEX file, go over the imported notes and resources + to be sure the import went well, and you didn't lose any data.
+ +All resources (except for images) are created as note's attachments.
+HTML inside ENEX files is not exactly valid so some formatting maybe broken + or lost. You can report major problems into Trilium issue tracker. + %%{WARNING}%%
+Trilium Notes supports importing Markdown restricted to the CommonMark specification (where + tables are not supported)
+ +If you want to import just a chunk of markdown from clipboard, you can + do it from editor block menu:
+
+
+
You can also import Markdown files from files:
+[[gifs/markdown-file-import.gif]]
+
+
+
You can export whole subtree to ZIP archive which will have directory + structured modelled after subtree structure:
+
+
+
If you want to export just single note without its subtree, you can do + it from Note actions menu:
+
+
+
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.
+This page describes a method to migrate via EverNote Legacy, but this app is no longer available/working. +
+ +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
+ +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:
+Find (using regex): .<div.*><h1
Replace with: <h1
+
This is supposed to be a complete list of keyboard shortcuts. Note that + some of these may work only in certain contexts (e.g. in tree pane or note + editor).
+It is also possible to configure most keyboard shortcuts in Options ->
+ Keyboard shortcuts. Using global:
prefix, you can assign a shortcut
+ which will work even without Trilium being in focus (requires app restart
+ to take effect).
UP
, DOWN
- go up/down in the list of notes, CTRL-SHIFT-UP
and CTRL-SHIFT-DOWN
work
+ also from editorLEFT
, RIGHT
- collapse/expand nodeALT+LEFT
, ALT+RIGHT
- go back / forwards in the
+ historyCTRL+J
- show "Jump to" dialog
+ CTRL+.
- scroll to current note (useful when you scroll away
+ from your note or your focus is currently in the editor)BACKSPACE
- jumps to parent noteALT+C
- collapse whole note treeALT+-
(alt with minus sign) - collapse subtree (if some subtree
+ takes too much space on tree pane you can collapse it)#keyboardShortcut
with
+ e.g. value Ctrl+I
. Pressing this keyboard combination will
+ then bring you to the note on which it is defined. Note that Trilium must
+ be reloaded/restarted (Ctrl+R) for changes to be in effect.See demo of some of these features in note navigation.
+ +CTRL+click
- (or middle mouse click) on note link opens note
+ in a new tabOnly in desktop (electron build):
+CTRL+T
- opens empty tabCTRL+W
- closes active tabCTRL+Tab
- activates next tabCTRL+Shift+Tab
- activates previous tabCTRL+O
- creates new note after the current noteCTRL+P
- creates new sub-note into current noteF2
- edit prefix of
+ current note cloneCTRL+UP
, CTRL+DOWN
- move note up/down in the
+ note listCTRL+LEFT
- move note up in the note treeCTRL+RIGHT
- move note down in the note treeSHIFT+UP
, SHIFT+DOWN
- multi-select note above/belowCTRL+A
- select all notes in the current levelSHIFT+click
- multi select note which you clicked onCTRL+C
- copies current note (or current selection) into clipboard
+ (used for cloning
+ CTRL+X
- cuts current (or current selection) note into clipboard
+ (used for moving notes)CTRL+V
- pastes note(s) as sub-note into current note (which
+ is either move or clone depending on whether it was copied or cut into
+ clipboard)DEL
- delete note / sub-treeTrilium uses CKEditor 5 for the text notes and + CodeMirror 5 for code notes. + Check the documentation of these projects to see all their built-in keyboard + shortcuts.
+ALT-F10
- bring up inline formatting toolbar (arrow keys <-
,->
to
+ navigate, ENTER
to apply)ALT-F10
- again to bring up block formatting toolbarENTER
in tree pane switches from tree pane into note title.
+ Enter from note title switches focus to text editor. CTRL+.
switches
+ back from editor to tree pane.CTRL+K
- create / edit external link
+ CTRL+L
- create internal (note) link
+ ALT+T
- inserts current date and time at caret positionCTRL+.
- jump away from the editor to tree pane and scroll
+ to current noteThese are hooked in Electron to be similar to native browser keyboard + shortcuts.
+F5
, CTRL-R
- reloads trilium frontendCTRL+SHIFT+I
- show developer toolsCTRL+F
- show search dialogCTRL+-
- zoom outCTRL+=
- zoom inALT+O
- show SQL console (use only if you know what you're
+ doing)ALT+M
- distraction-free mode - display only note editor,
+ everything else is hiddenF11
- toggle full screenCTRL+S
- toggle search form
+ in tree paneALT+A
- show note attributes dialogTo easily access selected notes, you can bookmark them. See demo:
+
+
+
Space in the left panel is limited, and you might want to bookmark many + items. One possible solution is to bookmark a folder, so it shows its children:
+
+
+
To do this, you need to add a #bookmarkFolder
label to the
+ note.
Hoisting is a standard outliner feature which allows you to focus on (or + "zoom into") a specific note and its subtree by hiding all parent and sibling + notes. Demo:
+
+
+
In addition to showing only this subtree, this also narrows both full + text search and “jump to note” to just + notes present in hoisted subtree.
+See also Workspace which extends this feature.
+One of the Trilium's goals is to provide fast and comfortable navigation + between notes.
+ +You can use alt-left and alt-right to move back and forward in history + of viewed pages.
+This works identically to browser backwards / forwards, it's actually + using built-in browser support for this.
+
+
+
This is useful to quickly find and view arbitrary note - click on Jump to
button
+ on the top or press CTRL-J
. Then type part of the note name
+ and autocomplete will help you pick the desired note.
+
+
Jump to note also has the ability to show the list of recently viewed + / edited notes and quickly jump to it.
+To access this functionality, click on Jump to
button on the
+ top. By default, (when nothing is entered into autocomplete), this dialog
+ will show the list of recent notes.
Alternatively you can click on the "time" icon on the right.
+
+
+
Local search allows you to search within the currently displayed note. + To initiate a local search, press CTRL-F. If using a web browser, this + will be handled by the browser's native search functionality. In the desktop + (electron) version, a separate dialog will apear.
+ +Note search enables you to find notes by searching for text in the title, + content, or attributes of + the notes. You also have the option to save your searches, which will create + a special search note which is visible on your navigation tree and contains + the search results as sub-items.
+To search for notes, click on the magnifying glass icon on the toolbar
+ or press the CTRL-S
keyboard shortcut.
rings tolkien
: Full-text search to find notes containing
+ both "rings" and "tolkien"."The Lord of the Rings" Tolkien
: Full-text search where "The
+ Lord of the Rings" must match exactly.note.content *=* rings OR note.content *=* tolkien
: Find
+ notes containing "rings" or "tolkien" in their content.towers #book
: Combine full-text and attribute search to find
+ notes containing "towers" and having the "book" label.towers #book or #author
: Search for notes containing "towers"
+ and having either the "book" or "author" label.towers #!book
: Search for notes containing "towers" and not
+ having the "book" label.#book #publicationYear = 1954
: Find notes with the "book"
+ label and "publicationYear" set to 1954.#genre *=* fan
: Find notes with the "genre" label containing
+ the substring "fan". Additional operators include *=*
for "contains", =*
for
+ "starts with", *=
for "ends with", and !=
for "is
+ not equal to".#book #publicationYear >= 1950 #publicationYear < 1960
:
+ Use numeric operators to find all books published in the 1950s.#dateNote >= TODAY-30
: A "smart search" to find notes
+ with the "dateNote" label within the last 30 days. Supported smart values
+ include NOW +- seconds, TODAY +- days, MONTH +- months, YEAR +- years.~author.title *=* Tolkien
: Find notes related to an author
+ whose title contains "Tolkien".#publicationYear %= '19[0-9]{2}'
: Use the '%=' operator to
+ match a regular expression (regex). This feature has been available since
+ Trilium 0.52.~author.relations.son.title = 'Christopher Tolkien'
: Search
+ for notes with an "author" relation to a note that has a "son" relation
+ to "Christopher Tolkien". This can be modeled with the following note structure:
+ ~author.title *= Tolkien OR (#publicationDate >= 1954 AND #publicationDate <= 1960)
:
+ Use boolean expressions and parentheses to group expressions. Note that
+ expressions starting with a parenthesis need an "expression separator sign"
+ (# or ~) prepended.note.parents.title = 'Books'
: Find notes with a parent named
+ "Books".note.parents.parents.title = 'Books'
: Find notes with a grandparent
+ named "Books".note.ancestors.title = 'Books'
: Find notes with an ancestor
+ named "Books".note.children.title = 'sub-note'
: Find notes with a child
+ named "sub-note".Notes have properties that can be used in searches, such as noteId
, dateModified
, dateCreated
, isProtected
, type
, title
, text
, content
, rawContent
, ownedLabelCount
, labelCount
, ownedRelationCount
, relationCount
, ownedRelationCountIncludingLinks
, relationCountIncludingLinks
, ownedAttributeCount
, attributeCount
, targetRelationCount
, targetRelationCountIncludingLinks
, parentCount
, childrenCount
, isArchived
, contentSize
, noteSize
,
+ and revisionCount
.
These properties can be accessed via the note.
prefix, e.g., note.type = code AND note.mime = 'application/json'
.
#author=Tolkien orderBy #publicationDate desc, note.title limit 10
+ This example will:
+publicationDate
in descending order.note.title
as a secondary ordering if publication dates
+ are equal.Some queries can only be expressed with negation:
+#book AND not(note.ancestor.title = 'Tolkien')
+ This query finds all book notes not in the "Tolkien" subtree.
+ +The "full" syntax for searching by labels is:
+note.labels.publicationYear = 1954
+ For relations:
+note.relations.author.title *=* Tolkien
+ However, common label and relation searches have shortcut syntax:
+#publicationYear = 1954
+#author.title *=* Tolkien
+ Search syntax allows combining full-text search with attribute-based search
+ seamlessly. For example, tolkien #book
contains:
tolkien
+ #book
+ Trilium detects the separation between full text search and attribute/property + search by looking for certain special characters or words that denote attributes + and properties (e.g., #, ~, note.). If you need to include these in full-text + search, escape them with a backslash so they are processed as regular text:
+"note.txt"
+\#hash
+#myLabel = 'Say "Hello World"'
+ Special characters can be enclosed in quotes or escaped with a backslash + to be used in full-text search:
+"note.txt"
+\#hash
+#myLabel = 'Say "Hello World"'
+ Three types of quotes are supported: single, double, and backtick.
+ +Label values are technically strings but can be coerced for numeric comparisons:
+note.dateCreated =* '2019-05'
+ This finds notes created in May 2019. Numeric operators like #publicationYear >= 1960
convert
+ string values to numbers for comparison.
You can open Trilium and automatically trigger a search by including the + search url encoded string + in the URL:
+http://localhost:8080/#?searchString=abc
+
This page explains the basic concepts related to the tree structure of + notes in TriliumNext.
+ +A note is the central entity in TriliumNext. For more details, see Note.
+ +A branch describes the placement of a note within the note tree. Essentially,
+ it is a tuple of parentNoteId
and noteId
, indicating
+ that the given note is placed as a child under the specified parent note.
Each note can have multiple branches, meaning any note can be placed in + multiple locations within the tree. This concept is referred to as " + cloning."
+ +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.
+To edit a prefix, right-click on the note in the tree pane and select + "Edit branch prefix."
+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.
+ +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.
+This page explains how to manipulate the note tree in TriliumNext, focusing + on moving notes.
+ +
+ You can easily rearrange the note tree by dragging and dropping notes,
+ as demonstrated in the example above.
+ Trilium offers efficient keyboard-based manipulation using the following
+ shortcuts:
CTRL-UP
and CTRL-DOWN
: Move the note up or down
+ in the order.CTRL-LEFT
: Move the note up in the hierarchy by changing
+ its parent to the note's grandparent.CTRL-RIGHT
: 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).LEFT
and RIGHT
: Expand and collapse a sub-tree.You can also move notes using the familiar cut and paste functions available
+ in the context menu, or with the associated keyboard shortcuts: CTRL-C
(
+ copy), CTRL-X
(cut) and CTRL-V
(paste).
Workspace is a concept built up on top of note hoisting. + 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.
+So far workspace consists of these features:
+note hoisting - you can "zoom" into + a workspace subtree to focus only on the relevant notes
+easy entering of workspace:
+
+
+
visual identification of workspace in tabs:
+
+
+
Let's say you have identified the workspaces and their subtrees. Define + on the root of this subtree following labels:
+#workspace
- Marks this note as a workspace, button to enter
+ the workspace is controlled by this#workspaceIconClass
- controls the box icon to be displayed
+ in the tree and tabs, example bx bx-home
. See https://boxicons.com/
+ #workspaceTabBackgroundColor
- Background color of the tab,
+ use any CSS color format, e.g. "lightblue" or "#ddd". See https://www.w3schools.com/cssref/css_colors.asp.#workspaceCalendarRoot
- 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.#workspaceTemplate
- 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.Note is a central entity in Trilium. Main attributes of note are title + and content.
+ +In Trilium there's no specific "folder" note type. Any note can have children + and thus be a folder.
+ +There's one special note called "root note" which is root of the note + tree. All other notes are placed below it in the structure.
+ +Importantly, note itself doesn't carry information on its placement in + note tree. See cloning for details.
+Tree structure of notes can resemble file system - but compared to that + notes in Trilium can act as both file and directory - meaning that note + can both have its own content and have children. "Leaf note" is a note + which doesn't have any children.
+ +When you delete a note in Trilium, it is actually only marked for deletion + (soft-delete) - the actual content, title, attributes etc. are not deleted, + only hidden.
+Within (by default) 7 days, it is possible to undelete these soft-deleted + notes - open Recent Changes dialog, and you will see a list of all modified + notes including the deleted ones. Notes available for undeletion have a + link to do so. This is kind of "trash can" functionality known from e.g. + Windows.
+Clicking an undelete will recover the note, it's content and attributes + - note should be just as before being deleted. This action will also undelete + note's children which have been deleted in the same action.
+To be able to undelete a note, it is necessary that deleted note's parent + must be undeleted (otherwise there's no place where we can undelete it + to). This might become a problem when you delete more notes in succession + - the solution is then undelete in the reverse order of your deletion.
+After the 7 days (configurable) the notes will be "erased" - their title, + content, revisions and attributes will be erased, and it will not be possible + anymore to recover them (unless you restore backup).
+ +Archived notes are notes which have archived
attribute -
+ either directly or inherited.
Such notes are then by default not shown in the autocomplete and in the + full text search.
+This can be useful for notes which are no longer very useful but still + valuable enough to keep around without them getting too much in the way.
+You can control whether archived notes are displayed in the note tree + with a setting:
+
+
+
A note in Trilium can own one or more + attachments, which can be either images or files. These attachments can + be displayed or linked within the note that owns them.
+This can be especially useful to include dependencies for your scripts. + The Weight Tracker shows + how to use chartjs which is attached to + the script note.
+Each note exclusively owns its attachments, meaning attachments cannot + be shared or linked from one note to another. If an attachment link is + copied to a different note, the attachment itself is duplicated, and the + copies are managed independently thereafter.
+Attachments, especially image files, are the recommended method for embedding + visuals in notes. It is important to link image attachments within the + text of the owning note; otherwise, they will be automatically deleted + after a configurable timeout period if not referenced.
+Trilium's core feature is the ability to structure your notes into hierarchical + tree-like structure.
+It is expected then that you'll have an elaborate and deep note hierarchy + - each subtree will represent a more refined and specialized view of your + knowledge base.
+This is a pretty powerful approach, but it also carries a hidden assumption + that each "subtopic" is "owned" by one parent. I'll illustrate this with + an example - let's say my basic structure is this:
+Now, I'm starting to learn about Bash and + would like to create notes related to this topic. But now I'm facing a + problem of where to categorize this. The issue here is that Bash is both + a programming language and a tool (shell) very much tied into Linux. It + seems it belongs to both of these, I can't (and don't want to) choose one + over the other.
+ +The solution to the problem shown above is to allow notes to have multiple + parents.
+I call these "clones", but that is a bit misleading - there's no original + and cloned note - the notes in both of the parents categories are identical.
+Another misleading thing about "cloning" is that it suggests that a copy + of the note has been made. That's not really true, the note itself stays + in just one original, it is just referenced in multiple places in the tree + hierarchy. So changing it in one category changes it in all the others, + because they're all the same note.
+Here's the final structure with cloning:
+So now the "Bash" subtree appears on multiple locations in the hierarchy. + Both the Bash subtrees are the same and contain the same sub-categories + and notes.
+ +
+
+
In the demo, you can see how a clone can be created using the context + menu. It's possible to do this also using the Add Link dialog or with CTRL+C + and CTRL+V keyboard shortcuts.
+As seen in the demo, you can view the list of all available clones in + the "Note Paths" tab in the Ribbon toolbar.
+Titles of cloned notes in the tree view have an asterisk to the right + to easily see that the note is also placed into some other location.
+ +Since notes can be categorized into multiple places, it's recommended + to choose a generalized name that fits into all locations instead of something + more specific to avoid confusion. In some cases this isn't possible so + Trilium provides "branch prefixes", which is shown before the note name + in the tree and as such provides a specific kind of context. The prefix + is location specific, so it's displayed only in the tree pane.
+ +With clones, it might not be immediately obvious how deleting works.
+If you try to delete a note, it works like this:
+
+
+
Screenshot of the note contextual menu indicating the “Export as PDF” + option.
+On the desktop application of Trilium it is possible to export a note + as PDF. On the server or PWA (mobile), the option is not available due + to technical constraints and it will be hidden.
+To print a note, select the
+ button to the right of the note and select Export as PDF.
Afterwards you will be prompted to select where to save the PDF file. + Upon confirmation, the resulting PDF will be opened automatically using + the default/system application configured for PDFs.
+Should you encounter any visual issues in the resulting PDF file (e.g.
+ a table does not fit properly, there is cut off text, etc.) feel free to
+ report the issue. In this case, it's best to offer a sample note (click
+ on the
+ button, select Export note → This note and all of its descendants → HTML
+ in ZIP archive). Make sure not to accidentally leak any personal information.
When exporting to PDF, there are no customizable settings such as page
+ orientation, size, etc. However, it is possible to specify a given note
+ to be printed as a PDF in landscape mode by adding the #printLandscape
attribute
+ to it (see [missing note]).
By default, the resulting PDF will be in Letter format. It is possible
+ to adjust it to another page size via the #printPageSize
attribute,
+ with one of the following values: A0
, A1
, A2
, A3
, A4
, A5
, A6
, Legal
, Letter
, Tabloid
, Ledger
.
It's possible to trigger the export to PDF from the keyboard by going
+ to Keyboard shortcuts and assigning a key combination for the exportAsPdf
action.
Trilium supports storing and displaying images. Supported formats are + JPEG, PNG and GIF.
+An image can be uploaded in the form of note's attachment or + as a standalone note placed + into the note tree. Its + reference can be copied into a text note, in order to display it in the + text itself.
+ +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.
+
+
+
Alternatively you can click on block toolbar and then on "Insert image":
+
+
+
You can also copy and paste an image from web - the image will be (asynchronously) + downloaded and embedded.
+ +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 -> Other.
+If you want to save images in their original resolution, it is recommended + to save them as attachment to note (top-right "Note actions -> Import + files").
+External link is general web link targeting some external web resource + - e.g. https://en.wikipedia.org/wiki/South_China_Sea is + an external link to one Wikipedia page.
+External links are done through CKEditor native links. To create an external
+ link, select text and press CTRL-K
or wait for the "balloon"
+ to appear and click link icon there.
+
+
You can follow external link by either double clicking (will open new + tab/window) it or right clicking on them and choosing "Open in new tab".
+ +Links to internal notes are created a bit differently. To create link
+ to note at current cursor position, press CTRL-L
.
In the dialog you can see radio button to choose from different types + of linking:
+
+
+
You can follow the note link by double clicking it.
+Alternatively if you only wish to quickly preview the content, you can + hover over the link and will see read only preview.
+ +Trilium also provides "inline" linking - type @
and you'll
+ see an autocomplete, just type few characters from the desired note title,
+ press enter and you have a link.
Trilium provides a visualisation of incoming and outgoing links for a + particular note. See note map for + details.
+Icons are useful for distinguishing notes. At the technical level, they
+ are set by the **iconClass**
attribute which adds a CSS class
+ to the note. For example #iconClass="bx bx-calendar"
will show
+ a calendar instead of the default page or folder icon. Looking up and remembering
+ the css class names is not necessary. While editing a note, click on the
+ icon next to the title to bring up a chooser gallery:
+
+
+
+
Trilium supports seamless versioning of notes by storing snapshots ("revisions") + of notes at regular intervals.
+ +Time interval of taking note snapshot is configurable in the Options -> + Other dialog. This provides a tradeoff between more revisions and more + data to store.
+To turn off note versioning for a particular note (or subtree), add disableVersioning
+ labelto the note.
The limit on the number of note snapshots can be configured in the Options
+ -> Other dialog. The note revision snapshot number limit refers to the
+ maximum number of revisions that can be saved for each note. Where -1 means
+ no limit, 0 means delete all revisions. You can set the maximum revisions
+ for a single note through the versioningLimit=X
label.
The note limit will not take effect immediately; it will only apply when + the note is modified.
+You can click the Erase excess revision snapshots now button + to apply the changes immediately.
+Note revisions can be accessed through the button on the right of ribbon + toolbar.
+
+
+
Trilium is designed to store a wide variety of data, including sensitive + information such as personal journals, credentials, or confidential documents. + To safeguard this type of content, Trilium offers the option to protect + notes, which involves the following measures:
+By default, notes are unprotected. To protect a note, simply click on + the shield icon next to the note's title, as shown here:
+
+
+
Trilium encrypts the data within protected notes but not their metadata. + Specifically:
+Encrypted: +
+Not encrypted: +
+The following steps outline how encryption and decryption work in Trilium:
+Protected notes cannot be shared in the same way as regular notes. Their + encryption ensures that only authorized users with the correct password + can access them.
+Both text and code notes + in Trilium can be set to read-only. When a note is in read-only mode, it + is presented to the user in a non-editable view, with the option to switch + to editing mode if needed.
+ +To set a note as read-only, add the readOnly
label to
+ the note.
For optimization purposes, Trilium will automatically set very large notes + to read-only. Displaying such lengthy notes in editing mode can slow down + performance, especially when editing is unnecessary.
+If you want to ensure that a specific note remains editable regardless
+ of its size, you can add the autoReadOnlyDisabled
label to
+ the note.
Trilium now has basic support for right-to-left text, but only for + Text note types (both editable and read-only).
++ | + |
---|---|
+ ![]() |
+
+ ![]() |
+
Note that only the Text note type supports this.
+The list of languages is configurable via the a new dedicated settings + page:
+
+
+
To select the corresponding language of the text, go to “Basic Properties” + and select your desired language.
+
+
+
Feel free to report any issues regarding right to left support.
+You can sort notes by right-clicking the parent note in the note tree + and selecting Advanced -> Sort notes by ... This will sort existing + notes, but will not automatically sort future notes added to this parent + note
+ +Child notes can be automatically sorted by attaching specific labels to + the parent note:
+#sorted
: Enables sorting. Can optionally include the name
+ of the note's property/label for sorting criteria (details below).#sortDirection
: By default, sorting is ascending. Set this
+ to desc
to sort in descending order.#sortFoldersFirst
: Notes with children will be sorted to
+ the top.Sorting is done by comparing note properties or specific labels on child + notes. There are four sorting levels, with the first having the highest + priority. Lower priority levels are applied only if higher priority comparisons + result in equality.
+#top
label
+ will appear at the top of the folder.#bottom
label will appear at the bottom of the
+ folder.#sorted
label:
+ #sorted
has no value,
+ notes are sorted alphabetically.#sorted
is set to title
, dateModified
,
+ or dateCreated
, notes are sorted based on the specified property.#sorted
has any other value,
+ this value is treated as the name of a child note's label, and sorting
+ is based on the values of this label. For example, setting #sorted=myOrder
on
+ the parent note and using #myOrder=001
, #myOrder=002
,
+ etc., on child notes.All comparisons are made string-wise (e.g., "1" < "2" or "2020-10-10" + < "2021-01-15", but also "2" > "10").
+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.
+
+
+
Trilium supports custom user themes, allowing you to personalize the application's + appearance. To create a custom theme, follow these steps:
+CSS
type.**#appTheme**
: Add the attribute #appTheme=my-theme-name
to
+ your note, where my-theme-name
is the name of your custom theme.@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);
+}
+ Once you've created your custom theme:
+#appTheme
label.If you make changes to your theme, press CTRL-R
to reload the
+ frontend and apply your updates.
Custom themes can be exported as .tar
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.
An example user theme, Steel Blue, is available in the demo document.
+
+
+
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.
+ +To use custom CSS:
+CSS
type.**appCss**
Label:
+ Annotate the note with the #appCss
label.For example:
+/* Custom CSS to style specific elements */
+.tree-item {
+ color: #ff6347; /* Change tree item color */
+}
+ When Trilium's frontend starts, all notes labeled with appCss
are
+ automatically included in the style element of the HTML page.
After making changes, press CTRL-R
to reload the frontend and
+ apply your new styles.
+
+
To apply specific styles to certain notes in the tree:
+**cssClass**
Attribute:
+ Add the cssClass
attribute to
+ a note, and assign it a value representing the desired CSS class.**iconClass**
: You can also define
+ a custom icon for a note using the iconClass
attribute, selecting
+ from Box Icons or your own custom classes.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 type-image mime-image-png
.
A gallery of user-created themes is available, showcasing the variety + of customizations that the Trilium community has developed. For more information, + visit the Theme Gallery.
+ +When referencing built-in assets like images in your custom themes or
+ CSS, you can avoid hardcoding version numbers by using the vX
alias.
+ For example, instead of specifying /assets/v0.57.0-beta/images/icon-grey.png
,
+ you can use /assets/vX/images/icon-grey.png
to keep your theme
+ compatible with future versions of Trilium.
These are user-created themes which were made publicly available:
+ +These themes may or may not be compatible with the latest versions of + TriliumNext and are based on the original/legacy theme.
+Theme | +Author | +
---|---|
Midnight + | +tobealive + | +
EOTE + | +tobealive + | +
Trilium Themes + | +Abourass + | +
MaterialDark + | +ZMonk91 + | +
lightslategray + | +jaroet + | +
melon-4 + | +raphwriter + | +
Neon_Dark + | +Engr-AllanG + | +
Coder_Dark + | +Engr-AllanG + | +
velvet + | +idelem + | +
Dark Plus + | +SADAVA + | +
Solarized + | +WKSu + | +
Nord + | +en3r0 + | +
Bear Note Light + | +AllanZyne + | +
Bear Note Dark + | +AllanZyne + | +
Miku Hatsune + | +Sebiann + | +
Midnight + | +cwilliams5 + | +
Blue (light) | +SiriusXT + | +
Blue (dark) | +SiriusXT + | +
If you would like to add your theme to this gallery, write a new post + in 👐 Show and tell.
+The position of the global menu differs based on which layout is selected + in settings:
++ | + |
---|---|
+ ![]() + The global menu in the vertical layout. |
+
+ ![]() + The global menu in the horizontal layout. |
+
+
+
Screenshot of Zen Mode activated on a Windows 11 system with native title + bar off and background effects on.
+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.
+
+
+
Screenshot of the Zen Mode option in the global menu.
+ +The Zen Mode can be activated by accessing the global menu and selecting + the “Zen Mode” option:
+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 toggleZenMode
in
+ the shortcut configuration.
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
+ icon in the top-right corner of the window or by pressing the keyboard
+ combination again.
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.
+ +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.
+
+
+
Screenshot of two notes side-by-side while Zen Mode is active, on Windows + 11 with background effects off.
+ +Tabs are completely hidden, however it's still possible to use keyboard
+ shortcuts such as firstTab
(Ctrl+1 by default), secondTab
(Ctrl+2
+ by default). There are also some newer shortcuts such as activateNextTab
(Ctrl+Tab)
+ or activatePreviousTab
(Ctrl+Shift+Tab) that allow easy navigation,
+ however make sure that they are configured properly in the settings.
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.
+This tutorial showcases a basic integration with Google Forms, where we + are able to download the responses of a form using the “Link to Sheets" + functionality.
+Note that the link will be publicly accessible to everyone (however the
+ link is in a hard-to-guess format such as https://docs.google.com/spreadsheets/d/e/2PACX-1vTA8NU2_eZFhc8TFadCZPreBfvP7un8IHd6J0SchrLLw3ueGmntNZjwRmsH2ZRcp1pJYDAzMz1FmFaj/pub?output=csv
).
+ Make sure you are not accidentally publishing sensitive information.
Create a “JS Frontend” script:
+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.
+ 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:
+const content = data
+ .split("\n")
+ .slice(1)
+ .map((row) => row.split(","));
+ This will return the data as an array of arrays.
+A good use case of promoted attributes is to easily define the various + parameters a script might need, for example an input and output note if + it's processing data, or a checkbox to define a particular change in behavior + for the script.
+
+
+
Instead of asking the user to modify a boolean value in the script, it's + much more intuitive to use a checkbox for it as a promoted attribute.
+To do so, first define the promoted attribute:
+#label:groupByExtension="promoted,alias=Group by extension,single,boolean"
+ Then use it:
+const byExtension = api.currentNote.getLabelValue("groupByExtension") === "true";
+if (byExtension) {
+ // Do something.
+}
+ This will work equally well in both front-end and back-end scripts.
+ +One common use case for a script is to read data from another note and + perhaps output its result in another note. To do so we need to define the + following promoted attributes:
+#relation:input="promoted,alias=Input,single" #relation:output="promoted,alias=Output,single"
+ Once we have this, we can add some basic error handling to ensure that + the fields are completed by the user:
+const inputNoteId = api.currentNote.getRelationValue("input");
+if (!inputNoteId) {
+ api.showError("Missing input.");
+ return;
+}
+
+const outputNoteId = api.currentNote.getRelationValue("output");
+if (!outputNoteId) {
+ api.showError("Missing output.");
+ return;
+}
+ Note that here we are using api.showError
which is only available
+ for frontend notes. If you are writing a backend note, simply remove api.showError
but
+ the user will no feedback on why the script did not execute properly.
Afterwards we can simply read the note and do something with it:
+const note = api.getNote(inputNoteId);
+if (!note) {
+ return;
+}
+const content = note.getContent().toString("utf-8");
+ The frontend api supports two styles, regular scripts that are run with
+ the current app and note context, and widgets that export an object to
+ Trilium to be used in the UI. In both cases, the frontend api of Trilium
+ is available to scripts running in the frontend context as global variable api
.
+ The members and methods of the api can be seen on the Script API page.
Scripts don't have any special requirements. They can be run at will using + the execute button in the UI or they can be configured to run at certain + times using Attributes on + the note containing the script.
+ +This attribute is called #run
and it can have any of the following
+ values:
frontendStartup
- executes on frontend upon startup.mobileStartup
- executes on mobile frontend upon startup.backendStartup
- executes on backend upon startup.hourly
- executes once an hour on backend.daily
- executes once a day on backend.These events are triggered by certain relations to + other notes. Meaning that the script is triggered only if the note has + this script attached to it through relations (or it can inherit it).
+runOnNoteCreation
- executes when note is created on backend.runOnNoteTitleChange
- executes when note title is changed
+ (includes note creation as well).runOnNoteContentChange
- executes when note content is changed
+ (includes note creation as well).runOnNoteChange
- executes when note is changed (includes
+ note creation as well).runOnNoteDeletion
- executes when note is being deleted.runOnBranchCreation
- executes when a branch is created. Branch
+ is a link between parent note and child note and is created e.g. when cloning
+ or moving note.runOnBranchDeletion
- executes when a branch is delete. Branch
+ is a link between parent note and child note and is deleted e.g. when moving
+ note (old branch/link is deleted).runOnChildNoteCreation
- executes when new note is created
+ under this note.runOnAttributeCreation
- executes when new attribute is created
+ under this note.runOnAttributeChange
- executes when attribute is changed
+ under this note.Conversely to scripts, widgets do have some specific requirements in order + to work. A widget must:
+module.exports
.parentWidget
member to determine where it should be
+ displayed.position
(integer) that determines the location via
+ sort order.#widget
attribute on the containing note.this.$widget
and
+ render it in doRender()
.this.$widget
and doRender()
are
+ already handled and you should instead return the value in doRenderBody()
.left-pane
- This renders the widget on the left side of the
+ screen where the note tree lives.center-pane
- This renders the widget in the center of the
+ layout in the same location that notes and splits appear.note-detail-pane
- This renders the widget with the
+ note in the center pane. This means it can appear multiple times with splits.right-pane
- This renders the widget to the right of any opened
+ notes.For more information on building widgets, take a look at Widget Basics.
+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.
+ +To start, we'll create the most basic widget possible. Here's a simple + example:
+class MyWidget extends api.BasicWidget {
+ get position() { return 1; }
+ get parentWidget() { return "left-pane"; }
+
+ doRender() {
+ this.$widget = $("");
+ return this.$widget;
+ }
+}
+
+module.exports = new MyWidget();
+ To implement this widget:
+JS Frontend
note in Trilium and paste in the code
+ above.#widget
attribute to
+ the note.To verify that the widget is working, open the developer tools (Cmd
+ Shift
+ I
)
+ and run document.querySelector("#my-widget")
. If the element
+ is found, the widget is functioning correctly. If undefined
is
+ returned, double-check that the note has
+ the #widget
attribute.
Next, let's improve the widget by adding a button to it.
+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();
+ After making this change, reload Trilium. You should now see a button + in the top-left corner of the left pane.
+ +To make the button more visually appealing and position it correctly,
+ we'll apply some custom styling. Trilium includes Box Icons,
+ which we'll use to replace the button text with an icon. For example the bx bxs-magic-wand
icon.
Here's the updated template:
+const template = ``;
+ Next, we'll adjust the button's position using CSS:
+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();
+ After reloading Trilium, the button should now appear at the bottom left + of the left pane, alongside other action buttons.
+ +Let’s make the button interactive by showing a message when it’s clicked.
+ We'll use the api.showMessage
method from the Script API.
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", () => api.showMessage("Hello World!"));
+ return this.$widget;
+ }
+}
+
+module.exports = new MyWidget();
+ Reload the application one last time. When you click the button, a "Hello + World!" message should appear, confirming that your widget is fully functional.
+Originally, desktop builds of Trilium Notes has been available for Windows + & Linux, but there has been a considerable demand for macOS build.
+So I made one, but I underestimated the differences and specifics of Mac + platform which seems to require special handling in several places. My + lack of knowledge and frankly willingness to learn & code Mac specific + functionality resulted in a current state where Trilium does not integrate well into the OS
+%%{WARNING}%%.
+macOS build is from now on considered "unsupported". I will strive to + keep it fundamentally functional, but I won't work on Mac specific features + or integrations. Note that this is more of an acknowledgment of an existing + state rather than sudden change of direction.
+Of course, PRs are welcome.
+ +Trilium is currently available only in English. Translation to other languages + is not planned in the near/medium term because it brings a significant + maintenance overhead. This decision might be revisited once Trilium stabilizes + into a more mature product.
+For Chinese, there's an unofficial fork here. + Use at your own risk.
+ +Common request is to allow multiple users collaborate, share notes etc. + So far I'm resisting this because of these reasons:
+This is normally not supported - one Trilium process can open only a single
+ instance of a database. However,
+ you can run two Trilium processes (from one installation), each connected
+ to a separate document. To achieve this, you need to set a location for
+ the data directory in
+ the TRILIUM_DATA_DIR
environment variable and separate port
+ on TRILIUM_PORT
environment variable. How to do that depends
+ on the platform, in Unix-based systems you can achieve that by running
+ command such as this:
TRILIUM_DATA_DIR=/home/me/path/to/data/dir TRILIUM_PORT=12345 trilium
+ You can save this command into a .sh
script file or make an
+ alias. Do this similarly for a second instance with different data directory
+ and port.
No.
+These general purpose sync apps are not suitable to sync database files + which are open and being worked on by another application. The result is + that they will corrupt the database file, resulting in data loss and this + message in the Trilium logs:
+++SqliteError: database disk image is malformed
+
The only supported way to sync Trilium's data across the network is to + use a sync/web server.
+ +Trilium stores notes in a database which + is an SQLite database. People often ask why doesn't Trilium rather use + flat files for note storage - it's fair question since flat files are easily + interoperable, work with SCM/git etc.
+Short answer is that file systems are simply not powerful enough for what + we want to achieve with Trilium. Using filesystem would mean fewer features + with probably more problems.
+More detailed answer:
+Trilium supports simple backup scheme where it saves copy of the document on + these events:
+So in total you'll have at most 4 backups from different points in time
+ which should protect you from various problems. These backups are stored
+ by default in backup
directory placed in the data directory.
This is only very basic backup solution, and you're encouraged to add + some better backup solution - e.g. backing up the document to + cloud / different computer etc.
+Note that synchronization provides also + some backup capabilities by its nature of distributing the data to other + computers.
+ +Let's assume you want to restore the weekly backup, here's how to do it:
+~/trilium-data
as data directory from now on~/trilium-data/backup/backup-weekly.db
- this is the
+ documentbackup~/trilium-data/document.db
, ~/trilium-data/document.db-wal
and ~/trilium-data/document.db-shm
(latter
+ two files are auto generated)~/trilium-data/backup/backup-weekly.db
to ~/trilium-data/document.db
+ chmod 600 document.db
+ If you have configured sync then you need to do it across all members + of the sync cluster, otherwise older version (restored backup) of the document + will be detected and synced to the newer version.
+ +Although this is not recommended, it is possible to disable backup in config.ini
in
+ the data directory:
[General]
+... some other configs
+# set to true to disable backups (e.g. because of limited space on server)
+noBackup=true
+ You can also review the configuration file
+ to provide all config.ini
values as environment variables instead.
See sample config. + %%{WARNING}%%
+Data directory contains:
+document.db
- database
+ config.ini
- instance level settings like port on which the
+ Trilium application runsbackup
- contains automatically backup of
+ documentslog
- contains application log filesEasy way how to find out which data directory Trilium uses is to look + at the "About Trilium Notes" dialog (from "Menu" in upper left corner):
+
+
+
Here's how the location is decided:
+Data directory is normally named trilium-data
and it is stored
+ in:
/home/[user]/.local/share
for LinuxC:\Users\[user]\AppData\Roaming
for Windows Vista and up/Users/[user]/Library/Application Support
for Mac OSIf you want to back up your Trilium data, just backup this single directory + - it contains everything you need.
+ +If you want to use some other location for the data directory than the + default one, you may change it via TRILIUM_DATA_DIR environment variable + to some other location:
+ +export TRILIUM_DATA_DIR=/home/myuser/data/my-trilium-data
+ You need to create a .plist
file under ~/Library/LaunchAgents
to
+ load it properly each login.
To load it manually, you need to use launchctl setenv TRILIUM_DATA_DIR <yourpath>
+
Here is a pre-defined template, where you just need to add your path to:
+
+
+
+
+
+ Label
+ set.trilium.env
+ RunAtLoad
+
+ ProgramArguments
+
+ launchctl
+ setenv
+ TRILIUM_DATA_DIR
+ /Users/YourUserName/Library/Application Support/trilium-data
+
+
+
+ An alternative to globally setting environment variable is to run only + the Trilium Notes with this environment variable. This then allows for + different setup styles like two database instances + or "portable" installation.
+To do this in unix based systems simply run trilium like this:
+TRILIUM_DATA_DIR=/home/myuser/data/my-trilium-data trilium
+ You can then save the above command as a shell script on your path for + convenience.
+ +It's possible to configure e.g. backup and log directories separately, + with following environment variables:
+TRILIUM_DOCUMENT_PATH
+ TRILIUM_BACKUP_DIR
+ TRILIUM_LOG_DIR
+ TRILIUM_ANONYMIZED_DB_DIR
+ TRILIUM_CONFIG_INI_PATH
+ If these are not set, default paths within the data directory will be + used.
+To install Trilium on your desktop, follow these steps:
+trilium
executable
+ found within the unzipped folder.Trilium offers various startup scripts to customize your experience:
+**trilium-no-cert-check**
: Starts Trilium without validating
+ TLS certificates, useful if connecting to a server with a self-signed
+ certificate.
+ NODE_TLS_REJECT_UNAUTHORIZED=0
environment
+ variable before starting Trilium.**trilium-portable**
: Launches Trilium in portable mode,
+ where the data directory is created within
+ the application's directory, making it easy to move the entire setup.**trilium-safe-mode**
: Boots Trilium in "safe mode," disabling
+ any startup scripts that might cause the application to crash.For Trilium desktp users who wish to synchronize their data with a server + instance, refer to the Synchronization Guide for + detailed instructions.
+Trilium (server edition) has + a mobile web frontend which is optimized for touch based devices - smartphones + and tablets. It is activated automatically during login process based on + browser detection.
+Mobile frontend is limited in features compared to full desktop frontend. + See below for more details on this.
+Note that this is not an Android/iOS app, this is just mobile friendly + web page served on the server edition.
+ +
+
+
+
+
Mobile frontend provides only some of the features of the full desktop + frontend:
+Trilium decides automatically whether to use mobile or desktop frontend.
+ If this is not appropriate, you can use ?mobile
or ?desktop
query
+ param on login page (Note: you might need to log out).
You can alter the behavior with scripts just
+ like for normal frontend. For script notes to be executed, they need to
+ have labeled #run=mobileStartup
.
This guide outlines the steps to install Trilium on your own server. You + might consider this option if you want to set up synchronization or + use Trilium in a browser - accessible from anywhere.
+ +There are several ways to install Trilium on a server, each with its own + advantages:
+The server installation includes both web and mobile frontends.
+ +After setting up your server installation, you may want to configure settings
+ such as the port or enable TLS.
+ Configuration is managed via the Trilium config.ini
file, which
+ is located in the data directory by default.
+ To begin customizing your setup, copy the provided config-sample.ini
file
+ with default values to config.ini
.
You can also review the configuration file
+ to provide all config.ini
values as environment variables instead.
By default, config.ini
, the database,
+ and other important Trilium data files are stored in the data directory.
+ If you prefer a different location, you can change it by setting the TRILIUM_DATA_DIR
environment
+ variable:
export TRILIUM_DATA_DIR=/home/myuser/data/my-trilium-data
+ 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 config.ini
:
[General]
+noAuthentication=true
+ To configure a reverse proxy for Trilium, you can use either nginx or Apache.
+ +Add the following configuration to your nginx
setup to proxy
+ requests to Trilium:
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;
+}
+ To avoid limiting the size of payloads, include this in the server {}
block:
# Set to 0 for unlimited. Default is 1M.
+client_max_body_size 0;
+ For an Apache setup, refer to the Apache proxy setup guide.
+Official docker images are published on docker hub for AMD64, ARMv7 and ARM64/v8: + https://hub.docker.com/r/triliumnext/notes/ +
+ +Ensure Docker is installed on your system.
+If you need help installing Docker, reference the Docker Installation Docs +
+Note: Trilium's Docker container requires root privileges + to operate correctly.
+++ +[!WARNING] If you're using a SMB/CIFS share or folder as your Trilium + data directory, you'll need to + add the mount options of
+nobrl
andnoperm
when mounting + your SMB share.
wget https://raw.githubusercontent.com/TriliumNext/Notes/master/docker-compose.yml
+ Optionally, edit the docker-compose.yml
file to configure the
+ container settings prior to starting it. Unless configured otherwise, the
+ data directory will be ~/trilium-data
and the container will
+ be accessible at port 8080.
Run the following command to start the container in the background:
+docker compose up -d
+ To pull the image, use the following command, replacing [VERSION]
with
+ the desired version or tag, such as v0.91.6
or just latest
.
+ (See published tag names at https://hub.docker.com/r/triliumnext/notes/tags.):
docker pull triliumnext/notes:v0.91.6
+ Warning: Avoid using the "latest" tag, as it may automatically + upgrade your instance to a new minor version, potentially disrupting sync + setups or causing other issues.
+ +Trilium requires a directory on the host system to store its data. This + directory must be mounted into the Docker container with write permissions.
+ +Run the container to make it accessible only from the localhost. This + setup is suitable for testing or when using a proxy server like Nginx or + Apache.
+sudo docker run -t -i -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/notes:[VERSION]
+ docker ps
.127.0.0.1:8080
.To make the container accessible only on your local network, first create + a new Docker network:
+docker network create -d macvlan -o parent=eth0 --subnet 192.168.2.0/24 --gateway 192.168.2.254 --ip-range 192.168.2.252/27 mynet
+ Then, run the container with the network settings:
+docker run --net=mynet -d -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/notes:-latest
+ To set a different user ID (UID) and group ID (GID) for the saved data,
+ use the USER_UID
and USER_GID
environment variables:
docker run --net=mynet -d -p 127.0.0.1:8080:8080 -e "USER_UID=1001" -e "USER_GID=1001" -v ~/trilium-data:/home/node/trilium-data triliumnext/notes:-latest
+ Find the local IP address using docker inspect [container_name]
and
+ access the service from devices on the local network.
docker ps
+docker inspect [container_name]
+ To allow access from any IP address, run the container as follows:
+docker run -d -p 0.0.0.0:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/notes:[VERSION]
+ Stop the container with docker stop <CONTAINER ID>
,
+ where the container ID is obtained from docker ps
.
For a custom data directory, use:
+-v ~/YourOwnDirectory:/home/node/trilium-data triliumnext/notes:[VERSION]
+ If you want to run your instance in a non-default way, please use the
+ volume switch as follows: -v ~/YourOwnDirectory:/home/node/trilium-data triliumnext/notes:<VERSION>
.
+ It is important to be aware of how Docker works for volumes, with the first
+ path being your own and the second the one to virtually bind to. https://docs.docker.com/storage/volumes/ The
+ path before the colon is the host directory, and the path after the colon
+ is the container's path. More details can be found in the Docker Volumes Documentation.
The --user
directive is unsupported. Instead, use the USER_UID
and USER_GID
environment
+ variables to set the appropriate user and group IDs.
If you are having timezone issues and you are not using docker-compose,
+ you may need to add a TZ
environment variable with the TZ identifier of
+ your local timezone.
As Trilium can be run in Docker it also can be deployed in Kubernetes. + You can either use our Helm chart, a community Helm chart, or roll your + own Kubernetes deployment.
+The recommended way is to use a Helm chart.
+ +++[!NOTE] +
+
The Trilium container at this time needs to be run with root privileges. + It will swap to UID and GID1000:1000
to run thenode
process + after execution though, so the main process doesn't run with root privileges.
The Trilium docker container needs to be run with root privileges. The
+ node process inside the container will be started with reduced privileges
+ (uid:gid 1000:1000) after some initialization logic. Please make sure that
+ you don't use a security context (PodSecurityContext) which changes the
+ user ID. To use a different uid:gid for file storage and the application,
+ please use the USER_UID
& USER_GID
environment
+ variables.
The docker image will also fix the permissions of /home/node
so
+ you don't have to use an init container.
Official Helm chart from + TriliumNext Unofficial helm chart by ohdearaugustin: + https://github.com/ohdearaugustin/charts +
+ +Below is an example of how
+helm repo add trilium https://triliumnext.github.io/helm-charts
+"trilium" has been added to your repositories
+ After reviewing the values.yaml
from
+ the Helm chart, modifying as required and then creating your own:
helm install --create-namespace --namespace trilium trilium trilium/trilium -f values.yaml
+ For more information on using Helm, please refer to the Helm documentation, + or create a Discussion in the TriliumNext GitHub Organization.
+This page describes manually installing Trilium on your server. Note that this is a not well supported way to install Trilium, problems may appear, information laid out here is quite out of date. It is recommended to use either Docker or packaged build installation. +
+ +Trilium is a node.js application. Supported (tested) version of node.js + is latest 14.X.X and 16.X.X. Trilium might work with older versions as + well.
+You can check your node version with this command (node.js needs to be + installed):
+node --version
+ If your Linux distribution has only an outdated version of node.js, you + can take a look at the installation instruction on node.js website, which + covers most popular distributions.
+ +There are some dependencies required. You can see command for Debian and + its derivatives (like Ubuntu) below:
+sudo apt install libpng16-16 libpng-dev pkg-config autoconf libtool build-essential nasm libx11-dev libxkbfile-dev
+ You can either download source code zip/tar from https://github.com/TriliumNext/Notes/releases/latest]] %%{WARNING}%%or + clone git repository from stable branch with
+git clone -b stable https://github.com/triliumnext/notes.git %%{WARNING}%%
+ cd trilium
+
+# download all node dependencies
+npm install
+
+# make sure the better-sqlite3 binary is there
+npm rebuild
+
+# bundles & minifies frontend JavaScript
+npm run webpack
+ cd trilium
+
+# using nohup to make sure trilium keeps running after user logs out
+nohup TRILIUM_ENV=dev node src/www &
+ The application by default starts up on port 8080, so you can open your + browser and navigate to http://localhost:8080 to + access Trilium (replace "localhost" with your hostname).
+ +Don't forget to configure TLS which + is required for secure usage!
+This page describes configuring the Trilium module included in NixOS.
+ +NixOS installation.
+ +Add this to your configuration.nix
:
services.trilium-server.enable = true;
+
+# default data directory: /var/lib/trilium
+#services.trilium-server.dataDir = "/var/lib/trilium-sync-server";
+
+# default bind address: 127.0.0.1, port 8080
+#services.trilium-server.host = "0.0.0.0";
+#services.trilium-server.port = 12783;
+ Uncomment any option you would like to change.
+See the NixOS options list for + more options (including nginx reverse proxy configuration).
+This is essentially Trilium sources + node modules + node.js runtime packaged + into one 7z file.
+ +wget
(or curl
or whatever) to download latest
+ trilium-linux-x64-server-[VERSION].xz%%{WARNING}%% (notice -server
+ suffix) on your servertar -xf -d trilium-linux-x64-server-[VERSION].tar.xz
+ cd trilium-linux-x64-server
+ ./trilium.sh
+ 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:
+CTRL-C
) and run again like this: nohup ./trilium &
.tar -xvf trilium-linux-x64-server-[VERSION].tar.xz
+sudo mv trilium-linux-x64-server /opt/trilium
+ sudo nano /etc/systemd/system/trilium.service
+ [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
+ sudo systemctl enable --now -q trilium
+ 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)
+ 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 server installation method.
+ +Don't forget to configure TLS, + which is required for secure usage!
+I've assumed you have created a DNS A record for trilium.yourdomain.com
that
+ you want to use for your Trilium server.
Download docker image and create container
+ docker pull triliumnext/notes:[VERSION]
+ docker create --name trilium -t -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/notes:[VERSION]
+ Configure Apache proxy and websocket proxy
+Enable apache proxy modules
+ a2enmod ssl
+ a2enmod proxy
+ a2enmod proxy_http
+ a2enmod proxy_wstunnel
+ Create a new let's encrypt certificate
+ sudo certbot certonly -d trilium.mydomain.com
+ Choose standalone (2) and note the location of the created certificates + (typically /etc/letsencrypt/live/...)
+Create a new virtual host file for apache (you may want to use apachectl -S
to
+ determine the server root location, mine is /etc/apache2)
sudo nano /etc/apache2/sites-available/trilium.yourdomain.com.conf
+ Paste (and customize) the following text into the configuration file
+
+ ServerName http://trilium.yourdomain.com
+ RewriteEngine on
+ RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
+
+
+ ServerName https://trilium.yourdomain.com
+ RewriteEngine On
+ RewriteCond %{HTTP:Connection} Upgrade [NC]
+ RewriteCond %{HTTP:Upgrade} websocket [NC]
+ RewriteRule /(.*) ws://localhost:8080/$1 [P,L]
+ AllowEncodedSlashes NoDecode
+ ProxyPass / http://localhost:8080/ nocanon
+ ProxyPassReverse / http://localhost:8080/
+ SSLCertificateFile /etc/letsencrypt/live/trilium.yourdomain.com/fullchain.pem
+ SSLCertificateKeyFile /etc/letsencrypt/live/trilium.yourdomain.com/privkey.pem
+ Include /etc/letsencrypt/options-ssl-apache.conf
+
+ Enable the virtual host with sudo a2ensite trilium.yourdomain.com.conf
+
Reload apache2 with sudo systemctl reload apache2
+
Create and enable a systemd service to start the docker container on boot
+Create a new empty file called /lib/systemd/system/trilium.service
with
+ the contents
[Unit]
+ Description=Trilium Server
+ Requires=docker.service
+ After=docker.service
+
+ [Service]
+ Restart=always
+ ExecStart=/usr/bin/docker start -a trilium
+ ExecStop=/usr/bin/docker stop -t 2 trilium
+
+ [Install]
+ WantedBy=local.target
+ Install, enable and start service
+ sudo systemctl daemon-reload
+ sudo systemctl enable trilium.service
+ sudo systemctl start trilium.service
+ Configure Nginx proxy and HTTPS. The operating system here is Ubuntu 18.04.
+Download Nginx and remove Apache2
+sudo apt-get install nginx
+sudo apt-get remove apache2
+ Create configure file
+cd /etc/nginx/conf.d
+vim default.conf
+ Fill the file with the context shown below, part of the setting show be + changed. Then you can enjoy your web with HTTPS forced and proxy.
+# This part is for proxy and HTTPS configure
+server {
+ listen 443 ssl;
+ server_name trilium.example.net; #change trilium.example.net to your domain without HTTPS or HTTP.
+ ssl_certificate /etc/ssl/note/example.crt; #change /etc/ssl/note/example.crt to your path of crt file.
+ ssl_certificate_key /etc/ssl/note/example.net.key; #change /etc/ssl/note/example.net.key to your path of key file.
+ ssl_session_cache builtin:1000 shared:SSL:10m;
+ ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+ ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
+ ssl_prefer_server_ciphers on;
+ access_log /var/log/nginx/access.log; #check the path of access.log, if it doesn't fit your file, change it
+
+ location / {
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ proxy_pass http://127.0.0.1:8080; # change it to a different port if non-default is used
+ proxy_read_timeout 90;
+ proxy_redirect http://127.0.0.1:8080 https://trilium.example.net; # change them based on your IP, port and domain
+ }
+}
+# This part is for HTTPS forced
+server {
+ listen 80;
+ server_name trilium.example.net; # change to your domain
+ return 301 https://$server_name$request_uri;
+}
+ Note: This feature has not been merged yet, so it is not available. +
+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.
+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.
+Warning! OpenID and TOTP cannot be both used at the same time!
+ +OpenID is a standardized way to let you log into websites using an account + from another service, like Google, to verify your identity.
+ +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.
+ +Start Trilium Notes normally.
+Go to "Menu" -> "Options" -> "MFA"
+Click the "Generate TOTP Secret" button
+Copy the generated secret to your authentication app/extension
+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.
+# .env in the project root directory
+TOTP_ENABLED="true"
+TOTP_SECRET="secret"
# Terminal/CLI
+export TOTP_ENABLED="true"
+export TOTP_SECRET="secret"
# Docker
+docker run -p 8080:8080 -v ~/trilium-data:/home/node/trilium-data -e TOTP_ENABLED="true" -e TOTP_SECRET="secret" triliumnext/notes:[VERSION]
+ Restart Trilium
+Go to "Options" -> "MFA"
+Click the "Generate Recovery Codes" button
+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.
+Load the secret into an authentication app like google authenticator
+Currently only compatible with Google. Other services like Authentik and Auth0 are planned on being added. +
+In order to setup OpenID, you will need to setup a authentication provider. + This requires a bit of extra setup. Follow these instructions to + setup an OpenID service through google.
+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.
+ +# .env in the project root directory
+SSO_ENABLED="true"
+BASE_URL="http://localhost:8080"
+CLIENT_ID=
+SECRET=
+ export SSO_ENABLED="true"
+export BASE_URL="http://localhost:8080"
+export CLIENT_ID=
+export SECRET=
+ 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]
+ 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.
+You can now login using your google account.
+Configuring TLS is essential for server installation in + Trilium. This guide details the steps to set up TLS within Trilium itself.
+For a more robust solution, consider using TLS termination with a reverse + proxy (recommended, e.g., Nginx). You can follow a guide like this for + such setups.
+ +You have two options for obtaining a TLS certificate:
+config.ini
Once you have your certificate, modify the config.ini
file
+ in the data directory to configure
+ Trilium to use it:
[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
+ You can also review the configuration file
+ to provide all config.ini
values as environment variables instead.
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 /home/node/trilium-data/[DIR IN DATA DIRECTORY]
.
After configuring config.ini
, restart Trilium and access the
+ hostname using "https".
If you opt to use a self-signed certificate for your server instance, + note that the desktop instance will not trust it by default.
+To bypass this, disable certificate validation by setting the following + environment variable (for Linux):
+export NODE_TLS_REJECT_UNAUTHORIZED=0
+trilium
+ Trilium provides scripts to start in this mode, such as trilium-no-cert-check.bat
for
+ Windows.
Warning: Disabling TLS certificate validation is insecure. + Proceed only if you fully understand the implications.
+Trilium is an offline-first note-taking application that stores all data + locally on the desktop client. However, it also offers the option to set + up synchronization with a server instance, allowing multiple desktop clients + to sync with a central server. This creates a star-shaped topology:
+
+
+
In this setup, a central server (referred to as the sync server) + and multiple client (or desktop) instances synchronize with + the sync server. Once configured, synchronization is automatic and ongoing, + requiring no manual intervention.
+ +Setting up the server securely is critical and can be complex. It is crucial + to use a valid TLS certificate (HTTPS) + rather than an unencrypted HTTP connection to ensure security and avoid + potential vulnerabilities.
+ +This method is used when you already have a desktop instance of Trilium + and want to set up a sync server on your web host.
+
+
+
This method is used when you already have a sync server and want to configure + a new desktop instance to sync with it.
+
+
+
+
+
Once synchronization is complete, you will be automatically redirected + to the Trilium application.
+ +Two proxy setups are supported:
+For successful synchronization, both client and server must have the same + date and time, with a tolerance of up to five minutes.
+ +When using TLS, Trilium will verify the server certificate. If verification
+ fails (e.g., due to self-signed certificates or certain corporate proxies),
+ you can run the Trilium client with the NODE_TLS_REJECT_UNAUTHORIZED
environment
+ variable set to 0
:
export NODE_TLS_REJECT_UNAUTHORIZED=0
+ This will disable TLS certificate verification, significantly reducing
+ security and exposing the setup to MITM attacks. It is strongly recommended
+ to use a valid signed server certificate. Newer Trilium versions include
+ a script called trilium-no-cert-check.sh
for this purpose.
If you edit the same note on multiple instances before synchronization, + Trilium resolves conflicts by retaining the newer change and discarding + the older one. The older version remains accessible in note revisions, + allowing data recovery if needed.
+ +After each synchronization, Trilium computes a hash of all synced data + on both the client and the sync server. If there is a discrepancy, Trilium + will automatically initiate a recovery mechanism to resolve the issue.
+This document outlines the steps required to upgrade Trilium to a new + release version.
+ +Trilium does not support built-in automatic upgrades; all updates must + be performed manually. The upgrade process varies depending on the installation + method:
+Upon startup, Trilium will automatically migrate the database 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 backup that + is created prior to migration.
+ +The synchronization 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.
+
+
+
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.
+Project is hosted here.
+Firefox and Chrome are supported browsers, but the chrome build should + work on other chromium based browsers as well.
+ +Trilium will save these clippings as a new child note under a "clipper + inbox" note.
+By default, that's the day note but
+ you can override that by setting the label clipperInbox
,
+ on any other note.
If there's multiple clippings from the same page (and on the same day), + then they will be added to the same note.
+Extension is available from: +
+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.
+It's also possible to configure the server address + if you don't run the desktop application, or want it to work without the + desktop application running.
+ +Older versions of Trilium (before 0.50) required username & password + to authenticate, but this is no longer the case. You may enter anything + in that field, it will not have any effect.
+A Book Note in Trilium is a special type of note 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.
+
+
+
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.
+ +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.
+ +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.
+
+
+
Switching between these views can be easily managed through the Book Note's
+ settings (or viewType
attribute), allowing users to choose the
+ format that best suits their reading or navigation preferences.
+
+
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.
+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.
+ ++ | + | + |
---|---|---|
1 | +
+ ![]() |
+ 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 Book. | +
2 | +
+ ![]() |
+ Once created, the “View type” of the Book needs changed to “Calendar”, + by selecting the “Book Properties” tab in the ribbon. | +
~child:template
relation
+ if set on the book note.The following attributes can be added to the book type:
+Name | +Description | +
---|---|
#calendar:hideWeekends
+ |
+ When present (regardless of value), it will hide Saturday and Sundays + from the calendar. | +
#calendar:weekNumbers
+ |
+ When present (regardless of value), it will show the number of the week + on the calendar. | +
~child:template
+ |
+ Defines the template for newly created notes in the calendar (via dragging + or clicking). | +
In addition, the first day of the week can be either Sunday or Monday + and can be adjusted from the application settings.
+ +For each note of the calendar, the following attributes can be used:
+Name | +Description | +
---|---|
#startDate
+ |
+ The date the event starts, which will display it in the calendar. The
+ format is YYYY-MM-DD (year, month and day separated by a minus
+ sign). |
+
#endDate
+ |
+ Similar to startDate , 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. |
+
#color
+ |
+ Displays the event with a specified color (named such as red , gray or
+ hex such as #FF0000 ). This will also change the color of the
+ note in other places such as the note tree. |
+
#calendar:color
+ |
+ Similar to #color , but applies the color only for the event
+ in the calendar and not for other places such as the note tree. |
+
#iconClass
+ |
+ If present, the icon of the note will be displayed to the left of the + event title. | +
#calendar:title
+ |
+ Changes the title of an event to point to an attribute of the note other
+ than the title, either a label (e.g. #assignee ) or a relation
+ (e.g. ~for ). See Advanced use-cases for more information. |
+
#calendar:promotedAttributes
+ |
+ Allows displaying the value of one or more promoted attributes in the
+ calendar like this:
+ ![]() + <br>#label:weight="promoted,number,single,precision=1"<br>#label:mood="promoted,alias=Mood,single,text"<br>#calendar:promotedAttributes="label:weight,label:mood" <br>
+ + It can also be used with relations, case in which it will display the + title of the target note: + + <br>#relation:assignee="promoted,alias=Assignee,single,text"<br>#calendar:promotedAttributes="relation:assignee" <br>~assignee=@My assignee <br>
+ |
+
#calendar:startDate
+ |
+ Allows using a different label to represent the start date, other than #startDate (e.g. #expiryDate ).
+ The label name must be prefixed with # . If the label is not
+ defined for a note, the default will be used instead. |
+
#calendar:endDate
+ |
+ Allows using a different label to represent the start date, other than #endDate .
+ The label name must be prefixed with # . If the label is not
+ defined for a note, the default will be used instead. |
+
+ The calendar displays all the child notes of the book that have a
#startDate
.
+ An #endDate
can optionally be added.
If editing the start date and end date from the note itself is desirable, + the following attributes can be added to the book note:
+#viewType=calendar #label:startDate(inheritable)="promoted,alias=Start Date,single,date" #label:endDate(inheritable)="promoted,alias=End Date,single,date" #hidePromotedAttributes
+ This will result in:
+
+
+
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.
+ +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.
+Based on the #calendarRoot
(or #workspaceCalendarRoot
)
+ attribute, the calendar will know that it's in a calendar and apply the
+ following:
dateNote
attribute
+ rather than startDate
.dateNote
attribute. Children of the child notes
+ will not be displayed.
+
+
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.
+To do so, assign #calendar:title
to the child note (not the
+ calendar/book note), with the value being #name
where name
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.
+ | + |
---|---|
+ ![]() |
+
+ ![]() |
+
Similarly to using an attribute, use #calendar:title
and set
+ it to ~name
where name
is the name of the relation
+ to use.
Moreover, if there are more relations of the same name, they will be displayed + as multiple events coming from the same note.
++ | + |
---|---|
+ ![]() |
+
+ ![]() |
+
Note that it's even possible to have a #calendar:title
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 of attributes could cause the application
+ to loop infinitely).
+ | + |
---|---|
+ ![]() |
+
+ ![]() |
+
Available since Trilium v0.52.
+Canvas notes use the Excalidraw library to allow handwritten notes with + mouse, pen or touch on an infinite canvas. It also supports basic diagramming, + text and graphics input.
+
+
+
+ | + | + |
---|---|---|
1 | +
+ ![]() |
+ Right click on any note on the note tree and select Insert child note → Geo Map (beta). | +
2 | +
+ ![]() |
+ By default the map will be empty and will show the entire world. | +
The position on the map and the zoom are saved inside the map note and + restored when visiting again the note.
+ ++ | + | + |
---|---|---|
1 | ++ | To create a marker, first navigate to the desired point on the map. Then
+ press the
+ ![]() + If the button is not visible, make sure the button section is visible + by pressing the chevron button ( + ![]() |
+
2 | +
+ ![]() |
+ Once pressed, the map will enter in the insert mode, as illustrated by
+ the notification.
+ + Simply click the point on the map where to place the marker, or the Escape + key to cancel. |
+
3 | +
+ ![]() |
+ Enter the name of the marker/note to be created. | +
4 | +
+ ![]() |
+ Once confirmed, the marker will show up on the map and it will also be + displayed as a child note of the map. | +
The location of a marker is stored in the #geolocation
attribute
+ of the child notes:
+
+
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.
+ +It's possible to reposition existing markers by simply drag and dropping + them to the new destination.
+As soon as the mouse is released, the new position is saved.
+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.
+ +#geolocation
attribute
+ of the note. To add it back again, the coordinates have to be manually
+ added back in.
+The markers will have the same icon as the note.
+It's possible to add a custom color to a marker by assigning them a #color
attribute
+ such as #color=green
.
In a nutshell, create a child note and set the #geolocation
attribute
+ to the coordinates.
The value of the attribute is made up of the latitude and longitude separated + by a comma.
+ ++ | + | + |
---|---|---|
1 | +
+ ![]() |
+ Go to Google Maps on the web and look for a desired location, right click
+ on it and a context menu will show up.
+ + Simply click on the first item displaying the coordinates and they will + be copied to clipboard. + + Then paste the value inside the text box into the #geolocation attribute
+ of a child note of the map (don't forget to surround the value with a " character). |
+
2 | +
+ ![]() |
+ In Trilium, create a child note under the map. | +
3 | +
+ ![]() |
+ And then go to Owned Attributes and type #geolocation=" , then
+ paste from the clipboard as-is and then add the ending " character.
+ Press Enter to confirm and the map should now be updated to contain the
+ new note. |
+
Similarly to the Google Maps approach:
++ | + | + |
---|---|---|
1 | +
+ ![]() |
+ Go to any location on openstreetmap.org and right click to bring up the + context menu. Select the “Show address” item. | +
2 | +
+ ![]() |
+ The address will be visible in the top-left of the screen, in the place
+ of the search bar.
+ + Select the coordinates and copy them into the clipboard. |
+
3 | +
+ ![]() |
+ Simply paste the value inside the text box into the #geolocation attribute
+ of a child note of the map and then it should be displayed on the map. |
+
Trilium has basic support for displaying GPS tracks on the geo map.
++ | + | + |
---|---|---|
1 | +
+ ![]() |
+ To add a track, simply drag & drop a .gpx file inside the geo map + in the note tree. | +
2 | +
+ ![]() |
+ In order for the file to be recognized as a GPS track, it needs to show
+ up as application/gpx+xml in the File type field. |
+
3 | +
+ ![]() |
+ When going back to the map, the track should now be visible.
+ + The start and end points of the track are indicated by the two blue markers. |
+
+
+
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).
+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.
+For the official documentation of Mermaid.js see mermaid.js.org/intro/.
+ +Mermaid supports a different layout engine which supports slightly more + complex diagrams, called the Eclipse Layout Kernel (ELK). + Trilium has support for these as well, but it's not enabled by default.
+In order to activate ELK for any diagram, insert the following YAML frontmatter + right at the beginning of the diagram:
+---
+config:
+ layout: elk
+---
+ With ELK off | +With ELK on | +
---|---|
+ |
+
+ |
+
Trilium allows you to save common searches as notes within the note tree. + The search results will appear as sub-notes under these "saved search" + notes. Here is an example of how it works:
+
+
+
By default, saved searches are stored in the day note. However, you can
+ designate a different note to store saved searches by marking it with the #searchHome
label.
+ Additionally, for workspaces,
+ you can use the #workspaceSearchHome
label to specify a storage
+ location for saved searches within that workspace.
Trilium utilizes the powerful CKEditor 5 as + its text editing component.
+ +The Trilium text note interface does not display toolbars or formatting + options by default. These can be accessed by:
+
+
+
+ 2. Clicking on the block toolbar.
Text notes are usually opened in edit mode. However, they may open in + read-only mode under the following circumstances:
+readOnly
label.In both cases, it is possible to switch back to editable mode using the
+ button at top right of page.
For more information, see Read-Only Notes.
+ +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:
+**text**
or __text__
+ *text*
or _text_
+ Code
: Type `text`~~text~~
+ See Lists.
+ +>
followed by a spaceTo create a multi-line code block, start a line with "```[lang]", for + example:
+if (1 > 2) {
+ console.log("Error in the matrix");
+}
+ Create headings by starting a line with ##
for heading 2, ###
for
+ heading 3, and so on up to heading 6. Note that #
is reserved
+ for the title.
Insert a horizontal line by starting a line with ---
.
CKEditor supports a markdown-like editing experience, recognising syntax + and automatically converting it to rich text.
+
+
+
Complete documentation for this feature is available in the CKEditor documentation.
+If autoformatting is not desirable, press CTRL-Z
to revert
+ the text to its original form.
Note: The use of #
for Heading 1 is not supported because it
+ is reserved for the title. Start with ##
for Heading 2. More
+ information is available here.
Trilium provides math support through KaTeX.
+ +When editing a document that becomes too large, you can split it into + sub-notes:
+Trilium can automate this process. Select some text within the note, and + in the selection toolbar, click the scissors icon for the "cut & 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.
+ +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 + & "render HTML" note) or other more advanced use cases.
+This functionality is available in the block toolbar icon.
+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.
+For more information about right-to-left support, see Right-to-left text notes.
+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.
+
+
+
There are three types of lists supported by text notes:
+*
or -
followed
+ by a space;1.
or 1)
followed
+ by a space;[ ]
for an unchecked item or [x]
for
+ a checked item.It possible to add content-level blocks such as headings, code blocks, + tables within lists, as follows:
++ | + |
---|---|
+ ![]() |
+ First, create a list. | +
+ ![]() |
+ Press Enter to create a new list item. | +
+ ![]() |
+ Press Backspace to get rid of the bullet point. Notice the cursor position. | +
+ ![]() |
+ At this point, insert any desired block-level item such as a code block. | +
+ ![]() |
+ To continue with a new bullet point, press Enter until the cursor moves + to a new blank position. | +
+ ![]() |
+ Press Enter once more to create the new bullet. | +
The same principle applies to all three list types (bullet, numbered and + to-do).
+A webview needs to know which URL to render, and it can be provided by
+ setting the webViewSrc
attribute, such as:
#webViewSrc="https://www.wikipedia.org"
+ 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.
+More specifically, quite a few websites oppose being embedded in another
+ website (technically they have a non-permisive X-Frame-Options
header).
+ This is not bypassable by Trilium so the page will simply fail to render.
You can diagnose this by right clicking the Trilium web page → Inspect + (element) and looking in the “Console” tab for errors such as:
+Refused to display 'https://www.google.com/' in a frame because it set 'X-Frame-Options' to 'sameorigin'.
+ Refused to frame 'https://duckduckgo.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://html.duckduckgo.com".
+ There are a few websites that do render such as wikipedia.org
.
Do note that we are also applying some sandboxing constraints on the server
+ side, so if you have any issues other than the unresolvable X-Frame-Options
described
+ above, feel free to report them.
On the desktop side, a different technology is used which bypasses the
+ constraints of an iframe
(webview
).
Local only desktop/laptop - Allows a single instance on + a desktop and will save the notes locally on that desktop.
+Server with web only access - Installs the application + on the server and allows access from any web browser on any device, including + mobile.
+Combination of server and desktop/laptop - Install the + application on both a server, for web access and data synchronization, + and desktop instance(s). This allows all the data to be stored on the server + and either accessed from the web browser, or the desktop application. The + desktop application will sync and store the data locally so that it can + be used when offline.
+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.
+As such, the first step is to create a new note to gather all the themes.
+
+ ++ | + |
---|---|
+ ![]() |
+ Themes are code notes with a special attribute. Start by creating a new + code note. | +
 | +Then change the note type to a CSS code. | +
 | +In the Owned Attributes section define the #appTheme attribute
+ to point to any desired name. This is the name that will show up in the
+ appearance section in settings. |
+
As a very simple example we will change the background color of the launcher + pane to a shade of blue.
+To alter the different variables of the theme:
+:root {
+ --launcher-pane-background-color: #0d6efd;
+}
+ Refresh the application (Ctrl+Shift+R is a good way to do so) and go to + settings. You should see the newly created theme:
+
+Afterwards the application will refresh itself with the new theme:
+
+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: Theme base (legacy vs. next) +
+ +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.
+It's a good idea to keep two windows, one for editing and the other one + for previewing the changes.
+It is possible to provide a CSS file to be used regardless of the theme + set by the user.
++ | + |
---|---|
+ ![]() |
+ Start by creating a new note and changing the note type to CSS | +
+ ![]() |
+ In the ribbon, press the “Owned Attributes” section and type #appCss . |
+
+ ![]() |
+ Type the desired CSS.
+ + Generally it's a good idea to append !important for the styles
+ that are being changed, in order to prevent other |
+
Adding a new app CSS note or modifying an existing one does not + immediately apply changes. To see the changes, press Ctrl+Shift+R to refresh + the page first.
+ +When printing a document or exporting as PDF, it is possible to adjust
+ the style by creating a CSS note that uses the @media
selector.
For example, to change the font of the document from the one defined by + the theme or the user to a serif one:
+@media print {
+
+ body {
+
+ --main-font-family: serif !important;
+
+ --detail-font-family: var(--main-font-family) !important;
+
+ }
+
+}
+ By default, any custom theme will be based on the legacy light theme.
+ To use the TriliumNext theme instead, add the #appThemeBase=next
attribute
+ onto the existing theme. The appTheme
attribute must also be
+ present.
+
+
The appThemeBase
label can be set to one of the following values:
next
, for the TriliumNext (auto light or dark mode).next-light
, for the always light mode of the TriliumNext.next-dark
, for the always dark mode of the TriliumNext.Do note that the TriliumNext theme has a few more overrides than the legacy
+ theme, so you might need to suffix !important
if the style changes
+ are not applied.
:root {
+ --launcher-pane-background-color: #0d6efd !important;
+}
+ The mobile layout is different than the one on the desktop. Use body.mobile
and body.desktop
to
+ differentiate between them.
body.mobile #root-widget {
+ /* Do something on mobile */
+}
+
+body.desktop #root-widget {
+ /* Do something on desktop */
+}
+ Do note that there is also a “tablet mode” in the mobile layout. For that + particular case media queries are required:
+@media (max-width: 991px) {
+
+ #launcher-pane {
+
+ /* Do something on mobile layout */
+
+ }
+
+}
+
+
+
+@media (min-width: 992px) {
+
+ #launcher-pane {
+
+ /* Do something on mobile tablet + desktop layout */
+
+ }
+
+}
+ 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).
+Different styles can be applied by using classes at body
level:
body.layout-vertical #left-pane {
+ /* Do something */
+}
+
+body.layout-horizontal #center-pane {
+ /* Do something else */
+}
+ The two different layouts use different containers (but they are present
+ in the DOM regardless of the user's choice), for example #horizontal-main-container
and #vertical-main-container
can
+ be used to customize the background of the content section.
It is possible to add particular styles that only apply to a given platform
+ by using the classes in body
:
Windows | +macOS | +
---|---|
<br>body.platform-win32 {<br> background: red;<br>}<br>
+ |
+ <br>body.platform-darwin {<br> background: red;<br>}<br>
+ |
+
It is also possible to only apply a style if running under Electron (desktop + application):
+body.electron {
+ background: blue;
+}
+ It's possible to detect if the user has selected the native title bar
+ or the custom title bar by querying against body
:
body.electron.native-titlebar {
+ /* Do something */
+}
+
+body.electron:not(.native-titlebar) {
+ /* Do something else */
+}
+ 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.
+See Native title bar buttons by eliandoran · Pull Request #702 · TriliumNext/Notes for + the original implementation of this feature, including screenshots.
+ +The colors of the native window button area can be adjusted using a RGB + hex color:
+body {
+ --native-titlebar-foreground: #ffffff;
+ --native-titlebar-background: #ff0000;
+}
+ It is also possible to use transparency at the cost of reduced hover colors + using a RGBA hex color:
+body {
+ --native-titlebar-background: #ff0000aa;
+}
+ 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.
+ +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:
+body {
+ --native-titlebar-darwin-x-offset: 12;
+ --native-titlebar-darwin-y-offset: 14 !important;
+}
+ Windows 11 offers a special background/transparency effect called Mica,
+ which can be enabled by themes by setting the --background-material
variable
+ at body
level:
body.electron.platform-win32 {
+ --background-material: tabbed;
+}
+ The value can be either tabbed
(especially useful for the horizontal
+ layout) or mica
(ideal for the vertical layout).
Do note that the Mica effect is applied at body
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.
Theme capabilities are small adjustments done through CSS variables that + can affect the layout or the visual aspect of the application.
+In the tab bar, to display the icons of notes instead of the icon of the + workspace:
+:root {
+ --tab-note-icons: true;
+}
+ 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:
+.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);
+}
+ Currently the only way to include a custom font is to use Custom resource providers.
+ Basically import a font into Trilium and assign it #customResourceProvider=fonts/myfont.ttf
and
+ then import the font in CSS via /custom/fonts/myfont.ttf
.
A light theme needs to have the following CSS:
+:root {
+ --theme-style: light;
+}
+ if the theme is dark, then --theme-style
needs to be dark
.
If the theme is auto (e.g. supports both light or dark based on prefers-color-scheme
)
+ it must also declare (in addition to setting --theme-style
to
+ either light
or dark
):
:root {
+
+ --theme-style-auto: true;
+
+}
+ 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).
+As Trilium is currently in beta, encountering bugs is to be expected.
+ +The first step in troubleshooting is often a restart.
+If you experience an UI issue, the frontend may have entered an inconsistent
+ state. Reload the application by pressing CTRL-R
. This will
+ reload the frontend.
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.
+ +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.
+To resolve this, use the TRILIUM_START_NOTE_ID
environment
+ variable to reset the open tabs to a single specified note ID (e.g., root
).
+ In Linux, you can set it as follows:
TRILIUM_START_NOTE_ID=root ./trilium
+ If a custom script causes Triliumto crash, and it is set as a startup + script or in an active custom widget, + start Triliumin "safe mode" to prevent any custom scripts from executing:
+TRILIUM_SAFE_MODE=true ./trilium
+ Depending on your Trilium distribution, you may have pre-made scripts
+ available: trilium-safe-mode.bat
and trilium-safe-mode.sh
.
Once Trilium starts, locate and fix or delete the problematic note.
+ +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.
+In such cases, file a bug report and attach an anonymized database if + necessary.
+ +Trilium makes regular automatic backups. If issues become severe, you + can restore from a backup.
+ +If you forget your password:
+Access the database file in
+ the data directory.
+ Open the document.db
file with an SQLite client (e.g., DB Browser)
+ and execute the following queries:
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';
+ After executing the changes, commit/write the changes. This sets the password to "password," allowing you to log in again. +
+For pre-existing protected notes (now unrecoverable), consider deleting
+ them or exporting the unprotected notes. Then, delete document.db
and
+ start fresh.
If you continue using the existing document file, change your password + (Options -> Change Password).
+ +Reporting bugs is highly valuable. Here are some tips:
+
+
+
In certain scenarios, understanding the structure of a database is crucial + for troubleshooting issues. However, sharing your actual database file + with personal notes is not advisable. To address this, Trilium offers a + feature to anonymize the database. This feature can be accessed via Menu + -> Options -> Advanced tab.
+This feature creates a copy of your database with all sensitive data removed.
+ Specifically, it strips out note titles, contents, revisions, history,
+ and some non-system attributes while retaining the overall structure and
+ metadata, such as modification dates. After anonymization, the database
+ undergoes a vacuuming process to
+ ensure no sensitive data remnants remain in the file. The anonymized database
+ is saved in the anonymized
directory within the data directory,
+ making it safe to share with bug reports.
This will create a copy of your document and remove all sensitive data
+ (currently note titles, contents, revisions, history and some of the options,
+ and non-system attributes) while leaving all structure and metadata (e.g.
+ date of last change). After this is done, the database is VACUUMed to
+ make sure there's no stale sensitive data in the document file. The resulting
+ file is stored in anonymized
directory (placed in the data directory).
+ You can safely attach it to a bug report.
If your database is corrupted + to the point where Trilium cannot start, the anonymization process can + still be executed via the command line:
+node src/anonymize.js
+ Run this command from the directory containing Trilium's source files,
+ typically found in the resources/app
directory for desktop builds.
It's important to provide all available error logs together with bug reports. + This page will show you how to do it.
+ +Open data directory,
+ go to log
subdirectory and find the latest log file, e.g. trilium-2022-12-14.log
.
+ You can attach the whole file to the bug report (preferable) or open it
+ and copy-paste only the last lines / lines you believe are relevant.
If you have trouble finding it the log files, there's also an in-app option + in top-left menu button -> Advanced -> Show backend log.
+ +To provide frontend logs, we need to open the Developer Console. Often
+ the easiest way is to press CTRL-SHIFT-I
which should work in
+ most browsers (and desktop app). Make sure that the error producing action
+ happened right before you copy&paste the errors, the console is cleared
+ on app restart.
If that doesn't work, then:
+
+
+
Once you have Dev Tools open, click on "Console" tab:
+
+
+
Copy-paste (or screenshot) the logs. It's better to provide not just errors, + but the whole log, which might provide context while analyzing the bug.
+ +If you don't feel comfortable attaching the logs or anything sensitive + to the public GitHub issues, feel free to contact the devs in our Matrix + support channel.
+Use this email to also provide anything which could assist in analysing + the bug - e.g. files/images/ZIPs being imported or anonymized database.
+ +Often times, bugs manifest themselves in specific notes and having them + would greatly ease reproduction and fixing.
+In such case, please export the relevant note subtree by right-clicking + it on the left tree, choosing Export - HTML as ZIP:
+
+
+
Go to Issues · TriliumNext/Notes and + press “New issue”.
+If you are reporting a bug, select “Bug Report” and fill in the details.
+Synchronization can sometimes take a long amount of time in order to compute + the items that require update. When running behind a reverse proxy, the + request can time out.
+The solution is to increase the timeout at proxy level.
+ +Add the following to the configuration file:
+proxy_connect_timeout 300;
+proxy_send_timeout 300;
+proxy_read_timeout 300;
+send_timeout 300;
+ And restart the server.
+See Nginx Proxy Setup for + more information about the Nginx setup.
+If it still doesn't work, try increasing the timeout.
+