mirror of
https://github.com/zadam/trilium.git
synced 2026-04-11 06:27:43 +02:00
Compare commits
74 Commits
analysis/i
...
feature/ea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a5b248e663 | ||
|
|
1ec43722e8 | ||
|
|
88c548cc70 | ||
|
|
daafe251da | ||
|
|
147ecbccda | ||
|
|
adbe8f6c42 | ||
|
|
18aec84be5 | ||
|
|
5f68958aa7 | ||
|
|
4787f644a6 | ||
|
|
524f8df866 | ||
|
|
bb381c1349 | ||
|
|
36c31dac14 | ||
|
|
01b6926054 | ||
|
|
84cfa0a9f7 | ||
|
|
cb83c51632 | ||
|
|
97256ba291 | ||
|
|
d3c596aaa0 | ||
|
|
3d2fa57873 | ||
|
|
c435050018 | ||
|
|
14f761de36 | ||
|
|
626438d8f5 | ||
|
|
e29555a89b | ||
|
|
05da2d7a50 | ||
|
|
1124533557 | ||
|
|
878603c7b0 | ||
|
|
19583cd84a | ||
|
|
9f26d6efdc | ||
|
|
043e620231 | ||
|
|
d3dbdd4ceb | ||
|
|
0859165072 | ||
|
|
ca7ab6105d | ||
|
|
3af2b32783 | ||
|
|
8d5df7e888 | ||
|
|
126ee27505 | ||
|
|
fc2d8452b5 | ||
|
|
1b8c234f30 | ||
|
|
540b607459 | ||
|
|
ee229bd0d7 | ||
|
|
439d39d8fa | ||
|
|
8c379d03a9 | ||
|
|
ff31104b99 | ||
|
|
dfe6063929 | ||
|
|
a4b716f8c7 | ||
|
|
7efc36efef | ||
|
|
1554c9907e | ||
|
|
df46ddcf60 | ||
|
|
6fb19d0287 | ||
|
|
d702f69415 | ||
|
|
eb81e830a1 | ||
|
|
a24b9d7a38 | ||
|
|
efeaa1e895 | ||
|
|
a239eba6ce | ||
|
|
d009582252 | ||
|
|
fe710823c1 | ||
|
|
bfe593ae52 | ||
|
|
f653a22557 | ||
|
|
96e7f22520 | ||
|
|
e6d3d22db7 | ||
|
|
1258dedab3 | ||
|
|
ec15c7e63e | ||
|
|
5037eaf205 | ||
|
|
cb706453aa | ||
|
|
772ebbf929 | ||
|
|
60e1aca3b1 | ||
|
|
31eaa4181d | ||
|
|
9e701645d5 | ||
|
|
0fa121cdf2 | ||
|
|
2316f38978 | ||
|
|
b65bf12247 | ||
|
|
55291d43a6 | ||
|
|
f8c59a1730 | ||
|
|
c833c3591f | ||
|
|
ccbd962e0b | ||
|
|
966d2afe69 |
19
.github/copilot-instructions.md
vendored
19
.github/copilot-instructions.md
vendored
@@ -1,5 +1,7 @@
|
||||
# Trilium Notes - AI Coding Agent Instructions
|
||||
|
||||
> **Note**: When updating this file, also update `CLAUDE.md` in the repository root to keep both AI coding assistants in sync.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. Built as a TypeScript monorepo using pnpm, it implements a three-layer caching architecture (Becca/Froca/Shaca) with a widget-based UI system and supports extensive user scripting capabilities.
|
||||
@@ -115,6 +117,15 @@ class MyNoteWidget extends NoteContextAwareWidget {
|
||||
|
||||
**Important**: Widgets use jQuery (`this.$widget`) for DOM manipulation. Don't mix React patterns here.
|
||||
|
||||
### Reusable Preact Components
|
||||
Common UI components are available in `apps/client/src/widgets/react/` — prefer reusing these over creating custom implementations:
|
||||
- `NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states)
|
||||
- `ActionButton` - Consistent button styling with icon support
|
||||
- `FormTextBox` - Text input with validation and controlled input handling
|
||||
- `Slider` - Range slider with label
|
||||
- `Checkbox`, `RadioButton` - Form controls
|
||||
- `CollapsibleSection` - Expandable content sections
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### Running & Testing
|
||||
@@ -322,8 +333,16 @@ Trilium provides powerful user scripting capabilities:
|
||||
- When a translated string contains **interpolated components** (e.g. links, note references) whose order may vary across languages, use `<Trans>` from `react-i18next` instead of `t()`. This lets translators reorder components freely (e.g. `"<Note/> in <Parent/>"` vs `"in <Parent/>, <Note/>"`)
|
||||
- When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md`
|
||||
|
||||
#### Client vs Server Translation Usage
|
||||
- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json`
|
||||
- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json`
|
||||
- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped
|
||||
|
||||
## Testing Conventions
|
||||
|
||||
- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests
|
||||
- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it
|
||||
|
||||
```typescript
|
||||
// ETAPI test pattern
|
||||
describe("etapi/feature", () => {
|
||||
|
||||
18
CLAUDE.md
18
CLAUDE.md
@@ -2,6 +2,8 @@
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
> **Note**: When updating this file, also update `.github/copilot-instructions.md` to keep both AI coding assistants in sync.
|
||||
|
||||
## Overview
|
||||
|
||||
Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. It's built as a TypeScript monorepo using pnpm, with multiple applications and shared packages.
|
||||
@@ -66,6 +68,15 @@ Frontend uses a widget system (`apps/client/src/widgets/`):
|
||||
- `RightPanelWidget` - Widgets displayed in the right panel
|
||||
- Type-specific widgets in `type_widgets/` directory
|
||||
|
||||
#### Reusable Preact Components
|
||||
Common UI components are available in `apps/client/src/widgets/react/` — prefer reusing these over creating custom implementations:
|
||||
- `NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states)
|
||||
- `ActionButton` - Consistent button styling with icon support
|
||||
- `FormTextBox` - Text input with validation and controlled input handling
|
||||
- `Slider` - Range slider with label
|
||||
- `Checkbox`, `RadioButton` - Form controls
|
||||
- `CollapsibleSection` - Expandable content sections
|
||||
|
||||
#### API Architecture
|
||||
- **Internal API**: REST endpoints in `apps/server/src/routes/api/`
|
||||
- **ETAPI**: External API for third-party integrations (`apps/server/src/etapi/`)
|
||||
@@ -108,6 +119,8 @@ Trilium supports multiple note types, each with specialized widgets:
|
||||
- Client tests can run in parallel
|
||||
- E2E tests use Playwright for both server and desktop apps
|
||||
- Build validation tests check artifact integrity
|
||||
- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests
|
||||
- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it
|
||||
|
||||
### Scripting System
|
||||
Trilium provides powerful user scripting capabilities:
|
||||
@@ -124,6 +137,11 @@ Trilium provides powerful user scripting capabilities:
|
||||
- When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md`
|
||||
- **Server-side translations** (e.g. hidden subtree titles) go in `apps/server/src/assets/translations/en/server.json`, not in the client `translation.json`
|
||||
|
||||
#### Client vs Server Translation Usage
|
||||
- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json`
|
||||
- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json`
|
||||
- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped
|
||||
|
||||
### Electron Desktop App
|
||||
- Desktop entry point: `apps/desktop/src/main.ts`, window management: `apps/server/src/services/window.ts`
|
||||
- IPC communication: use `electron.ipcMain.on(channel, handler)` on server side, `electron.ipcRenderer.send(channel, data)` on client side
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
"leaflet": "1.9.4",
|
||||
"leaflet-gpx": "2.2.0",
|
||||
"mark.js": "8.11.1",
|
||||
"marked": "17.0.5",
|
||||
"marked": "17.0.6",
|
||||
"mermaid": "11.14.0",
|
||||
"mind-elixir": "5.10.0",
|
||||
"panzoom": "9.4.4",
|
||||
|
||||
@@ -236,6 +236,16 @@ export default class FNote {
|
||||
return this.hasAttribute("label", "archived");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the note's metadata (title, icon) should not be editable.
|
||||
* This applies to system notes like options, help, and launch bar configuration.
|
||||
*/
|
||||
get isMetadataReadOnly() {
|
||||
return utils.isLaunchBarConfig(this.noteId)
|
||||
|| this.noteId.startsWith("_help_")
|
||||
|| this.noteId.startsWith("_options");
|
||||
}
|
||||
|
||||
getChildNoteIds() {
|
||||
return this.children;
|
||||
}
|
||||
|
||||
@@ -68,7 +68,8 @@ async function autocompleteSourceForCKEditor(queryText: string) {
|
||||
name: row.notePathTitle || "",
|
||||
link: `#${row.notePath}`,
|
||||
notePath: row.notePath,
|
||||
highlightedNotePathTitle: row.highlightedNotePathTitle
|
||||
highlightedNotePathTitle: row.highlightedNotePathTitle,
|
||||
icon: row.icon
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
87
apps/client/src/services/spaced_update.spec.ts
Normal file
87
apps/client/src/services/spaced_update.spec.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import SpacedUpdate from "./spaced_update";
|
||||
|
||||
// Mock logError which is a global in Trilium
|
||||
vi.stubGlobal("logError", vi.fn());
|
||||
|
||||
describe("SpacedUpdate", () => {
|
||||
beforeEach(() => {
|
||||
vi.useFakeTimers();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it("should only call updater once per interval even with multiple pending callbacks", async () => {
|
||||
const updater = vi.fn(async () => {
|
||||
// Simulate a slow network request - this is where the race condition occurs
|
||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||
});
|
||||
|
||||
const spacedUpdate = new SpacedUpdate(updater, 50);
|
||||
|
||||
// Simulate rapid typing - each keystroke calls scheduleUpdate()
|
||||
// This queues multiple setTimeout callbacks due to recursive scheduleUpdate() calls
|
||||
for (let i = 0; i < 10; i++) {
|
||||
spacedUpdate.scheduleUpdate();
|
||||
// Small delay between keystrokes
|
||||
await vi.advanceTimersByTimeAsync(5);
|
||||
}
|
||||
|
||||
// Advance time past the update interval to trigger the update
|
||||
await vi.advanceTimersByTimeAsync(100);
|
||||
|
||||
// Let the "network request" complete and any pending callbacks run
|
||||
await vi.advanceTimersByTimeAsync(200);
|
||||
|
||||
// The updater should have been called only ONCE, not multiple times
|
||||
// With the bug, multiple pending setTimeout callbacks would all pass the time check
|
||||
// during the async updater call and trigger multiple concurrent requests
|
||||
expect(updater).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("should call updater again if changes occur during the update", async () => {
|
||||
const updater = vi.fn(async () => {
|
||||
await new Promise((resolve) => setTimeout(resolve, 50));
|
||||
});
|
||||
|
||||
const spacedUpdate = new SpacedUpdate(updater, 30);
|
||||
|
||||
// First update
|
||||
spacedUpdate.scheduleUpdate();
|
||||
await vi.advanceTimersByTimeAsync(40);
|
||||
|
||||
// Schedule another update while the first one is in progress
|
||||
spacedUpdate.scheduleUpdate();
|
||||
|
||||
// Let first update complete
|
||||
await vi.advanceTimersByTimeAsync(60);
|
||||
|
||||
// Advance past the interval again for the second update
|
||||
await vi.advanceTimersByTimeAsync(100);
|
||||
|
||||
// Should have been called twice - once for each distinct change period
|
||||
expect(updater).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
|
||||
it("should restore changed flag on error so retry can happen", async () => {
|
||||
const updater = vi.fn()
|
||||
.mockRejectedValueOnce(new Error("Network error"))
|
||||
.mockResolvedValue(undefined);
|
||||
|
||||
const spacedUpdate = new SpacedUpdate(updater, 50);
|
||||
|
||||
spacedUpdate.scheduleUpdate();
|
||||
|
||||
// Advance to trigger first update (which will fail)
|
||||
await vi.advanceTimersByTimeAsync(60);
|
||||
|
||||
// The error should have restored the changed flag, so scheduling again should work
|
||||
spacedUpdate.scheduleUpdate();
|
||||
await vi.advanceTimersByTimeAsync(60);
|
||||
|
||||
expect(updater).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
});
|
||||
@@ -77,16 +77,22 @@ export default class SpacedUpdate {
|
||||
}
|
||||
|
||||
if (Date.now() - this.lastUpdated > this.updateInterval) {
|
||||
// Update these BEFORE the async call to prevent race conditions.
|
||||
// Multiple setTimeout callbacks may be pending from recursive scheduleUpdate() calls.
|
||||
// Without this, they would all pass the time check during the await and trigger multiple requests.
|
||||
this.lastUpdated = Date.now();
|
||||
this.changed = false;
|
||||
|
||||
this.onStateChanged("saving");
|
||||
try {
|
||||
await this.updater();
|
||||
this.onStateChanged("saved");
|
||||
this.changed = false;
|
||||
} catch (e) {
|
||||
// Restore changed flag on error so a retry can happen
|
||||
this.changed = true;
|
||||
this.onStateChanged("error");
|
||||
logError(getErrorMessage(e));
|
||||
}
|
||||
this.lastUpdated = Date.now();
|
||||
} else {
|
||||
// update isn't triggered but changes are still pending, so we need to schedule another check
|
||||
this.scheduleUpdate();
|
||||
|
||||
@@ -33,6 +33,14 @@ export async function formatCodeBlocks($container: JQuery<HTMLElement>) {
|
||||
applySingleBlockSyntaxHighlight($(codeBlock), normalizedMimeType);
|
||||
}
|
||||
}
|
||||
|
||||
// Add click-to-copy for inline code (code elements not inside pre)
|
||||
if (glob.device !== "print") {
|
||||
const inlineCodeElements = $container.find("code:not(pre code)");
|
||||
for (const inlineCode of inlineCodeElements) {
|
||||
applyInlineCodeCopy($(inlineCode));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function applyCopyToClipboardButton($codeBlock: JQuery<HTMLElement>) {
|
||||
@@ -51,6 +59,22 @@ export function applyCopyToClipboardButton($codeBlock: JQuery<HTMLElement>) {
|
||||
$codeBlock.parent().append($copyButton);
|
||||
}
|
||||
|
||||
export function applyInlineCodeCopy($inlineCode: JQuery<HTMLElement>) {
|
||||
$inlineCode
|
||||
.addClass("copyable-inline-code")
|
||||
.attr("title", t("code_block.click_to_copy"))
|
||||
.on("click", (e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
const text = $inlineCode.text();
|
||||
if (!isShare) {
|
||||
copyTextWithToast(text);
|
||||
} else {
|
||||
copyText(text);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies syntax highlight to the given code block (assumed to be <pre><code>), using highlight.js.
|
||||
*/
|
||||
|
||||
@@ -99,7 +99,7 @@ class SetupController {
|
||||
}
|
||||
|
||||
private async finish() {
|
||||
const syncServerHost = this.syncServerHostInput.value.trim();
|
||||
const syncServerHost = this.syncServerHostInput.value.trim().replace(/\/+$/, "");
|
||||
const syncProxy = this.syncProxyInput.value.trim();
|
||||
const password = this.passwordInput.value;
|
||||
|
||||
|
||||
@@ -626,7 +626,8 @@
|
||||
"date-and-time": "التاريخ والوقت",
|
||||
"no_backup_yet": "لايوجد نسخة احتياطية لحد الان",
|
||||
"enable_daily_backup": "تمكين النسخ الاحتياطي اليومي",
|
||||
"backup_database_now": "نسخ اختياطي لقاعدة البيانات الان"
|
||||
"backup_database_now": "نسخ اختياطي لقاعدة البيانات الان",
|
||||
"download": "تنزيل"
|
||||
},
|
||||
"etapi": {
|
||||
"created": "تم الأنشاء",
|
||||
|
||||
@@ -806,7 +806,11 @@
|
||||
"board": "Board",
|
||||
"presentation": "Presentation",
|
||||
"include_archived_notes": "Show archived notes",
|
||||
"hide_child_notes": "Hide child notes in tree"
|
||||
"hide_child_notes": "Hide child notes in tree",
|
||||
"open_all_in_tabs": "Open all",
|
||||
"open_all_in_tabs_tooltip": "Open all results in new tabs",
|
||||
"open_all_confirm": "This will open {{count}} notes in new tabs. Continue?",
|
||||
"open_all_too_many": "Too many results ({{count}}). Maximum is {{max}}."
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "No edited notes on this day yet...",
|
||||
@@ -860,7 +864,8 @@
|
||||
"collapse": "Collapse to normal size",
|
||||
"title": "Note Map",
|
||||
"fix-nodes": "Fix nodes",
|
||||
"link-distance": "Link distance"
|
||||
"link-distance": "Link distance",
|
||||
"too-many-notes": "This subtree contains {{count}} notes, which exceeds the limit of {{max}} that can be displayed in the note map."
|
||||
},
|
||||
"note_paths": {
|
||||
"title": "Note Paths",
|
||||
@@ -1401,7 +1406,8 @@
|
||||
"date-and-time": "Date & time",
|
||||
"path": "Path",
|
||||
"database_backed_up_to": "Database has been backed up to {{backupFilePath}}",
|
||||
"no_backup_yet": "no backup yet"
|
||||
"no_backup_yet": "no backup yet",
|
||||
"download": "Download"
|
||||
},
|
||||
"etapi": {
|
||||
"title": "ETAPI",
|
||||
@@ -1513,7 +1519,7 @@
|
||||
"config_title": "Sync Configuration",
|
||||
"server_address": "Server instance address",
|
||||
"timeout": "Sync timeout",
|
||||
"timeout_unit": "milliseconds",
|
||||
"timeout_description": "How long to wait before giving up on a slow sync connection. Increase if you have an unstable network.",
|
||||
"proxy_label": "Sync proxy server (optional)",
|
||||
"note": "Note",
|
||||
"note_description": "If you leave the proxy setting blank, the system proxy will be used (applies to desktop/electron build only).",
|
||||
@@ -1870,7 +1876,8 @@
|
||||
"theme_none": "No syntax highlighting",
|
||||
"theme_group_light": "Light themes",
|
||||
"theme_group_dark": "Dark themes",
|
||||
"copy_title": "Copy to clipboard"
|
||||
"copy_title": "Copy to clipboard",
|
||||
"click_to_copy": "Click to copy"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Formatting"
|
||||
|
||||
@@ -1332,7 +1332,8 @@
|
||||
"date-and-time": "Fecha y hora",
|
||||
"path": "Ruta",
|
||||
"database_backed_up_to": "Se ha realizado una copia de seguridad de la base de datos en {{backupFilePath}}",
|
||||
"no_backup_yet": "no hay copia de seguridad todavía"
|
||||
"no_backup_yet": "no hay copia de seguridad todavía",
|
||||
"download": "Descargar"
|
||||
},
|
||||
"etapi": {
|
||||
"title": "ETAPI",
|
||||
|
||||
@@ -87,7 +87,7 @@ function buildUserAttribute(attr: AttributeWithDefinitions): ComponentChildren {
|
||||
content = <><Icon icon={value === "true" ? "bx bx-check-square" : "bx bx-square"} />{" "}<strong>{attr.friendlyName}</strong></>;
|
||||
break;
|
||||
case "url":
|
||||
content = <a href={value} target="_blank" rel="noopener noreferrer">{attr.friendlyName}</a>;
|
||||
content = <a href={value} target="_blank" rel="noopener noreferrer" onClick={(e) => e.stopPropagation()}>{attr.friendlyName}</a>;
|
||||
break;
|
||||
case "color":
|
||||
style = { backgroundColor: value, color: getReadableTextColor(value) };
|
||||
|
||||
@@ -180,11 +180,13 @@ export function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOpt
|
||||
|
||||
// Refresh on alterations to the note subtree.
|
||||
useTriliumEvent("entitiesReloaded", ({ loadResults }) => {
|
||||
if (note && loadResults.getBranchRows().some(branch =>
|
||||
branch.parentNoteId === note.noteId
|
||||
|| noteIds.includes(branch.parentNoteId ?? ""))
|
||||
if (note && (
|
||||
loadResults.getNoteReorderings().includes(note.noteId)
|
||||
|| loadResults.getBranchRows().some(branch =>
|
||||
branch.parentNoteId === note.noteId
|
||||
|| noteIds.includes(branch.parentNoteId ?? ""))
|
||||
|| loadResults.getAttributeRows().some(attr => attr.name === "archived" && attr.noteId && noteIds.includes(attr.noteId))
|
||||
) {
|
||||
)) {
|
||||
refreshNoteIds();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -75,7 +75,7 @@ export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg)
|
||||
|
||||
|
||||
if (dateNote.hasChildren()) {
|
||||
const childNoteIds = await dateNote.getSubtreeNoteIds();
|
||||
const childNoteIds = dateNote.getChildNoteIds();
|
||||
for (const childNoteId of childNoteIds) {
|
||||
childNoteToDateMapping[childNoteId] = startDate;
|
||||
}
|
||||
|
||||
@@ -144,7 +144,12 @@ export default function CalendarView({ note, noteIds }: ViewModeProps<CalendarVi
|
||||
const event = api.getEventById(noteId);
|
||||
const note = froca.getNoteFromCache(noteId);
|
||||
if (!event || !note) continue;
|
||||
event.setProp("title", note.title);
|
||||
// Only update the title if it has actually changed.
|
||||
// setProp() triggers FullCalendar's eventChange callback, which would
|
||||
// re-save the event's dates and cause unwanted side effects.
|
||||
if (event.title !== note.title) {
|
||||
event.setProp("title", note.title);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -299,6 +304,12 @@ function useEditing(note: FNote, isEditable: boolean, isCalendarRoot: boolean, c
|
||||
}, [ note, componentId ]);
|
||||
|
||||
const onEventChange = useCallback(async (e: EventChangeArg) => {
|
||||
// Only process actual date/time changes, not other property changes (e.g., title via setProp).
|
||||
const datesChanged = e.oldEvent.start?.getTime() !== e.event.start?.getTime()
|
||||
|| e.oldEvent.end?.getTime() !== e.event.end?.getTime()
|
||||
|| e.oldEvent.allDay !== e.event.allDay;
|
||||
if (!datesChanged) return;
|
||||
|
||||
const { startDate, endDate } = parseStartEndDateFromEvent(e.event);
|
||||
if (!startDate) return;
|
||||
|
||||
|
||||
@@ -51,6 +51,8 @@ export default function useRowTableEditing(api: RefObject<Tabulator>, attributeD
|
||||
if (type === "labels") {
|
||||
if (typeof newValue === "boolean") {
|
||||
newValue = newValue ? "true" : "false";
|
||||
} else if (typeof newValue === "number") {
|
||||
newValue = String(newValue);
|
||||
}
|
||||
setLabel(noteId, name, newValue);
|
||||
} else if (type === "relations") {
|
||||
|
||||
@@ -80,9 +80,19 @@ export default function JumpToNoteDialogComponent() {
|
||||
break;
|
||||
}
|
||||
|
||||
$autoComplete
|
||||
.trigger("focus")
|
||||
.trigger("select");
|
||||
$autoComplete.trigger("focus");
|
||||
|
||||
if (mode === "commands") {
|
||||
// In command mode, place caret at end instead of selecting all text
|
||||
// This preserves the ">" prefix when the user starts typing
|
||||
const input = autocompleteRef.current;
|
||||
if (input) {
|
||||
const len = input.value.length;
|
||||
input.setSelectionRange(len, len);
|
||||
}
|
||||
} else {
|
||||
$autoComplete.trigger("select");
|
||||
}
|
||||
|
||||
// Add keyboard shortcut for full search
|
||||
shortcutService.bindElShortcut($autoComplete, "ctrl+return", () => {
|
||||
|
||||
@@ -9,7 +9,6 @@ import appContext, { type EventData } from "../components/app_context.js";
|
||||
import type FNote from "../entities/fnote.js";
|
||||
import attributeService from "../services/attributes.js";
|
||||
import { t } from "../services/i18n.js";
|
||||
import katex from "../services/math.js";
|
||||
import options from "../services/options.js";
|
||||
import OnClickButtonWidget from "./buttons/onclick_button.js";
|
||||
import RightPanelWidget from "./right_panel_widget.js";
|
||||
@@ -125,77 +124,6 @@ export default class HighlightsListWidget extends RightPanelWidget {
|
||||
this.triggerCommand("reEvaluateRightPaneVisibility");
|
||||
}
|
||||
|
||||
extractOuterTag(htmlStr: string | null) {
|
||||
if (htmlStr === null) {
|
||||
return null;
|
||||
}
|
||||
// Regular expressions that match only the outermost tag
|
||||
const regex = /^<([a-zA-Z]+)([^>]*)>/;
|
||||
const match = htmlStr.match(regex);
|
||||
if (match) {
|
||||
const tagName = match[1].toLowerCase(); // Extract tag name
|
||||
const attributes = match[2].trim(); // Extract label attributes
|
||||
return { tagName, attributes };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
areOuterTagsConsistent(str1: string | null, str2: string | null) {
|
||||
const tag1 = this.extractOuterTag(str1);
|
||||
const tag2 = this.extractOuterTag(str2);
|
||||
// If one of them has no label, returns false
|
||||
if (!tag1 || !tag2) {
|
||||
return false;
|
||||
}
|
||||
// Compare tag names and attributes to see if they are the same
|
||||
return tag1.tagName === tag2.tagName && tag1.attributes === tag2.attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rendering formulas in strings using katex
|
||||
*
|
||||
* @param html Note's html content
|
||||
* @returns The HTML content with mathematical formulas rendered by KaTeX.
|
||||
*/
|
||||
async replaceMathTextWithKatax(html: string) {
|
||||
const mathTextRegex = /<span class="math-tex">\\\(([\s\S]*?)\\\)<\/span>/g;
|
||||
const matches = [...html.matchAll(mathTextRegex)];
|
||||
let modifiedText = html;
|
||||
|
||||
if (matches.length > 0) {
|
||||
// Process all matches asynchronously
|
||||
for (const match of matches) {
|
||||
const latexCode = match[1];
|
||||
let rendered;
|
||||
|
||||
try {
|
||||
rendered = katex.renderToString(latexCode, {
|
||||
throwOnError: false
|
||||
});
|
||||
} catch (e) {
|
||||
if (e instanceof ReferenceError && e.message.includes("katex is not defined")) {
|
||||
// Load KaTeX if it is not already loaded
|
||||
try {
|
||||
rendered = katex.renderToString(latexCode, {
|
||||
throwOnError: false
|
||||
});
|
||||
} catch (renderError) {
|
||||
console.error("KaTeX rendering error after loading library:", renderError);
|
||||
rendered = match[0]; // Fall back to original if error persists
|
||||
}
|
||||
} else {
|
||||
console.error("KaTeX rendering error:", e);
|
||||
rendered = match[0]; // Fall back to original on error
|
||||
}
|
||||
}
|
||||
|
||||
// Replace the matched formula in the modified text
|
||||
modifiedText = modifiedText.replace(match[0], rendered);
|
||||
}
|
||||
}
|
||||
return modifiedText;
|
||||
}
|
||||
|
||||
async getHighlightList(content: string, optionsHighlightsList: string[]) {
|
||||
// matches a span containing background-color
|
||||
const regex1 = /<span[^>]*style\s*=\s*[^>]*background-color:[^>]*?>[\s\S]*?<\/span>/gi;
|
||||
@@ -239,9 +167,6 @@ export default class HighlightsListWidget extends RightPanelWidget {
|
||||
const $highlightsList = $("<ol>");
|
||||
let prevEndIndex = -1,
|
||||
hlLiCount = 0;
|
||||
let prevSubHtml: string | null = null;
|
||||
// Used to determine if a string is only a formula
|
||||
const onlyMathRegex = /^<span class="math-tex">\\\([^\)]*?\)<\/span>(?:<span class="math-tex">\\\([^\)]*?\)<\/span>)*$/;
|
||||
|
||||
for (let match: RegExpMatchArray | null = null, hltIndex = 0; (match = combinedRegex.exec(content)) !== null; hltIndex++) {
|
||||
const subHtml = match[0];
|
||||
@@ -257,25 +182,14 @@ export default class HighlightsListWidget extends RightPanelWidget {
|
||||
// If the previous element is connected to this element in HTML, then concatenate them into one.
|
||||
$highlightsList.children().last().append(subHtml);
|
||||
} else {
|
||||
// TODO: can't be done with $(subHtml).text()?
|
||||
//Can’t remember why regular expressions are used here, but modified to $(subHtml).text() works as expected
|
||||
//const hasText = [...subHtml.matchAll(/(?<=^|>)[^><]+?(?=<|$)/g)].map(matchTmp => matchTmp[0]).join('').trim();
|
||||
const hasText = $(subHtml).text().trim();
|
||||
|
||||
if (hasText) {
|
||||
const substring = content.substring(prevEndIndex, startIndex);
|
||||
//If the two elements have the same style and there are only formulas in between, append the formulas and the current element to the end of the previous element.
|
||||
if (this.areOuterTagsConsistent(prevSubHtml, subHtml) && onlyMathRegex.test(substring)) {
|
||||
const $lastLi = $highlightsList.children("li").last();
|
||||
$lastLi.append(await this.replaceMathTextWithKatax(substring));
|
||||
$lastLi.append(subHtml);
|
||||
} else {
|
||||
$highlightsList.append(
|
||||
$("<li>")
|
||||
.html(subHtml)
|
||||
.on("click", () => this.jumpToHighlightsList(findSubStr, hltIndex))
|
||||
);
|
||||
}
|
||||
$highlightsList.append(
|
||||
$("<li>")
|
||||
.html(subHtml)
|
||||
.on("click", () => this.jumpToHighlightsList(findSubStr, hltIndex))
|
||||
);
|
||||
|
||||
hlLiCount++;
|
||||
} else {
|
||||
@@ -284,7 +198,6 @@ export default class HighlightsListWidget extends RightPanelWidget {
|
||||
}
|
||||
}
|
||||
prevEndIndex = endIndex;
|
||||
prevSubHtml = subHtml;
|
||||
}
|
||||
return {
|
||||
$highlightsList,
|
||||
|
||||
@@ -2,10 +2,13 @@ import "./CollectionProperties.css";
|
||||
|
||||
import { t } from "i18next";
|
||||
import { ComponentChildren } from "preact";
|
||||
import { useRef } from "preact/hooks";
|
||||
import { useRef, useState } from "preact/hooks";
|
||||
|
||||
import FNote from "../../entities/fnote";
|
||||
import appContext from "../../components/app_context";
|
||||
import dialogService from "../../services/dialog";
|
||||
import { ViewTypeOptions } from "../collections/interface";
|
||||
import ActionButton from "../react/ActionButton";
|
||||
import Dropdown from "../react/Dropdown";
|
||||
import { FormDropdownDivider, FormListItem } from "../react/FormList";
|
||||
import { useNoteProperty, useTriliumEvent } from "../react/hooks";
|
||||
@@ -24,6 +27,8 @@ export const ICON_MAPPINGS: Record<ViewTypeOptions, string> = {
|
||||
presentation: "bx bx-rectangle"
|
||||
};
|
||||
|
||||
const MAX_OPEN_TABS = 50;
|
||||
|
||||
export default function CollectionProperties({ note, centerChildren, rightChildren }: {
|
||||
note: FNote;
|
||||
centerChildren?: ComponentChildren;
|
||||
@@ -31,6 +36,7 @@ export default function CollectionProperties({ note, centerChildren, rightChildr
|
||||
}) {
|
||||
const [ viewType, setViewType ] = useViewType(note);
|
||||
const noteType = useNoteProperty(note, "type");
|
||||
const [ isOpening, setIsOpening ] = useState(false);
|
||||
|
||||
return ([ "book", "search" ].includes(noteType ?? "") &&
|
||||
<div className="collection-properties">
|
||||
@@ -43,11 +49,59 @@ export default function CollectionProperties({ note, centerChildren, rightChildr
|
||||
</div>
|
||||
<div className="right-container">
|
||||
{rightChildren}
|
||||
{noteType === "search" && (
|
||||
<OpenAllButton note={note} isOpening={isOpening} setIsOpening={setIsOpening} />
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function OpenAllButton({ note, isOpening, setIsOpening }: {
|
||||
note: FNote;
|
||||
isOpening: boolean;
|
||||
setIsOpening: (value: boolean) => void;
|
||||
}) {
|
||||
const noteIds = note.getChildNoteIds();
|
||||
const count = noteIds.length;
|
||||
|
||||
const handleOpenAll = async () => {
|
||||
if (count === 0) return;
|
||||
|
||||
if (count > MAX_OPEN_TABS) {
|
||||
await dialogService.info(t("book_properties.open_all_too_many", { count, max: MAX_OPEN_TABS }));
|
||||
return;
|
||||
}
|
||||
|
||||
if (count > 10) {
|
||||
const confirmed = await dialogService.confirm(t("book_properties.open_all_confirm", { count }));
|
||||
if (!confirmed) return;
|
||||
}
|
||||
|
||||
setIsOpening(true);
|
||||
try {
|
||||
for (let i = 0; i < noteIds.length; i++) {
|
||||
const noteId = noteIds[i];
|
||||
const isLast = i === noteIds.length - 1;
|
||||
await appContext.tabManager.openTabWithNoteWithHoisting(noteId, {
|
||||
activate: isLast
|
||||
});
|
||||
}
|
||||
} finally {
|
||||
setIsOpening(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<ActionButton
|
||||
icon={isOpening ? "bx bx-loader-alt bx-spin" : "bx bx-window-open"}
|
||||
text={t("book_properties.open_all_in_tabs_tooltip")}
|
||||
onClick={handleOpenAll}
|
||||
disabled={count === 0 || isOpening}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
function ViewTypeSwitcher({ viewType, setViewType }: { viewType: ViewTypeOptions, setViewType: (newValue: ViewTypeOptions) => void }) {
|
||||
// Keyboard shortcut
|
||||
const dropdownContainerRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
@@ -42,8 +42,11 @@ export default function NoteIcon() {
|
||||
setIcon(note?.getIcon());
|
||||
}, [ note, iconClass, workspaceIconClass ]);
|
||||
|
||||
const isDisabled = viewScope?.viewMode !== "default"
|
||||
|| note?.isMetadataReadOnly;
|
||||
|
||||
if (isMobile()) {
|
||||
return <MobileNoteIconSwitcher note={note} icon={icon} />;
|
||||
return <MobileNoteIconSwitcher note={note} icon={icon} disabled={isDisabled} />;
|
||||
}
|
||||
|
||||
return (
|
||||
@@ -55,16 +58,17 @@ export default function NoteIcon() {
|
||||
dropdownOptions={{ autoClose: "outside" }}
|
||||
buttonClassName={`note-icon tn-focusable-button ${icon ?? "bx bx-empty"}`}
|
||||
hideToggleArrow
|
||||
disabled={viewScope?.viewMode !== "default"}
|
||||
disabled={isDisabled}
|
||||
>
|
||||
{ note && <NoteIconList note={note} onHide={() => dropdownRef?.current?.hide()} columnCount={12} /> }
|
||||
</Dropdown>
|
||||
);
|
||||
}
|
||||
|
||||
function MobileNoteIconSwitcher({ note, icon }: {
|
||||
function MobileNoteIconSwitcher({ note, icon, disabled }: {
|
||||
note: FNote | null | undefined;
|
||||
icon: string | null | undefined;
|
||||
disabled?: boolean;
|
||||
}) {
|
||||
const [ modalShown, setModalShown ] = useState(false);
|
||||
const { windowWidth } = useWindowSize();
|
||||
@@ -76,6 +80,7 @@ function MobileNoteIconSwitcher({ note, icon }: {
|
||||
icon={icon ?? "bx bx-empty"}
|
||||
text={t("note_icon.change_note_icon")}
|
||||
onClick={() => setModalShown(true)}
|
||||
disabled={disabled}
|
||||
/>
|
||||
|
||||
{createPortal((
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.note-detail-note-map {
|
||||
height: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@@ -54,4 +54,4 @@
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
/* End of styling the slider */
|
||||
/* End of styling the slider */
|
||||
|
||||
@@ -12,11 +12,15 @@ import { t } from "../../services/i18n";
|
||||
import { getEffectiveThemeStyle } from "../../services/theme";
|
||||
import ActionButton from "../react/ActionButton";
|
||||
import { useElementSize, useNoteLabel } from "../react/hooks";
|
||||
import NoItems from "../react/NoItems";
|
||||
import Slider from "../react/Slider";
|
||||
import { loadNotesAndRelations, NoteMapLinkObject, NoteMapNodeObject, NotesAndRelationsData } from "./data";
|
||||
import { CssData, setupRendering } from "./rendering";
|
||||
import { MapType, NoteMapWidgetMode, rgb2hex } from "./utils";
|
||||
|
||||
/** Maximum number of notes to render in the note map before showing a warning. */
|
||||
const MAX_NOTES_THRESHOLD = 1_000;
|
||||
|
||||
interface NoteMapProps {
|
||||
note: FNote;
|
||||
widgetMode: NoteMapWidgetMode;
|
||||
@@ -34,6 +38,7 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) {
|
||||
const containerSize = useElementSize(parentRef);
|
||||
const [ fixNodes, setFixNodes ] = useState(false);
|
||||
const [ linkDistance, setLinkDistance ] = useState(40);
|
||||
const [ tooManyNotes, setTooManyNotes ] = useState<number | null>(null);
|
||||
const notesAndRelationsRef = useRef<NotesAndRelationsData>();
|
||||
|
||||
const mapRootId = useMemo(() => {
|
||||
@@ -61,6 +66,14 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) {
|
||||
const includeRelations = labelValues("mapIncludeRelation");
|
||||
loadNotesAndRelations(mapRootId, excludeRelations, includeRelations, mapType).then((notesAndRelations) => {
|
||||
if (!containerRef.current || !styleResolverRef.current) return;
|
||||
|
||||
// Guard against rendering too many notes which would freeze the browser.
|
||||
if (notesAndRelations.nodes.length > MAX_NOTES_THRESHOLD) {
|
||||
setTooManyNotes(notesAndRelations.nodes.length);
|
||||
return;
|
||||
}
|
||||
setTooManyNotes(null);
|
||||
|
||||
const cssData = getCssData(containerRef.current, styleResolverRef.current);
|
||||
|
||||
// Configure rendering properties.
|
||||
@@ -119,6 +132,12 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) {
|
||||
});
|
||||
}, [ fixNodes, mapType ]);
|
||||
|
||||
if (tooManyNotes) {
|
||||
return (
|
||||
<NoItems icon="bx bx-error-circle" text={t("note_map.too-many-notes", { count: tooManyNotes, max: MAX_NOTES_THRESHOLD })} />
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="note-map-widget">
|
||||
<div className="btn-group btn-group-sm map-type-switcher content-floating-buttons top-left" role="group">
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
import { useEffect, useRef, useState } from "preact/hooks";
|
||||
import { t } from "../services/i18n";
|
||||
import FormTextBox from "./react/FormTextBox";
|
||||
import { useNoteContext, useNoteProperty, useSpacedUpdate, useTriliumEvent, useTriliumEvents } from "./react/hooks";
|
||||
import protected_session_holder from "../services/protected_session_holder";
|
||||
import server from "../services/server";
|
||||
import "./note_title.css";
|
||||
import { isLaunchBarConfig } from "../services/utils";
|
||||
|
||||
import clsx from "clsx";
|
||||
import { useEffect, useRef, useState } from "preact/hooks";
|
||||
|
||||
import appContext from "../components/app_context";
|
||||
import branches from "../services/branches";
|
||||
import { t } from "../services/i18n";
|
||||
import protected_session_holder from "../services/protected_session_holder";
|
||||
import server from "../services/server";
|
||||
import { isIMEComposing } from "../services/shortcuts";
|
||||
import clsx from "clsx";
|
||||
import FormTextBox from "./react/FormTextBox";
|
||||
import { useNoteContext, useNoteProperty, useSpacedUpdate, useTriliumEvent, useTriliumEvents } from "./react/hooks";
|
||||
|
||||
export default function NoteTitleWidget(props: {className?: string}) {
|
||||
const { note, noteId, componentId, viewScope, noteContext, parentComponent } = useNoteContext();
|
||||
@@ -25,8 +26,7 @@ export default function NoteTitleWidget(props: {className?: string}) {
|
||||
const isReadOnly = note === null
|
||||
|| note === undefined
|
||||
|| (note.isProtected && !protected_session_holder.isProtectedSessionAvailable())
|
||||
|| isLaunchBarConfig(note.noteId)
|
||||
|| note.noteId.startsWith("_help_")
|
||||
|| note.isMetadataReadOnly
|
||||
|| viewScope?.viewMode !== "default";
|
||||
setReadOnly(isReadOnly);
|
||||
}, [ note, note?.noteId, note?.isProtected, viewScope?.viewMode ]);
|
||||
@@ -58,11 +58,29 @@ export default function NoteTitleWidget(props: {className?: string}) {
|
||||
// Manage focus.
|
||||
const textBoxRef = useRef<HTMLInputElement>(null);
|
||||
const isNewNote = useRef<boolean>();
|
||||
const pendingSelect = useRef<boolean>(false);
|
||||
|
||||
// Re-apply selection when title changes if we have a pending select.
|
||||
// This handles the case where the server sends back entity changes after we've
|
||||
// already called select(), which causes the controlled input to re-render and lose selection.
|
||||
useEffect(() => {
|
||||
if (pendingSelect.current && textBoxRef.current && document.activeElement === textBoxRef.current) {
|
||||
textBoxRef.current.select();
|
||||
pendingSelect.current = false;
|
||||
}
|
||||
}, [title]);
|
||||
|
||||
useTriliumEvents([ "focusOnTitle", "focusAndSelectTitle" ], (e, eventName) => {
|
||||
if (noteContext?.isActive() && textBoxRef.current) {
|
||||
// In the new layout, there are two NoteTitleWidget instances. Only handle if visible.
|
||||
if (!textBoxRef.current.checkVisibility({ checkOpacity: true })) {
|
||||
return;
|
||||
}
|
||||
|
||||
textBoxRef.current.focus();
|
||||
if (eventName === "focusAndSelectTitle") {
|
||||
textBoxRef.current.select();
|
||||
pendingSelect.current = true;
|
||||
}
|
||||
isNewNote.current = ("isNewNote" in e ? e.isNewNote : false);
|
||||
}
|
||||
@@ -83,6 +101,9 @@ export default function NoteTitleWidget(props: {className?: string}) {
|
||||
spacedUpdate.scheduleUpdate();
|
||||
}}
|
||||
onKeyDown={(e) => {
|
||||
// User started typing, stop re-applying selection
|
||||
pendingSelect.current = false;
|
||||
|
||||
// Skip processing if IME is composing to prevent interference
|
||||
// with text input in CJK languages
|
||||
if (isIMEComposing(e)) {
|
||||
@@ -101,6 +122,7 @@ export default function NoteTitleWidget(props: {className?: string}) {
|
||||
}
|
||||
}}
|
||||
onBlur={() => {
|
||||
pendingSelect.current = false;
|
||||
spacedUpdate.updateNowIfNecessary();
|
||||
isNewNote.current = false;
|
||||
}}
|
||||
|
||||
@@ -825,13 +825,43 @@ export function useWindowSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
// Workaround for https://github.com/twbs/bootstrap/issues/37474
|
||||
// Bootstrap's dispose() sets ALL properties to null. But pending animation callbacks
|
||||
// (scheduled via setTimeout) can still fire and crash when accessing null properties.
|
||||
// We patch dispose() to set safe placeholder values instead of null.
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const TooltipProto = Tooltip.prototype as any;
|
||||
const originalDispose = TooltipProto.dispose;
|
||||
const disposedTooltipPlaceholder = {
|
||||
activeTrigger: {},
|
||||
element: document.createElement("noscript")
|
||||
};
|
||||
TooltipProto.dispose = function () {
|
||||
originalDispose.call(this);
|
||||
// After disposal, set safe values so pending callbacks don't crash
|
||||
this._activeTrigger = disposedTooltipPlaceholder.activeTrigger;
|
||||
this._element = disposedTooltipPlaceholder.element;
|
||||
};
|
||||
|
||||
export function useTooltip(elRef: RefObject<HTMLElement>, config: Partial<Tooltip.Options>) {
|
||||
useEffect(() => {
|
||||
if (!elRef?.current) return;
|
||||
|
||||
const $el = $(elRef.current);
|
||||
$el.tooltip("dispose");
|
||||
const element = elRef.current;
|
||||
const $el = $(element);
|
||||
|
||||
// Dispose any existing tooltip before creating a new one
|
||||
Tooltip.getInstance(element)?.dispose();
|
||||
$el.tooltip(config);
|
||||
|
||||
// Capture the tooltip instance now, since elRef.current may be null during cleanup.
|
||||
const tooltip = Tooltip.getInstance(element);
|
||||
|
||||
return () => {
|
||||
if (element.isConnected) {
|
||||
tooltip?.dispose();
|
||||
}
|
||||
};
|
||||
}, [ elRef, config ]);
|
||||
|
||||
const showTooltip = useCallback(() => {
|
||||
@@ -866,8 +896,14 @@ export function useStaticTooltip(elRef: RefObject<Element>, config?: Partial<Too
|
||||
const hasTooltip = config?.title || elRef.current?.getAttribute("title");
|
||||
if (!elRef?.current || !hasTooltip) return;
|
||||
|
||||
const tooltip = Tooltip.getOrCreateInstance(elRef.current, config);
|
||||
elRef.current.addEventListener("show.bs.tooltip", () => {
|
||||
// Capture element now, since elRef.current may be null during cleanup.
|
||||
const element = elRef.current;
|
||||
|
||||
// Dispose any existing tooltip before creating a new one
|
||||
Tooltip.getInstance(element)?.dispose();
|
||||
|
||||
const tooltip = new Tooltip(element, config);
|
||||
element.addEventListener("show.bs.tooltip", () => {
|
||||
// Hide all the other tooltips.
|
||||
for (const otherTooltip of tooltips) {
|
||||
if (otherTooltip === tooltip) continue;
|
||||
@@ -878,12 +914,11 @@ export function useStaticTooltip(elRef: RefObject<Element>, config?: Partial<Too
|
||||
|
||||
return () => {
|
||||
tooltips.delete(tooltip);
|
||||
tooltip.dispose();
|
||||
// workaround for https://github.com/twbs/bootstrap/issues/37474
|
||||
(tooltip as any)._activeTrigger = {};
|
||||
(tooltip as any)._element = document.createElement('noscript'); // placeholder with no behavior
|
||||
if (element.isConnected) {
|
||||
tooltip.dispose();
|
||||
}
|
||||
|
||||
// Remove *all* tooltip elements from the DOM
|
||||
// Remove any lingering tooltip popup elements from the DOM.
|
||||
document
|
||||
.querySelectorAll('.tooltip')
|
||||
.forEach(t => t.remove());
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import { CKTextEditor, ModelText } from "@triliumnext/ckeditor5";
|
||||
import { createPortal } from "preact/compat";
|
||||
import { useCallback, useEffect, useState } from "preact/hooks";
|
||||
import { useCallback, useEffect, useRef, useState } from "preact/hooks";
|
||||
|
||||
import { t } from "../../services/i18n";
|
||||
import math from "../../services/math";
|
||||
import { randomString } from "../../services/utils";
|
||||
import { useActiveNoteContext, useContentElement, useIsNoteReadOnly, useNoteProperty, useTextEditor, useTriliumOptionJson } from "../react/hooks";
|
||||
import Modal from "../react/Modal";
|
||||
import RawHtml from "../react/RawHtml";
|
||||
import { HighlightsListOptions } from "../type_widgets/options/text_notes";
|
||||
import RightPanelWidget from "./RightPanelWidget";
|
||||
|
||||
@@ -84,20 +86,11 @@ function AbstractHighlightsList<T extends RawHighlight>({ highlights, scrollToHi
|
||||
{filteredHighlights.length > 0 ? (
|
||||
<ol>
|
||||
{filteredHighlights.map(highlight => (
|
||||
<li
|
||||
<HighlightItem
|
||||
key={highlight.id}
|
||||
highlight={highlight}
|
||||
onClick={() => scrollToHighlight(highlight)}
|
||||
>
|
||||
<span
|
||||
style={{
|
||||
fontWeight: highlight.attrs.bold ? "700" : undefined,
|
||||
fontStyle: highlight.attrs.italic ? "italic" : undefined,
|
||||
textDecoration: highlight.attrs.underline ? "underline" : undefined,
|
||||
color: highlight.attrs.color,
|
||||
backgroundColor: highlight.attrs.background
|
||||
}}
|
||||
>{highlight.text}</span>
|
||||
</li>
|
||||
/>
|
||||
))}
|
||||
</ol>
|
||||
) : (
|
||||
@@ -112,6 +105,43 @@ function AbstractHighlightsList<T extends RawHighlight>({ highlights, scrollToHi
|
||||
);
|
||||
}
|
||||
|
||||
function HighlightItem<T extends RawHighlight>({ highlight, onClick }: {
|
||||
highlight: T;
|
||||
onClick(): void;
|
||||
}) {
|
||||
const contentRef = useRef<HTMLElement>(null);
|
||||
|
||||
// Render math equations after component mounts/updates
|
||||
useEffect(() => {
|
||||
if (!contentRef.current) return;
|
||||
const mathElements = contentRef.current.querySelectorAll(".math-tex");
|
||||
|
||||
for (const mathEl of mathElements ?? []) {
|
||||
try {
|
||||
math.render(mathEl.textContent || "", mathEl as HTMLElement);
|
||||
} catch (e) {
|
||||
console.warn("Failed to render math in highlights:", e);
|
||||
}
|
||||
}
|
||||
}, [highlight.text]);
|
||||
|
||||
return (
|
||||
<li onClick={onClick}>
|
||||
<RawHtml
|
||||
containerRef={contentRef}
|
||||
style={{
|
||||
fontWeight: highlight.attrs.bold ? "700" : undefined,
|
||||
fontStyle: highlight.attrs.italic ? "italic" : undefined,
|
||||
textDecoration: highlight.attrs.underline ? "underline" : undefined,
|
||||
color: highlight.attrs.color,
|
||||
backgroundColor: highlight.attrs.background
|
||||
}}
|
||||
html={highlight.text}
|
||||
/>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
|
||||
//#region Editable text (CKEditor)
|
||||
interface CKHighlight extends RawHighlight {
|
||||
textNode: ModelText;
|
||||
@@ -201,9 +231,24 @@ function extractHighlightsFromTextEditor(editor: CKTextEditor) {
|
||||
};
|
||||
|
||||
if (Object.values(attrs).some(Boolean)) {
|
||||
// Get HTML content from DOM (includes nested elements like math)
|
||||
let html = item.data;
|
||||
try {
|
||||
const modelPos = editor.model.createPositionAt(item.textNode, "before");
|
||||
const viewPos = editor.editing.mapper.toViewPosition(modelPos);
|
||||
const domPos = editor.editing.view.domConverter.viewPositionToDom(viewPos);
|
||||
if (domPos?.parent instanceof HTMLElement) {
|
||||
// Get the formatting span's innerHTML (includes math elements)
|
||||
html = domPos.parent.innerHTML;
|
||||
}
|
||||
} catch {
|
||||
// During change:data events, the view may not be fully synchronized with the model.
|
||||
// Fall back to using the raw text data.
|
||||
}
|
||||
|
||||
result.push({
|
||||
id: randomString(),
|
||||
text: item.data,
|
||||
text: html,
|
||||
attrs,
|
||||
textNode: item.textNode,
|
||||
offset: item.startOffset
|
||||
|
||||
@@ -87,7 +87,7 @@ function TableOfContentsHeading({ heading, scrollToHeading, activeHeadingId }: {
|
||||
// Render math equations after component mounts/updates
|
||||
useEffect(() => {
|
||||
if (!contentRef.current) return;
|
||||
const mathElements = contentRef.current.querySelectorAll(".ck-math-tex");
|
||||
const mathElements = contentRef.current.querySelectorAll(".math-tex");
|
||||
|
||||
for (const mathEl of mathElements ?? []) {
|
||||
try {
|
||||
|
||||
@@ -3,6 +3,7 @@ import "./appearance.css";
|
||||
import { FontFamily, OptionNames } from "@triliumnext/commons";
|
||||
import { useEffect, useState } from "preact/hooks";
|
||||
|
||||
import zoomService from "../../../components/zoom";
|
||||
import { t } from "../../../services/i18n";
|
||||
import server from "../../../services/server";
|
||||
import { isElectron, isMobile, reloadFrontendApp, restartDesktopApp } from "../../../services/utils";
|
||||
@@ -14,9 +15,10 @@ import FormGroup from "../../react/FormGroup";
|
||||
import FormRadioGroup from "../../react/FormRadioGroup";
|
||||
import FormSelect, { FormSelectWithGroups } from "../../react/FormSelect";
|
||||
import FormText from "../../react/FormText";
|
||||
import FormTextBox, { FormTextBoxWithUnit } from "../../react/FormTextBox";
|
||||
import { FormTextBoxWithUnit } from "../../react/FormTextBox";
|
||||
import { useTriliumOption, useTriliumOptionBool } from "../../react/hooks";
|
||||
import Icon from "../../react/Icon";
|
||||
import OptionsRow from "./components/OptionsRow";
|
||||
import OptionsSection from "./components/OptionsSection";
|
||||
import PlatformIndicator from "./components/PlatformIndicator";
|
||||
import RadioWithIllustration from "./components/RadioWithIllustration";
|
||||
@@ -333,20 +335,23 @@ function Font({ title, fontFamilyOption, fontSizeOption }: { title: string, font
|
||||
}
|
||||
|
||||
function ElectronIntegration() {
|
||||
const [ zoomFactor, setZoomFactor ] = useTriliumOption("zoomFactor");
|
||||
const [ zoomFactor ] = useTriliumOption("zoomFactor");
|
||||
const [ nativeTitleBarVisible, setNativeTitleBarVisible ] = useTriliumOptionBool("nativeTitleBarVisible");
|
||||
const [ backgroundEffects, setBackgroundEffects ] = useTriliumOptionBool("backgroundEffects");
|
||||
|
||||
const zoomPercentage = Math.round(parseFloat(zoomFactor || "1") * 100);
|
||||
|
||||
return (
|
||||
<OptionsSection title={t("electron_integration.desktop-application")}>
|
||||
<FormGroup name="zoom-factor" label={t("electron_integration.zoom-factor")} description={t("zoom_factor.description")}>
|
||||
<FormTextBox
|
||||
<OptionsRow name="zoom-factor" label={t("electron_integration.zoom-factor")} description={t("zoom_factor.description")}>
|
||||
<FormTextBoxWithUnit
|
||||
type="number"
|
||||
min="0.3" max="2.0" step="0.1"
|
||||
currentValue={zoomFactor} onChange={setZoomFactor}
|
||||
min={50} max={200} step={10}
|
||||
currentValue={String(zoomPercentage)}
|
||||
onChange={(v) => zoomService.setZoomFactorAndSave(parseInt(v, 10) / 100)}
|
||||
unit={t("units.percentage")}
|
||||
/>
|
||||
</FormGroup>
|
||||
<hr/>
|
||||
</OptionsRow>
|
||||
|
||||
<FormGroup name="native-title-bar" description={t("electron_integration.native-title-bar-description")}>
|
||||
<FormCheckbox
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
import { BackupDatabaseNowResponse, DatabaseBackup } from "@triliumnext/commons";
|
||||
import { useCallback, useEffect, useState } from "preact/hooks";
|
||||
|
||||
import { t } from "../../../services/i18n";
|
||||
import server from "../../../services/server";
|
||||
import toast from "../../../services/toast";
|
||||
import { formatDateTime } from "../../../utils/formatters";
|
||||
import Button from "../../react/Button";
|
||||
import FormCheckbox from "../../react/FormCheckbox";
|
||||
import { FormMultiGroup } from "../../react/FormGroup";
|
||||
import FormText from "../../react/FormText";
|
||||
import { useTriliumOptionBool } from "../../react/hooks";
|
||||
import OptionsSection from "./components/OptionsSection";
|
||||
import { useCallback, useEffect, useState } from "preact/hooks";
|
||||
import { formatDateTime } from "../../../utils/formatters";
|
||||
|
||||
export default function BackupSettings() {
|
||||
const [ backups, setBackups ] = useState<DatabaseBackup[]>([]);
|
||||
@@ -35,7 +36,7 @@ export default function BackupSettings() {
|
||||
<BackupNow refreshCallback={refreshBackups} />
|
||||
<BackupList backups={backups} />
|
||||
</>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function AutomaticBackup() {
|
||||
@@ -67,7 +68,7 @@ export function AutomaticBackup() {
|
||||
|
||||
<FormText>{t("backup.backup_recommendation")}</FormText>
|
||||
</OptionsSection>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function BackupNow({ refreshCallback }: { refreshCallback: () => void }) {
|
||||
@@ -82,7 +83,7 @@ export function BackupNow({ refreshCallback }: { refreshCallback: () => void })
|
||||
}}
|
||||
/>
|
||||
</OptionsSection>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function BackupList({ backups }: { backups: DatabaseBackup[] }) {
|
||||
@@ -92,11 +93,13 @@ export function BackupList({ backups }: { backups: DatabaseBackup[] }) {
|
||||
<colgroup>
|
||||
<col width="33%" />
|
||||
<col />
|
||||
<col width="1%" />
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{t("backup.date-and-time")}</th>
|
||||
<th>{t("backup.path")}</th>
|
||||
<th />
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -105,15 +108,20 @@ export function BackupList({ backups }: { backups: DatabaseBackup[] }) {
|
||||
<tr>
|
||||
<td>{mtime ? formatDateTime(mtime) : "-"}</td>
|
||||
<td className="selectable-text">{filePath}</td>
|
||||
<td>
|
||||
<a href={`api/database/backup/download?filePath=${encodeURIComponent(filePath)}`} download>
|
||||
<Button text={t("backup.download")} />
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
))
|
||||
) : (
|
||||
<tr>
|
||||
<td className="empty-table-placeholder" colspan={2}>{t("backup.no_backup_yet")}</td>
|
||||
<td className="empty-table-placeholder" colspan={3}>{t("backup.no_backup_yet")}</td>
|
||||
</tr>
|
||||
)}
|
||||
</tbody>
|
||||
</table>
|
||||
</OptionsSection>
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
import { SyncTestResponse } from "@triliumnext/commons";
|
||||
import { useRef } from "preact/hooks";
|
||||
|
||||
import { t } from "../../../services/i18n";
|
||||
import server from "../../../services/server";
|
||||
import toast from "../../../services/toast";
|
||||
import { openInAppHelpFromUrl } from "../../../services/utils";
|
||||
import Button from "../../react/Button";
|
||||
import FormGroup from "../../react/FormGroup";
|
||||
import FormTextBox, { FormTextBoxWithUnit } from "../../react/FormTextBox";
|
||||
import RawHtml from "../../react/RawHtml";
|
||||
import OptionsSection from "./components/OptionsSection";
|
||||
import { useTriliumOptions } from "../../react/hooks";
|
||||
import FormText from "../../react/FormText";
|
||||
import server from "../../../services/server";
|
||||
import toast from "../../../services/toast";
|
||||
import { SyncTestResponse } from "@triliumnext/commons";
|
||||
import FormTextBox from "../../react/FormTextBox";
|
||||
import { useTriliumOptions } from "../../react/hooks";
|
||||
import RawHtml from "../../react/RawHtml";
|
||||
import OptionsRow from "./components/OptionsRow";
|
||||
import OptionsSection from "./components/OptionsSection";
|
||||
import TimeSelector from "./components/TimeSelector";
|
||||
|
||||
export default function SyncOptions() {
|
||||
return (
|
||||
@@ -18,13 +21,12 @@ export default function SyncOptions() {
|
||||
<SyncConfiguration />
|
||||
<SyncTest />
|
||||
</>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function SyncConfiguration() {
|
||||
const [ options, setOptions ] = useTriliumOptions("syncServerHost", "syncServerTimeout", "syncProxy");
|
||||
const [ options, setOptions ] = useTriliumOptions("syncServerHost", "syncProxy");
|
||||
const syncServerHost = useRef(options.syncServerHost);
|
||||
const syncServerTimeout = useRef(options.syncServerTimeout);
|
||||
const syncProxy = useRef(options.syncProxy);
|
||||
|
||||
return (
|
||||
@@ -32,13 +34,12 @@ export function SyncConfiguration() {
|
||||
<form onSubmit={(e) => {
|
||||
setOptions({
|
||||
syncServerHost: syncServerHost.current,
|
||||
syncServerTimeout: syncServerTimeout.current,
|
||||
syncProxy: syncProxy.current
|
||||
});
|
||||
e.preventDefault();
|
||||
}}>
|
||||
<FormGroup name="sync-server-host" label={t("sync_2.server_address")}>
|
||||
<FormTextBox
|
||||
<FormTextBox
|
||||
placeholder="https://<host>:<port>"
|
||||
currentValue={syncServerHost.current} onChange={(newValue) => syncServerHost.current = newValue}
|
||||
/>
|
||||
@@ -50,27 +51,30 @@ export function SyncConfiguration() {
|
||||
<RawHtml html={t("sync_2.special_value_description")} />
|
||||
</>}
|
||||
>
|
||||
<FormTextBox
|
||||
<FormTextBox
|
||||
placeholder="https://<host>:<port>"
|
||||
currentValue={syncProxy.current} onChange={(newValue) => syncProxy.current = newValue}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup name="sync-server-timeout" label={t("sync_2.timeout")}>
|
||||
<FormTextBoxWithUnit
|
||||
min={1} max={10000000} type="number"
|
||||
unit={t("sync_2.timeout_unit")}
|
||||
currentValue={syncServerTimeout.current} onChange={(newValue) => syncServerTimeout.current = newValue}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<div style={{ display: "flex", justifyContent: "spaceBetween"}}>
|
||||
<Button text={t("sync_2.save")} kind="primary" />
|
||||
<Button text={t("sync_2.help")} onClick={() => openInAppHelpFromUrl("cbkrhQjrkKrh")} />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<hr/>
|
||||
|
||||
<OptionsRow name="sync-server-timeout" label={t("sync_2.timeout")} description={t("sync_2.timeout_description")}>
|
||||
<TimeSelector
|
||||
name="sync-server-timeout"
|
||||
optionValueId="syncServerTimeout"
|
||||
optionTimeScaleId="syncServerTimeoutTimeScale"
|
||||
minimumSeconds={1}
|
||||
/>
|
||||
</OptionsRow>
|
||||
</OptionsSection>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function SyncTest() {
|
||||
@@ -90,5 +94,5 @@ export function SyncTest() {
|
||||
}}
|
||||
/>
|
||||
</OptionsSection>
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -55,4 +55,14 @@ body.mobile .note-detail-readonly-text {
|
||||
|
||||
.edit-text-note-button:hover {
|
||||
border-color: var(--button-border-color);
|
||||
}
|
||||
|
||||
/* Inline code click-to-copy */
|
||||
.note-detail-readonly-text-content code.copyable-inline-code {
|
||||
cursor: pointer;
|
||||
transition: background-color 0.15s ease;
|
||||
}
|
||||
|
||||
.note-detail-readonly-text-content code.copyable-inline-code:hover {
|
||||
background-color: var(--accented-background-color);
|
||||
}
|
||||
@@ -182,9 +182,21 @@ export async function buildConfig(opts: BuildEditorOptions): Promise<EditorConfi
|
||||
marker: "@",
|
||||
feed: (queryText: string) => noteAutocompleteService.autocompleteSourceForCKEditor(queryText),
|
||||
itemRenderer: (item) => {
|
||||
const suggestion = item as Suggestion;
|
||||
const itemElement = document.createElement("button");
|
||||
|
||||
itemElement.innerHTML = `${(item as Suggestion).highlightedNotePathTitle} `;
|
||||
const iconElement = document.createElement("span");
|
||||
// Choose appropriate icon based on action
|
||||
let iconClass = suggestion.icon ?? "bx bx-note";
|
||||
if (suggestion.action === "create-note") {
|
||||
iconClass = "bx bx-plus";
|
||||
}
|
||||
iconElement.className = iconClass;
|
||||
|
||||
itemElement.append(iconElement, document.createTextNode(" "));
|
||||
const titleContainer = document.createElement("span");
|
||||
titleContainer.innerHTML = suggestion.highlightedNotePathTitle ?? "";
|
||||
itemElement.append(...titleContainer.childNodes, document.createTextNode(" "));
|
||||
|
||||
return itemElement;
|
||||
},
|
||||
|
||||
2
apps/edit-docs/demo/!!!meta.json
vendored
2
apps/edit-docs/demo/!!!meta.json
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"formatVersion": 2,
|
||||
"appVersion": "0.100.0",
|
||||
"appVersion": "0.102.2",
|
||||
"files": [
|
||||
{
|
||||
"isClone": false,
|
||||
|
||||
26
apps/edit-docs/demo/root/Trilium Demo.html
vendored
26
apps/edit-docs/demo/root/Trilium Demo.html
vendored
@@ -18,30 +18,23 @@
|
||||
width="150" height="150">
|
||||
</figure>
|
||||
<p><strong>Welcome to Trilium Notes!</strong>
|
||||
|
||||
</p>
|
||||
<p>This is a "demo" document packaged with Trilium to showcase some of its
|
||||
features and also give you some ideas on how you might structure your notes.
|
||||
You can play with it, and modify the note content and tree structure as
|
||||
you wish.</p>
|
||||
<p>If you need any help, visit <a href="https://triliumnotes.org">triliumnotes.org</a> or
|
||||
our <a href="https://github.com/TriliumNext">GitHub repository</a>
|
||||
|
||||
</p>
|
||||
<h2>Cleanup</h2>
|
||||
|
||||
our <a href="https://github.com/TriliumNext">GitHub repository</a>.</p>
|
||||
<h2>Cleanup</h2>
|
||||
<p>Once you're finished with experimenting and want to cleanup these pages,
|
||||
you can simply delete them all.</p>
|
||||
<h2>Formatting</h2>
|
||||
|
||||
<h2>Formatting</h2>
|
||||
<p>Trilium supports classic formatting like <em>italic</em>, <strong>bold</strong>, <em><strong>bold and italic</strong></em>.
|
||||
You can add links pointing to <a href="https://triliumnotes.org/">external pages</a> or
|
||||
You can add links pointing to <a href="https://triliumnotes.org/">external pages</a> or
|
||||
<a
|
||||
class="reference-link" href="Trilium%20Demo/Formatting%20examples">Formatting examples</a>.</p>
|
||||
<h3>Lists</h3>
|
||||
|
||||
<h3>Lists</h3>
|
||||
<p><strong>Ordered:</strong>
|
||||
|
||||
</p>
|
||||
<ol>
|
||||
<li data-list-item-id="e877cc655d0239b8bb0f38696ad5d8abb">First Item</li>
|
||||
@@ -56,7 +49,6 @@
|
||||
</li>
|
||||
</ol>
|
||||
<p><strong>Unordered:</strong>
|
||||
|
||||
</p>
|
||||
<ul>
|
||||
<li data-list-item-id="e68bf4b518a16671c314a72073c3d900a">Item</li>
|
||||
@@ -66,8 +58,7 @@
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Block quotes</h3>
|
||||
|
||||
<h3>Block quotes</h3>
|
||||
<blockquote>
|
||||
<p>Whereof one cannot speak, thereof one must be silent”</p>
|
||||
<p>– Ludwig Wittgenstein</p>
|
||||
@@ -75,9 +66,8 @@
|
||||
<hr>
|
||||
<p>See also other examples like <a href="Trilium%20Demo/Formatting%20examples/School%20schedule.html">tables</a>,
|
||||
<a
|
||||
href="Trilium%20Demo/Formatting%20examples/Checkbox%20lists.html">checkbox lists,</a> <a href="Trilium%20Demo/Formatting%20examples/Highlighting.html">highlighting</a>, <a href="Trilium%20Demo/Formatting%20examples/Code%20blocks.html">code blocks</a>and
|
||||
<a
|
||||
href="Trilium%20Demo/Formatting%20examples/Math.html">math examples</a>.</p>
|
||||
href="Trilium%20Demo/Formatting%20examples/Checkbox%20lists.html">checkbox lists</a>, <a href="Trilium%20Demo/Formatting%20examples/Highlighting.html">highlighting</a>, <a href="Trilium%20Demo/Formatting%20examples/Code%20blocks.html">code blocks</a>,
|
||||
and <a href="Trilium%20Demo/Formatting%20examples/Math.html">math examples</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
@@ -14,24 +14,19 @@
|
||||
|
||||
<div class="ck-content">
|
||||
<h2>Main characters</h2>
|
||||
|
||||
<p>… here put main characters …</p>
|
||||
<p> </p>
|
||||
<h2>Plot</h2>
|
||||
|
||||
<h2>Plot</h2>
|
||||
<p>… describe main plot lines …</p>
|
||||
<p> </p>
|
||||
<h2>Tone</h2>
|
||||
|
||||
<h2>Tone</h2>
|
||||
<p> </p>
|
||||
<h2>Genre</h2>
|
||||
|
||||
<h2>Genre</h2>
|
||||
<p>scifi / drama / romance</p>
|
||||
<p> </p>
|
||||
<h2>Similar books</h2>
|
||||
|
||||
<h2>Similar books</h2>
|
||||
<ul>
|
||||
<li>…</li>
|
||||
<li data-list-item-id="eebd9f297d5dc97dfc46579ba1f25d7bf">…</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
977
apps/edit-docs/demo/style.css
vendored
977
apps/edit-docs/demo/style.css
vendored
File diff suppressed because it is too large
Load Diff
@@ -17,20 +17,29 @@ async function main() {
|
||||
|
||||
await initializeTranslations();
|
||||
await initializeDatabase(true);
|
||||
|
||||
// Wait for becca to be loaded before importing data
|
||||
const beccaLoader = await import("@triliumnext/server/src/becca/becca_loader.js");
|
||||
await beccaLoader.beccaLoaded;
|
||||
|
||||
cls.init(async () => {
|
||||
await importData(DEMO_ZIP_DIR_PATH);
|
||||
setOptions();
|
||||
initializedPromise.resolve();
|
||||
});
|
||||
|
||||
initializedPromise.resolve();
|
||||
}
|
||||
|
||||
async function setOptions() {
|
||||
const optionsService = (await import("@triliumnext/server/src/services/options.js")).default;
|
||||
const sql = (await import("@triliumnext/server/src/services/sql.js")).default;
|
||||
|
||||
optionsService.setOption("eraseUnusedAttachmentsAfterSeconds", 10);
|
||||
optionsService.setOption("eraseUnusedAttachmentsAfterTimeScale", 60);
|
||||
optionsService.setOption("compressImages", "false");
|
||||
|
||||
// Set initial note to the first visible child of root (not _hidden)
|
||||
const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 AND noteId != '_hidden' ORDER BY notePosition") || "root";
|
||||
optionsService.setOption("openNoteContexts", JSON.stringify([{ notePath: startNoteId, active: true }]));
|
||||
}
|
||||
|
||||
async function registerHandlers() {
|
||||
|
||||
@@ -141,9 +141,15 @@ async function main() {
|
||||
|
||||
async function setOptions() {
|
||||
const optionsService = (await import("@triliumnext/server/src/services/options.js")).default;
|
||||
const sql = (await import("@triliumnext/server/src/services/sql.js")).default;
|
||||
|
||||
optionsService.setOption("eraseUnusedAttachmentsAfterSeconds", 10);
|
||||
optionsService.setOption("eraseUnusedAttachmentsAfterTimeScale", 60);
|
||||
optionsService.setOption("compressImages", "false");
|
||||
|
||||
// Set initial note to the first visible child of root (not _hidden)
|
||||
const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 AND noteId != '_hidden' ORDER BY notePosition") || "root";
|
||||
optionsService.setOption("openNoteContexts", JSON.stringify([{ notePath: startNoteId, active: true }]));
|
||||
}
|
||||
|
||||
async function exportData(noteId: string, format: ExportFormat, outputPath: string, ignoredFiles?: Set<string>) {
|
||||
|
||||
@@ -30,11 +30,11 @@
|
||||
"proxy-nginx-subdir": "docker run --name trilium-nginx-subdir --rm --network=host -v ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro nginx:latest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ai-sdk/anthropic": "3.0.66",
|
||||
"@ai-sdk/google": "3.0.58",
|
||||
"@ai-sdk/openai": "3.0.50",
|
||||
"@ai-sdk/anthropic": "3.0.67",
|
||||
"@ai-sdk/google": "3.0.59",
|
||||
"@ai-sdk/openai": "3.0.51",
|
||||
"@modelcontextprotocol/sdk": "^1.12.1",
|
||||
"ai": "6.0.146",
|
||||
"ai": "6.0.149",
|
||||
"better-sqlite3": "12.8.0",
|
||||
"html-to-text": "9.0.5",
|
||||
"js-yaml": "4.1.1",
|
||||
@@ -78,7 +78,6 @@
|
||||
"@types/xml2js": "0.4.14",
|
||||
"archiver": "7.0.1",
|
||||
"async-mutex": "0.5.0",
|
||||
"axios": "1.14.0",
|
||||
"chardet": "2.1.1",
|
||||
"cheerio": "1.2.0",
|
||||
"chokidar": "5.0.0",
|
||||
@@ -110,8 +109,8 @@
|
||||
"ini": "6.0.0",
|
||||
"is-animated": "2.0.2",
|
||||
"is-svg": "6.1.0",
|
||||
"jimp": "1.6.0",
|
||||
"marked": "17.0.5",
|
||||
"jimp": "1.6.1",
|
||||
"marked": "17.0.6",
|
||||
"mime-types": "3.0.2",
|
||||
"multer": "2.1.1",
|
||||
"normalize-strings": "1.1.1",
|
||||
|
||||
Binary file not shown.
2
apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json
generated
vendored
2
apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json
generated
vendored
File diff suppressed because one or more lines are too long
@@ -18,6 +18,9 @@
|
||||
<p>Note that <a class="reference-link" href="#root/_help_cbkrhQjrkKrh">Synchronization</a> provides
|
||||
also some backup capabilities by its nature of distributing the data to
|
||||
other computers.</p>
|
||||
<h2>Downloading backup</h2>
|
||||
<p>You can download a existing backup by going to Settings > Backup >
|
||||
Existing backups > Download</p>
|
||||
<h2>Restoring backup</h2>
|
||||
<p>Let's assume you want to restore the weekly backup, here's how to do it:</p>
|
||||
<ul>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
or accessing Trilium through a <strong>web browser</strong>.</p>
|
||||
<h2>Desktop</h2>
|
||||
<p>The desktop app uses Chromium's built-in spellchecker. You can configure
|
||||
it from <em>Options</em><strong> </strong>→ <em>Spell Check</em>.</p>
|
||||
it from <em>Options</em> → <em>Spell Check</em>.</p>
|
||||
<h3>Enabling spell check</h3>
|
||||
<p>Toggle <em>Check spelling</em> to enable or disable the spellchecker. A
|
||||
restart is required for changes to take effect — use the restart button
|
||||
@@ -14,7 +14,7 @@
|
||||
by checking the boxes. The spellchecker will accept words that are valid
|
||||
in <em>any</em> of the selected languages.</p>
|
||||
<p>The available languages depend on your operating system's installed language
|
||||
packs. For example, on Windows you can add languages through <em>Options </em>→ <em>Time & Language </em>→ <em>Language & Region </em>→ <em>Add a language</em>.</p>
|
||||
packs. For example, on Windows you can add languages through <em>Options</em> → <em>Time & Language</em> → <em>Language & Region</em> → <em>Add a language</em>.</p>
|
||||
<aside
|
||||
class="admonition note">
|
||||
<p>The changes take effect only after restarting the application.</p>
|
||||
@@ -27,7 +27,7 @@ class="admonition note">
|
||||
→ "Add to dictionary") are stored in a <strong>synced note</strong> inside
|
||||
Trilium. This means your custom dictionary automatically syncs across all
|
||||
your devices.</p>
|
||||
<p>You can view and edit the dictionary directly from <em>Settings </em>→ <em>Spell Check </em>→ <em>Custom Dictionary </em>→ <em>Edit dictionary</em>.
|
||||
<p>You can view and edit the dictionary directly from <em>Settings</em> → <em>Spell Check</em> → <em>Custom Dictionary</em> → <em>Edit dictionary</em>.
|
||||
This opens the underlying note, which contains one word per line. You can
|
||||
add, remove, or modify entries as you like.</p>
|
||||
<aside class="admonition note">
|
||||
@@ -48,7 +48,7 @@ class="admonition note">
|
||||
(e.g. you removed them manually) are cleaned up from the local dictionary
|
||||
on startup.</li>
|
||||
</ul>
|
||||
<h4>Known limitations<a id="known-limitations"></a></h4>
|
||||
<h4>Known limitations</h4>
|
||||
<p>On Windows and macOS, Electron delegates "Add to dictionary" to the operating
|
||||
system's user dictionary. This means:</p>
|
||||
<ul>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
<h2>v0.102.0: Upgrade to jQuery 4.0.0</h2>
|
||||
<p>jQuery 4 removes legacy browser support (such as IE11 support), but it
|
||||
also removes some APIs that are considered deprecated such as:</p>
|
||||
<blockquote>
|
||||
28
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.html
generated
vendored
Normal file
28
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.html
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
<p>The <code spellcheck="false">api.axios</code> library has been removed from
|
||||
the backend scripting API.</p>
|
||||
<p>Scripts that attempt to use <code spellcheck="false">api.axios</code> will
|
||||
now throw an error with migration instructions.</p>
|
||||
<h2>Reasoning</h2>
|
||||
<p>Axios was marked as deprecated at least since April 2024 in favor of the
|
||||
native <code spellcheck="false">fetch()</code> API, which is available in
|
||||
both browser and Node.js environments. After two years of deprecation,
|
||||
the library was removed following the <a href="https://www.malwarebytes.com/blog/news/2026/03/axios-supply-chain-attack-chops-away-at-npm-trust">March 2026 npm supply chain compromise</a>,
|
||||
where attackers published malicious versions that deployed a remote access
|
||||
trojan. The Trilium's main developer almost got compromised, but <code spellcheck="false">pnpm</code> not
|
||||
trusting unknown post-install scripts successfully avoided that.</p>
|
||||
<h2>Migration</h2>
|
||||
<p>Replace <code spellcheck="false">api.axios</code> calls with the native
|
||||
<code
|
||||
spellcheck="false">fetch()</code>API.</p>
|
||||
<h3><code spellcheck="false">GET</code> calls</h3>
|
||||
<p>Before (Axios):</p><pre><code class="language-application-javascript-env-backend">const response = await api.axios.get('https://api.example.com/data');
|
||||
const data = response.data;</code></pre>
|
||||
<p>After (<code spellcheck="false">fetch</code>):</p><pre><code class="language-application-javascript-env-backend">const response = await fetch('https://api.example.com/data');
|
||||
const data = await response.json();</code></pre>
|
||||
<h3><code spellcheck="false">POST</code> calls</h3>
|
||||
<p>Before (Axios):</p><pre><code class="language-application-javascript-env-backend">await api.axios.post('https://api.example.com/data', { key: 'value' });</code></pre>
|
||||
<p>After (fetch):</p><pre><code class="language-application-javascript-env-backend">await fetch('https://api.example.com/data', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ key: 'value' })
|
||||
});</code></pre>
|
||||
14
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.html
generated
vendored
Normal file
14
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.html
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
<p>The <code spellcheck="false">api.cheerio</code> library is deprecated and
|
||||
will be removed in a future version.</p>
|
||||
<h2>Reasoning</h2>
|
||||
<p>Cheerio is only used for the scripting API while the server internally
|
||||
uses <code spellcheck="false">node-html-parser</code> for HTML parsing. Removing
|
||||
<code
|
||||
spellcheck="false">cheerio</code>reduces bundle size and maintenance overhead.</p>
|
||||
<h2>Migration</h2>
|
||||
<p>Before (<code spellcheck="false">cheerio</code>):</p><pre><code class="language-application-javascript-env-backend">const $ = api.cheerio.load(html);
|
||||
const title = $('h1').text();
|
||||
const links = $('a').map((i, el) => $(el).attr('href')).get();</code></pre>
|
||||
<p>After (<code spellcheck="false">htmlParser</code>):</p><pre><code class="language-application-javascript-env-backend">const root = api.htmlParser.parse(html);
|
||||
const title = root.querySelector('h1')?.textContent;
|
||||
const links = root.querySelectorAll('a').map(a => a.getAttribute('href'));</code></pre>
|
||||
@@ -80,6 +80,9 @@ class WordCountWidget extends api.NoteContextAwareWidget {
|
||||
module.exports = new WordCountWidget();</code></pre>
|
||||
<p>After you make changes it is necessary to <a href="#root/_help_s8alTXmpFR61">restart Trilium</a> so
|
||||
that the layout can be rebuilt.</p>
|
||||
<p>The widget only activates on text notes that have the <code spellcheck="false">#wordCount</code> label.
|
||||
This label can be a <a href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/iPIMuisry3hd/QEAPj01N5f7w/_help_hrZ1D00cLbal">reference link</a> to
|
||||
enable the widget for an entire subtree.</p>
|
||||
<p>At the bottom of the note you can see the resulting widget:</p>
|
||||
<figure
|
||||
class="image">
|
||||
|
||||
@@ -43,10 +43,19 @@ Backend scripts run in Node.js on the server. They have direct access to notes i
|
||||
- `api.getAppInfo()` - get application info
|
||||
|
||||
### Libraries
|
||||
- `api.axios` - HTTP client
|
||||
- `api.dayjs` - date manipulation
|
||||
- `api.xml2js` - XML parser
|
||||
- `api.cheerio` - HTML/XML parser
|
||||
- `api.htmlParser` - HTML parser (node-html-parser), use `api.htmlParser.parse(html)` to parse
|
||||
- `api.cheerio` - **DEPRECATED**, use `api.htmlParser` instead
|
||||
|
||||
### HTTP Requests
|
||||
Use the native `fetch()` API for HTTP requests:
|
||||
```javascript
|
||||
const response = await fetch('https://api.example.com/data');
|
||||
const data = await response.json();
|
||||
```
|
||||
|
||||
Note: `api.axios` was removed in 2026 due to a supply chain security incident. Use `fetch()` instead.
|
||||
|
||||
### Advanced
|
||||
- `api.transactional(func)` - wrap code in a database transaction
|
||||
|
||||
@@ -445,5 +445,15 @@
|
||||
},
|
||||
"desktop": {
|
||||
"instance_already_running": "There's already an instance running, focusing that instance instead."
|
||||
},
|
||||
"search": {
|
||||
"error": {
|
||||
"in-context": "Error in {{- context}}: {{- message}}",
|
||||
"reserved-keyword": "\"{{- token}}\" is a reserved keyword. To search for a literal value, use quotes: \"{{- token}}\"",
|
||||
"cannot-compare-with": "cannot compare with \"{{- token}}\". To search for a literal value, use quotes: \"{{- token}}\"",
|
||||
"misplaced-expression": "Misplaced or incomplete expression \"{{- token}}\"",
|
||||
"fulltext-after-expression": "\"{{- token}}\" is not a valid expression. To search for text, place it before attribute filters (e.g., \"{{- token}} #label\" instead of \"#label {{- token}}\").",
|
||||
"unrecognized-expression": "Unrecognized expression \"{{- token}}\""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
"use strict";
|
||||
|
||||
import sql from "../../services/sql.js";
|
||||
import log from "../../services/log.js";
|
||||
import backupService from "../../services/backup.js";
|
||||
import anonymizationService from "../../services/anonymization.js";
|
||||
import consistencyChecksService from "../../services/consistency_checks.js";
|
||||
import type { Request } from "express";
|
||||
import ValidationError from "../../errors/validation_error.js";
|
||||
import sql_init from "../../services/sql_init.js";
|
||||
import becca_loader from "../../becca/becca_loader.js";
|
||||
import { BackupDatabaseNowResponse, DatabaseCheckIntegrityResponse } from "@triliumnext/commons";
|
||||
import type { Request, Response } from "express";
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
|
||||
import becca_loader from "../../becca/becca_loader.js";
|
||||
import ValidationError from "../../errors/validation_error.js";
|
||||
import anonymizationService from "../../services/anonymization.js";
|
||||
import backupService from "../../services/backup.js";
|
||||
import consistencyChecksService from "../../services/consistency_checks.js";
|
||||
import dataDir from "../../services/data_dir.js";
|
||||
import log from "../../services/log.js";
|
||||
import sql from "../../services/sql.js";
|
||||
import sql_init from "../../services/sql_init.js";
|
||||
|
||||
function getExistingBackups() {
|
||||
return backupService.getExistingBackups();
|
||||
@@ -58,6 +60,27 @@ function checkIntegrity() {
|
||||
} satisfies DatabaseCheckIntegrityResponse;
|
||||
}
|
||||
|
||||
function downloadBackup(req: Request, res: Response) {
|
||||
const filePath = req.query.filePath as string;
|
||||
if (!filePath) {
|
||||
res.status(400).send("Missing filePath");
|
||||
return;
|
||||
}
|
||||
|
||||
const resolvedPath = path.resolve(filePath);
|
||||
if (!resolvedPath.startsWith(path.resolve(dataDir.BACKUP_DIR) + path.sep)) {
|
||||
res.status(403).send("Access denied");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!fs.existsSync(resolvedPath)) {
|
||||
res.status(404).send("Backup file not found");
|
||||
return;
|
||||
}
|
||||
|
||||
res.download(resolvedPath, path.basename(resolvedPath));
|
||||
}
|
||||
|
||||
export default {
|
||||
getExistingBackups,
|
||||
backupDatabase,
|
||||
@@ -66,5 +89,6 @@ export default {
|
||||
rebuildIntegrationTestDatabase,
|
||||
getExistingAnonymizedDatabases,
|
||||
anonymize,
|
||||
checkIntegrity
|
||||
checkIntegrity,
|
||||
downloadBackup
|
||||
};
|
||||
|
||||
@@ -32,6 +32,7 @@ const ALLOWED_OPTIONS = new Set<OptionNames>([
|
||||
"codeNoteTheme",
|
||||
"syncServerHost",
|
||||
"syncServerTimeout",
|
||||
"syncServerTimeoutTimeScale",
|
||||
"syncProxy",
|
||||
"hoistedNoteId",
|
||||
"mainFontSize",
|
||||
|
||||
@@ -313,7 +313,7 @@ function register(app: express.Application) {
|
||||
// backup requires execution outside of transaction
|
||||
asyncRoute(PST, "/api/database/backup-database", [auth.checkApiAuthOrElectron, csrfMiddleware], databaseRoute.backupDatabase, apiResultHandler);
|
||||
apiRoute(GET, "/api/database/backups", databaseRoute.getExistingBackups);
|
||||
|
||||
route(GET, "/api/database/backup/download", [auth.checkApiAuthOrElectron], databaseRoute.downloadBackup);
|
||||
// VACUUM requires execution outside of transaction
|
||||
asyncRoute(PST, "/api/database/vacuum-database", [auth.checkApiAuthOrElectron, csrfMiddleware], databaseRoute.vacuumDatabase, apiResultHandler);
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import type { AttributeRow } from "@triliumnext/commons";
|
||||
import { dayjs } from "@triliumnext/commons";
|
||||
import { formatLogMessage } from "@triliumnext/commons";
|
||||
import axios from "axios";
|
||||
import * as cheerio from "cheerio";
|
||||
import * as htmlParser from "node-html-parser";
|
||||
import xml2js from "xml2js";
|
||||
|
||||
import becca from "../becca/becca.js";
|
||||
@@ -81,10 +81,10 @@ export interface Api {
|
||||
originEntity?: AbstractBeccaEntity<any> | null;
|
||||
|
||||
/**
|
||||
* Axios library for HTTP requests. See {@link https://axios-http.com} for documentation
|
||||
* @deprecated use native (browser compatible) fetch() instead
|
||||
* @deprecated Axios was deprecated since April 2024 and has now been removed following the March 2026 supply chain attack.
|
||||
* Use the native fetch() API instead.
|
||||
*/
|
||||
axios: typeof axios;
|
||||
axios: undefined;
|
||||
|
||||
/**
|
||||
* day.js library for date manipulation. See {@link https://day.js.org} for documentation
|
||||
@@ -99,10 +99,16 @@ export interface Api {
|
||||
|
||||
/**
|
||||
* cheerio library for HTML parsing and manipulation. See {@link https://cheerio.js.org} for documentation
|
||||
* @deprecated cheerio will be removed in a future version. Use api.htmlParser (node-html-parser) instead.
|
||||
*/
|
||||
|
||||
cheerio: typeof cheerio;
|
||||
|
||||
/**
|
||||
* node-html-parser library for HTML parsing. See {@link https://github.com/piotr-nicol/node-html-parser} for documentation.
|
||||
* This is the recommended replacement for cheerio.
|
||||
*/
|
||||
htmlParser: typeof htmlParser;
|
||||
|
||||
/**
|
||||
* Instance name identifies particular Trilium instance. It can be useful for scripts
|
||||
* if some action needs to happen on only one specific instance.
|
||||
@@ -441,10 +447,18 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) {
|
||||
(this as any)[key] = apiParams[key as keyof ApiParams];
|
||||
}
|
||||
|
||||
this.axios = axios;
|
||||
// Throw when axios is used (removed after 2 years of deprecation + supply chain attack)
|
||||
const axiosError = () => {
|
||||
throw new Error("api.axios was deprecated since 2024 and has been removed following the March 2026 npm supply chain compromise. Please update your script to use the native fetch() API.");
|
||||
};
|
||||
this.axios = new Proxy(axiosError, {
|
||||
get: axiosError,
|
||||
apply: axiosError
|
||||
}) as unknown as undefined;
|
||||
this.dayjs = dayjs;
|
||||
this.xml2js = xml2js;
|
||||
this.cheerio = cheerio;
|
||||
this.htmlParser = htmlParser;
|
||||
this.getInstanceName = () => (config.General ? config.General.instanceName : null);
|
||||
this.getNote = (noteId) => becca.getNote(noteId);
|
||||
this.getBranch = (branchId) => becca.getBranch(branchId);
|
||||
@@ -697,7 +711,7 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) {
|
||||
return params.map((p) => {
|
||||
if (typeof p === "function") {
|
||||
return `!@#Function: ${p.toString()}`;
|
||||
}
|
||||
}
|
||||
return p;
|
||||
});
|
||||
}
|
||||
|
||||
27
apps/server/src/services/options_init.spec.ts
Normal file
27
apps/server/src/services/options_init.spec.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { migrateSyncTimeoutFromMilliseconds } from "./options_init.js";
|
||||
|
||||
describe("migrateSyncTimeoutFromMilliseconds", () => {
|
||||
it("returns null when no migration is needed (values < 1000 are already in seconds)", () => {
|
||||
expect(migrateSyncTimeoutFromMilliseconds(120)).toBeNull();
|
||||
expect(migrateSyncTimeoutFromMilliseconds(500)).toBeNull();
|
||||
expect(migrateSyncTimeoutFromMilliseconds(999)).toBeNull();
|
||||
expect(migrateSyncTimeoutFromMilliseconds(NaN)).toBeNull();
|
||||
});
|
||||
|
||||
it("converts milliseconds to seconds and sets display scale", () => {
|
||||
// Value is always stored in seconds; scale is for display only
|
||||
// Divisible by 60 → display as minutes
|
||||
expect(migrateSyncTimeoutFromMilliseconds(60000)).toEqual({ value: 60, scale: 60 }); // 60s, display as 1 min
|
||||
expect(migrateSyncTimeoutFromMilliseconds(120000)).toEqual({ value: 120, scale: 60 }); // 120s, display as 2 min
|
||||
expect(migrateSyncTimeoutFromMilliseconds(3600000)).toEqual({ value: 3600, scale: 60 }); // 3600s, display as 60 min
|
||||
|
||||
// Not divisible by 60 → display as seconds
|
||||
expect(migrateSyncTimeoutFromMilliseconds(1000)).toEqual({ value: 1, scale: 1 });
|
||||
expect(migrateSyncTimeoutFromMilliseconds(45000)).toEqual({ value: 45, scale: 1 });
|
||||
expect(migrateSyncTimeoutFromMilliseconds(90000)).toEqual({ value: 90, scale: 1 });
|
||||
|
||||
// Rounds to nearest second
|
||||
expect(migrateSyncTimeoutFromMilliseconds(120500)).toEqual({ value: 121, scale: 1 });
|
||||
});
|
||||
});
|
||||
@@ -66,14 +66,49 @@ async function initNotSyncedOptions(initialized: boolean, opts: NotSyncedOpts =
|
||||
optionService.createOption("textNoteEditorType", "ckeditor-classic", true);
|
||||
|
||||
optionService.createOption("syncServerHost", opts.syncServerHost || "", false);
|
||||
optionService.createOption("syncServerTimeout", "120000", false);
|
||||
optionService.createOption("syncServerTimeout", "120", false); // 120 seconds (2 minutes)
|
||||
optionService.createOption("syncProxy", opts.syncProxy || "", false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Migrates a sync timeout value from milliseconds to seconds.
|
||||
* Values >= 1000 are assumed to be in milliseconds (since 1000+ seconds = 16+ minutes is unlikely).
|
||||
* TimeSelector stores values in seconds; the scale is only used for display.
|
||||
*
|
||||
* @returns The value in seconds and preferred display scale, or null if no migration is needed.
|
||||
*/
|
||||
export function migrateSyncTimeoutFromMilliseconds(milliseconds: number): { value: number; scale: number } | null {
|
||||
if (isNaN(milliseconds) || milliseconds < 1000) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const seconds = Math.round(milliseconds / 1000);
|
||||
|
||||
// Value is always stored in seconds; scale determines display unit
|
||||
if (seconds >= 60 && seconds % 60 === 0) {
|
||||
return { value: seconds, scale: 60 }; // display as minutes
|
||||
}
|
||||
return { value: seconds, scale: 1 }; // display as seconds
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains all the default options that must be initialized on new and existing databases (at startup). The value can also be determined based on other options, provided they have already been initialized.
|
||||
*/
|
||||
const defaultOptions: DefaultOption[] = [
|
||||
{
|
||||
name: "syncServerTimeoutTimeScale",
|
||||
value: (optionsMap) => {
|
||||
const timeout = parseInt(optionsMap.syncServerTimeout || "120", 10);
|
||||
const migrated = migrateSyncTimeoutFromMilliseconds(timeout);
|
||||
if (migrated) {
|
||||
optionService.setOption("syncServerTimeout", String(migrated.value));
|
||||
log.info(`Migrated syncServerTimeout from ${timeout}ms to ${migrated.value}s`);
|
||||
return String(migrated.scale);
|
||||
}
|
||||
return "60"; // default to minutes
|
||||
},
|
||||
isSynced: false
|
||||
},
|
||||
{ name: "revisionSnapshotTimeInterval", value: "600", isSynced: true },
|
||||
{ name: "revisionSnapshotTimeIntervalTimeScale", value: "60", isSynced: true }, // default to Minutes
|
||||
{ name: "revisionSnapshotNumberLimit", value: "-1", isSynced: true },
|
||||
|
||||
@@ -285,7 +285,7 @@ describe("Invalid expressions", () => {
|
||||
searchContext
|
||||
});
|
||||
|
||||
expect(searchContext.error).toEqual(`Error near token "#second" in "#first = #second", it's possible to compare with constant only.`);
|
||||
expect(searchContext.error).toEqual(`Error in "#first = #second": cannot compare with "#second". To search for a literal value, use quotes: "#second"`);
|
||||
|
||||
searchContext = new SearchContext();
|
||||
searchContext.originalQuery = "#first = note.relations.second";
|
||||
@@ -296,7 +296,7 @@ describe("Invalid expressions", () => {
|
||||
searchContext
|
||||
});
|
||||
|
||||
expect(searchContext.error).toEqual(`Error near token "note" in "#first = note.relations.second", it's possible to compare with constant only.`);
|
||||
expect(searchContext.error).toEqual(`Error in "#first = note.relations.second": "note" is a reserved keyword. To search for a literal value, use quotes: "note"`);
|
||||
|
||||
const rootExp = parse(
|
||||
{
|
||||
@@ -317,6 +317,27 @@ describe("Invalid expressions", () => {
|
||||
expect(labelComparisonExp.attributeType).toEqual("label");
|
||||
expect(labelComparisonExp.attributeName).toEqual("first");
|
||||
expect(labelComparisonExp.comparator).toBeTruthy();
|
||||
|
||||
// Verify that quoted "note" keyword works (issue #8850)
|
||||
const rootExp2 = parse(
|
||||
{
|
||||
fulltextTokens: [],
|
||||
expressionTokens: [
|
||||
{ token: "#clipType", inQuotes: false },
|
||||
{ token: "=", inQuotes: false },
|
||||
{ token: "note", inQuotes: true }
|
||||
],
|
||||
searchContext: new SearchContext()
|
||||
},
|
||||
AndExp
|
||||
);
|
||||
|
||||
assertIsArchived(rootExp2.subExpressions[0]);
|
||||
|
||||
const labelComparisonExp2 = expectExpression(rootExp2.subExpressions[2], LabelComparisonExp);
|
||||
expect(labelComparisonExp2.attributeType).toEqual("label");
|
||||
expect(labelComparisonExp2.attributeName).toEqual("cliptype");
|
||||
expect(labelComparisonExp2.comparator).toBeTruthy();
|
||||
});
|
||||
|
||||
it("searching by relation without note property", () => {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
|
||||
|
||||
import { dayjs } from "@triliumnext/commons";
|
||||
import { t } from "i18next";
|
||||
|
||||
import { removeDiacritic } from "../../utils.js";
|
||||
import AncestorExp from "../expressions/ancestor.js";
|
||||
@@ -98,7 +97,10 @@ function getExpression(tokens: TokenData[], searchContext: SearchContext, level
|
||||
const operand = tokens[i];
|
||||
|
||||
if (!operand.inQuotes && (operand.token.startsWith("#") || operand.token.startsWith("~") || operand.token === "note")) {
|
||||
searchContext.addError(`Error near token "${operand.token}" in ${context(i)}, it's possible to compare with constant only.`);
|
||||
const hint = operand.token === "note"
|
||||
? t("search.error.reserved-keyword", { token: operand.token })
|
||||
: t("search.error.cannot-compare-with", { token: operand.token });
|
||||
searchContext.addError(t("search.error.in-context", { context: context(i), message: hint }));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -436,9 +438,15 @@ function getExpression(tokens: TokenData[], searchContext: SearchContext, level
|
||||
searchContext.addError("Mixed usage of AND/OR - always use parenthesis to group AND/OR expressions.");
|
||||
}
|
||||
} else if (isOperator({ token })) {
|
||||
searchContext.addError(`Misplaced or incomplete expression "${token}"`);
|
||||
searchContext.addError(t("search.error.misplaced-expression", { token }));
|
||||
} else {
|
||||
searchContext.addError(`Unrecognized expression "${token}"`);
|
||||
// Check if this looks like a fulltext search term placed after attribute filters
|
||||
const looksLikeFulltext = !token.startsWith("#") && !token.startsWith("~") && !token.startsWith("note.");
|
||||
if (looksLikeFulltext) {
|
||||
searchContext.addError(t("search.error.fulltext-after-expression", { token }));
|
||||
} else {
|
||||
searchContext.addError(t("search.error.unrecognized-expression", { token }));
|
||||
}
|
||||
}
|
||||
|
||||
if (!op && expressions.length > 1) {
|
||||
|
||||
@@ -141,7 +141,7 @@ async function createInitialDatabase(skipDemoDb?: boolean) {
|
||||
// the previous solution was to move option initialization here, but then the important parts of initialization
|
||||
// are not all in one transaction (because ZIP import is async and thus not transactional)
|
||||
|
||||
const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 ORDER BY notePosition");
|
||||
const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 AND noteId != '_hidden' ORDER BY notePosition") || "root";
|
||||
|
||||
optionService.setOption(
|
||||
"openNoteContexts",
|
||||
|
||||
48
apps/server/src/services/sync_options.spec.ts
Normal file
48
apps/server/src/services/sync_options.spec.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
// Mock the dependencies before importing the module
|
||||
vi.mock("./config.js", () => ({ default: { Sync: {} } }));
|
||||
vi.mock("./options.js", () => ({ default: { getOption: vi.fn() } }));
|
||||
|
||||
import config from "./config.js";
|
||||
import optionService from "./options.js";
|
||||
import syncOptions from "./sync_options.js";
|
||||
|
||||
describe("syncOptions.getSyncTimeout", () => {
|
||||
beforeEach(() => {
|
||||
(config as any).Sync = {};
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it("converts database value from seconds to milliseconds", () => {
|
||||
// TimeSelector stores value in seconds (displayed value × scale)
|
||||
// Scale is UI-only, not used in backend calculation
|
||||
vi.mocked(optionService.getOption).mockReturnValue("120"); // 120 seconds = 2 minutes
|
||||
expect(syncOptions.getSyncTimeout()).toBe(120000);
|
||||
|
||||
vi.mocked(optionService.getOption).mockReturnValue("30"); // 30 seconds
|
||||
expect(syncOptions.getSyncTimeout()).toBe(30000);
|
||||
|
||||
vi.mocked(optionService.getOption).mockReturnValue("3600"); // 3600 seconds = 1 hour
|
||||
expect(syncOptions.getSyncTimeout()).toBe(3600000);
|
||||
});
|
||||
|
||||
it("treats config override as raw milliseconds for backward compatibility", () => {
|
||||
(config as any).Sync = { syncServerTimeout: "60000" }; // 60 seconds in ms
|
||||
|
||||
// Config value takes precedence, db value is ignored
|
||||
vi.mocked(optionService.getOption).mockReturnValue("9999");
|
||||
expect(syncOptions.getSyncTimeout()).toBe(60000);
|
||||
});
|
||||
|
||||
it("uses safe defaults for invalid values", () => {
|
||||
vi.mocked(optionService.getOption).mockReturnValue("");
|
||||
expect(syncOptions.getSyncTimeout()).toBe(120000); // default 120 seconds
|
||||
|
||||
(config as any).Sync = { syncServerTimeout: "invalid" };
|
||||
expect(syncOptions.getSyncTimeout()).toBe(120000); // fallback for invalid config
|
||||
});
|
||||
});
|
||||
@@ -1,7 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
import optionService from "./options.js";
|
||||
import config from "./config.js";
|
||||
import optionService from "./options.js";
|
||||
import { normalizeUrl } from "./utils.js";
|
||||
|
||||
/*
|
||||
@@ -29,6 +27,17 @@ export default {
|
||||
// and we need to override it with config from config.ini
|
||||
return !!syncServerHost && syncServerHost !== "disabled";
|
||||
},
|
||||
getSyncTimeout: () => parseInt(get("syncServerTimeout")) || 120000,
|
||||
// Value is stored in seconds (TimeSelector saves displayed value × scale).
|
||||
// Config file overrides are treated as raw milliseconds for backward compatibility.
|
||||
getSyncTimeout: () => {
|
||||
const configValue = config["Sync"]?.syncServerTimeout;
|
||||
if (configValue) {
|
||||
// Config override: treat as raw milliseconds (backward compatible)
|
||||
return parseInt(configValue, 10) || 120000;
|
||||
}
|
||||
// Database option: stored in seconds, convert to milliseconds
|
||||
const seconds = parseInt(optionService.getOption("syncServerTimeout"), 10) || 120;
|
||||
return seconds * 1000;
|
||||
},
|
||||
getSyncProxy: () => get("syncProxy")
|
||||
};
|
||||
|
||||
@@ -26,10 +26,12 @@ async function saveTriliumServerSetup(e) {
|
||||
return;
|
||||
}
|
||||
|
||||
const triliumServerUrl = ($triliumServerUrl.val() as string).trim().replace(/\/+$/, '');
|
||||
|
||||
let resp;
|
||||
|
||||
try {
|
||||
resp = await fetch(`${$triliumServerUrl.val()}/api/login/token`, {
|
||||
resp = await fetch(`${triliumServerUrl}/api/login/token`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
@@ -60,7 +62,7 @@ async function saveTriliumServerSetup(e) {
|
||||
$triliumServerPassword.val('');
|
||||
|
||||
browser.storage.sync.set({
|
||||
triliumServerUrl: $triliumServerUrl.val(),
|
||||
triliumServerUrl: triliumServerUrl,
|
||||
authToken: json.token
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Documentation
|
||||
There are multiple types of documentation for Trilium:<img class="image-style-align-right" src="api/images/2E07SO1IRJxo/Documentation_image.png" width="205" height="162">
|
||||
There are multiple types of documentation for Trilium:<img class="image-style-align-right" src="api/images/sXF9YQCkQPQv/Documentation_image.png" width="205" height="162">
|
||||
|
||||
* The _User Guide_ represents the user-facing documentation. This documentation can be browsed by users directly from within Trilium, by pressing <kbd>F1</kbd>.
|
||||
* The _Developer's Guide_ represents a set of Markdown documents that present the internals of Trilium, for developers.
|
||||
|
||||
4
docs/Release Notes/Release Notes/v0.102.2.md
vendored
4
docs/Release Notes/Release Notes/v0.102.2.md
vendored
@@ -14,7 +14,6 @@
|
||||
## 🔒️ Security improvements
|
||||
|
||||
* Content Handling
|
||||
|
||||
* Improved request handling for SVG content in share routes
|
||||
* Improved request handling for SVG content in the main API
|
||||
* Enhanced content rendering in the Mermaid diagram editor
|
||||
@@ -22,16 +21,13 @@
|
||||
* Added validation for the `docName` attribute in the document renderer
|
||||
* Marked `docName` as a sensitive attribute in the commons module
|
||||
* Desktop Application (Electron)
|
||||
|
||||
* Added Electron fuses to harden the desktop application against external abuse
|
||||
* Improved application integrity checks
|
||||
* API & Import
|
||||
|
||||
* Added MIME type validation for image uploads via ETAPI
|
||||
* Aligned attachment upload validation with note upload validation
|
||||
* Import no longer preserves named note IDs to prevent potential conflicts
|
||||
* Authentication
|
||||
|
||||
* OpenID Connect now uses a more secure random number generator
|
||||
|
||||
We've also updated our SECURITY.MD file to detail our security practices and how to report vulnerabilities.
|
||||
125
docs/User Guide/!!!meta.json
vendored
125
docs/User Guide/!!!meta.json
vendored
@@ -16459,6 +16459,13 @@
|
||||
"value": "word-count",
|
||||
"isInheritable": false,
|
||||
"position": 40
|
||||
},
|
||||
{
|
||||
"type": "relation",
|
||||
"name": "internalLink",
|
||||
"value": "hrZ1D00cLbal",
|
||||
"isInheritable": false,
|
||||
"position": 50
|
||||
}
|
||||
],
|
||||
"format": "markdown",
|
||||
@@ -17761,27 +17768,133 @@
|
||||
"notePosition": 130,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
"mime": "text/html",
|
||||
"type": "book",
|
||||
"mime": "",
|
||||
"attributes": [
|
||||
{
|
||||
"type": "label",
|
||||
"name": "iconClass",
|
||||
"value": "bx bx-up-arrow-alt",
|
||||
"isInheritable": false,
|
||||
"position": 30
|
||||
"position": 10
|
||||
},
|
||||
{
|
||||
"type": "label",
|
||||
"name": "shareAlias",
|
||||
"value": "breaking-changes",
|
||||
"isInheritable": false,
|
||||
"position": 20
|
||||
},
|
||||
{
|
||||
"type": "relation",
|
||||
"name": "template",
|
||||
"value": "_template_list_view",
|
||||
"isInheritable": false,
|
||||
"position": 30
|
||||
},
|
||||
{
|
||||
"type": "label",
|
||||
"name": "sorted",
|
||||
"value": "",
|
||||
"isInheritable": false,
|
||||
"position": 40
|
||||
},
|
||||
{
|
||||
"type": "label",
|
||||
"name": "sortDirection",
|
||||
"value": "desc",
|
||||
"isInheritable": false,
|
||||
"position": 50
|
||||
}
|
||||
],
|
||||
"format": "markdown",
|
||||
"dataFileName": "Breaking changes.md",
|
||||
"attachments": []
|
||||
"attachments": [],
|
||||
"dirFileName": "Breaking changes",
|
||||
"children": [
|
||||
{
|
||||
"isClone": false,
|
||||
"noteId": "fqAK6opjUagR",
|
||||
"notePath": [
|
||||
"pOsGYCXsbNQG",
|
||||
"CdNpE2pqjmI6",
|
||||
"cNpC0ITcfX0N",
|
||||
"fqAK6opjUagR"
|
||||
],
|
||||
"title": "v0.103.0: Removal of axios",
|
||||
"notePosition": 10,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
"mime": "text/html",
|
||||
"attributes": [
|
||||
{
|
||||
"type": "label",
|
||||
"name": "shareAlias",
|
||||
"value": "axios-removal",
|
||||
"isInheritable": false,
|
||||
"position": 30
|
||||
}
|
||||
],
|
||||
"format": "markdown",
|
||||
"dataFileName": "v0.103.0 Removal of axios.md",
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"isClone": false,
|
||||
"noteId": "pAJ0jWz16xFm",
|
||||
"notePath": [
|
||||
"pOsGYCXsbNQG",
|
||||
"CdNpE2pqjmI6",
|
||||
"cNpC0ITcfX0N",
|
||||
"pAJ0jWz16xFm"
|
||||
],
|
||||
"title": "v0.103.0: `cheerio` is now deprecated",
|
||||
"notePosition": 20,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
"mime": "text/html",
|
||||
"attributes": [
|
||||
{
|
||||
"type": "label",
|
||||
"name": "shareAlias",
|
||||
"value": "cheerio-deprecated",
|
||||
"isInheritable": false,
|
||||
"position": 30
|
||||
}
|
||||
],
|
||||
"format": "markdown",
|
||||
"dataFileName": "v0.103.0 `cheerio` is now depr.md",
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"isClone": false,
|
||||
"noteId": "72dxvnbnkDFY",
|
||||
"notePath": [
|
||||
"pOsGYCXsbNQG",
|
||||
"CdNpE2pqjmI6",
|
||||
"cNpC0ITcfX0N",
|
||||
"72dxvnbnkDFY"
|
||||
],
|
||||
"title": "v0.102.0: Upgrade to jQuery 4.0.0",
|
||||
"notePosition": 30,
|
||||
"prefix": null,
|
||||
"isExpanded": false,
|
||||
"type": "text",
|
||||
"mime": "text/html",
|
||||
"attributes": [
|
||||
{
|
||||
"type": "label",
|
||||
"name": "shareAlias",
|
||||
"value": "jquery4",
|
||||
"isInheritable": false,
|
||||
"position": 30
|
||||
}
|
||||
],
|
||||
"format": "markdown",
|
||||
"dataFileName": "v0.102.0 Upgrade to jQuery.0.0.md",
|
||||
"attachments": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -12,6 +12,10 @@ This is only very basic backup solution, and you're encouraged to add some bette
|
||||
|
||||
Note that <a class="reference-link" href="Synchronization.md">Synchronization</a> provides also some backup capabilities by its nature of distributing the data to other computers.
|
||||
|
||||
## Downloading backup
|
||||
|
||||
You can download an existing backup by going to Settings > Backup > Existing backups > Download
|
||||
|
||||
## Restoring backup
|
||||
|
||||
Let's assume you want to restore the weekly backup, here's how to do it:
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
# Breaking changes
|
||||
## v0.102.0: Upgrade to jQuery 4.0.0
|
||||
|
||||
# v0.102.0: Upgrade to jQuery 4.0.0
|
||||
jQuery 4 removes legacy browser support (such as IE11 support), but it also removes some APIs that are considered deprecated such as:
|
||||
|
||||
> `jQuery.isArray`, `jQuery.parseJSON`, `jQuery.trim`, `jQuery.type`, `jQuery.now`, `jQuery.isNumeric`, `jQuery.isFunction`, `jQuery.isWindow`, `jQuery.camelCase`, `jQuery.nodeName`, `jQuery.cssNumber`, `jQuery.cssProps`, and `jQuery.fx.interval`.
|
||||
46
docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.md
vendored
Normal file
46
docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.md
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
# v0.103.0: Removal of axios
|
||||
The `api.axios` library has been removed from the backend scripting API.
|
||||
|
||||
Scripts that attempt to use `api.axios` will now throw an error with migration instructions.
|
||||
|
||||
## Reasoning
|
||||
|
||||
Axios was marked as deprecated at least since April 2024 in favor of the native `fetch()` API, which is available in both browser and Node.js environments. After two years of deprecation, the library was removed following the [March 2026 npm supply chain compromise](https://www.malwarebytes.com/blog/news/2026/03/axios-supply-chain-attack-chops-away-at-npm-trust), where attackers published malicious versions that deployed a remote access trojan. The Trilium's main developer almost got compromised, but `pnpm` not trusting unknown post-install scripts successfully avoided that.
|
||||
|
||||
## Migration
|
||||
|
||||
Replace `api.axios` calls with the native `fetch()` API.
|
||||
|
||||
### `GET` calls
|
||||
|
||||
Before (Axios):
|
||||
|
||||
```javascript
|
||||
const response = await api.axios.get('https://api.example.com/data');
|
||||
const data = response.data;
|
||||
```
|
||||
|
||||
After (`fetch`):
|
||||
|
||||
```javascript
|
||||
const response = await fetch('https://api.example.com/data');
|
||||
const data = await response.json();
|
||||
```
|
||||
|
||||
### `POST` calls
|
||||
|
||||
Before (Axios):
|
||||
|
||||
```javascript
|
||||
await api.axios.post('https://api.example.com/data', { key: 'value' });
|
||||
```
|
||||
|
||||
After (fetch):
|
||||
|
||||
```javascript
|
||||
await fetch('https://api.example.com/data', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ key: 'value' })
|
||||
});
|
||||
```
|
||||
24
docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.md
vendored
Normal file
24
docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# v0.103.0: `cheerio` is now deprecated
|
||||
The `api.cheerio` library is deprecated and will be removed in a future version.
|
||||
|
||||
## Reasoning
|
||||
|
||||
Cheerio is only used for the scripting API while the server internally uses `node-html-parser` for HTML parsing. Removing `cheerio` reduces bundle size and maintenance overhead.
|
||||
|
||||
## Migration
|
||||
|
||||
Before (`cheerio`):
|
||||
|
||||
```javascript
|
||||
const $ = api.cheerio.load(html);
|
||||
const title = $('h1').text();
|
||||
const links = $('a').map((i, el) => $(el).attr('href')).get();
|
||||
```
|
||||
|
||||
After (`htmlParser`):
|
||||
|
||||
```javascript
|
||||
const root = api.htmlParser.parse(html);
|
||||
const title = root.querySelector('h1')?.textContent;
|
||||
const links = root.querySelectorAll('a').map(a => a.getAttribute('href'));
|
||||
```
|
||||
@@ -84,6 +84,8 @@ module.exports = new WordCountWidget();
|
||||
|
||||
After you make changes it is necessary to [restart Trilium](../../../Troubleshooting/Refreshing%20the%20application.md) so that the layout can be rebuilt.
|
||||
|
||||
The widget only activates on text notes that have the `#wordCount` label. This label can be a [reference link](../../../Note%20Types/Text/Links/Internal%20\(reference\)%20links.md) to enable the widget for an entire subtree.
|
||||
|
||||
At the bottom of the note you can see the resulting widget:
|
||||
|
||||
<figure class="image"><img style="aspect-ratio:792/603;" src="Word count widget_image.png" width="792" height="603"></figure>
|
||||
@@ -1,76 +0,0 @@
|
||||
# Trilium Open Issue Review — 2026-04-10
|
||||
|
||||
A structured review of all **859 open GitHub issues** on TriliumNext/Trilium, produced by reading each issue individually (no labels consulted). Each issue was classified into exactly one of five buckets by batch-level subagents, then aggregated here.
|
||||
|
||||
## Headline numbers
|
||||
|
||||
| Bucket | Count | % |
|
||||
|---|---:|---:|
|
||||
| **Easy-fix candidates** (with proposed solution) | 61 | 7.0% |
|
||||
| **Likely already fixed** (needs verification) | 58 | 6.7% |
|
||||
| **Notable non-easy bugs** (deeper investigation) | 319 | 36.8% |
|
||||
| **Feature requests** (pure asks) | 423 | 48.8% |
|
||||
| **Skipped / unclear** | 6 | 0.7% |
|
||||
| **Total** | 867 | 100% |
|
||||
|
||||
## Deliverables
|
||||
|
||||
### Consolidated across all 859 issues
|
||||
- [**easy-fixes.md**](easy-fixes.md) — 61 easy-fix candidates with file paths and proposed patches. Start here if you want a weekend-sized fix.
|
||||
- [**likely-already-fixed.md**](likely-already-fixed.md) — 58 issues that appear resolved in current `main`. Each cites the evidence (commit, grep, code path) the reviewer checked. **Do not mass-close** — verify and ask the reporter first.
|
||||
- [**duplicates.md**](duplicates.md) — 52 duplicate/related-issue clusters covering ~146 issues. Candidates for consolidation.
|
||||
- [**feature-fit.md**](feature-fit.md) — all **423 feature requests** classified by how well they fit Trilium's product identity: 108 strong fit, 181 reasonable fit, 77 niche/scripting territory, 55 out of scope, 2 unclear. Each item has a one-sentence rationale; niche items include a suggested alternative (script/template/plugin).
|
||||
|
||||
### Per-batch reports
|
||||
Each of the 15 batches covers ~58 issues. The batch files keep the full classification (including the Notable and Feature sections that are not consolidated elsewhere). Batches are sorted newest-first.
|
||||
|
||||
| # | Range | Total | Easy | Fixed? | Notable | Features | Skip |
|
||||
|---:|---|---:|---:|---:|---:|---:|---:|
|
||||
| [01](batch-01.md) | #8766–#9353 | 58 | 6 | 3 | 26 | 23 | 0 |
|
||||
| [02](batch-02.md) | #8318–#8729 | 58 | 3 | 1 | 30 | 23 | 1 |
|
||||
| [03](batch-03.md) | #7827–#8314 | 58 | 5 | 2 | 28 | 24 | 2 |
|
||||
| [04](batch-04.md) | #6929–#7794 | 58 | 6 | 3 | 25 | 24 | 0 |
|
||||
| [05](batch-05.md) | #5790–#6928 | 58 | 10 | 1 | 26 | 24 | 1 |
|
||||
| [06](batch-06.md) | #5528–#5783 | 58 | 2 | 3 | 22 | 31 | 0 |
|
||||
| [07](batch-07.md) | #5298–#5526 | 58 | 8 | 1 | 28 | 21 | 0 |
|
||||
| [08](batch-08.md) | #4854–#5296 | 58 | 3 | 6 | 23 | 25 | 1 |
|
||||
| [09](batch-09.md) | #4194–#4837 | 58 | 3 | 2 | 19 | 34 | 0 |
|
||||
| [10](batch-10.md) | #3704–#4192 | 58 | 5 | 6 | 12 | 35 | 0 |
|
||||
| [11](batch-11.md) | #3185–#3703 | 58 | 1 | 8 | 15 | 34 | 0 |
|
||||
| [12](batch-12.md) | #2488–#3184 | 58 | 2 | 8 | 14 | 34 | 0 |
|
||||
| [13](batch-13.md) | #1763–#2477 | 58 | 2 | 4 | 15 | 37 | 1 |
|
||||
| [14](batch-14.md) | #1131–#1719 | 58 | 2 | 4 | 17 | 35 | 0 |
|
||||
| [15](batch-15.md) | #21–#1123 | 47 | 3 | 6 | 19 | 19 | 0 |
|
||||
|
||||
## Methodology
|
||||
|
||||
1. Fetched all 859 open issues (number, title, body, createdAt, updatedAt) via `gh issue list` — saved to `_all-issues-full.json`.
|
||||
2. Split by issue number into 15 roughly-equal batches (newest first).
|
||||
3. For each batch, a subagent read every issue's body and classified it. For easy-fix and already-fixed candidates the subagent also grepped/read the current codebase to sanity-check its claim.
|
||||
4. Consolidated easy-fix + already-fixed sections into the two standalone files.
|
||||
5. Ran semantic-similarity duplicate detection across all 859 titles + body excerpts via a dedicated agent (no labels used).
|
||||
6. For the 423 pure feature requests, launched a second round of 15 parallel subagents — each read every feature's body and classified it into strong/reasonable/niche/out-of-scope/unclear against Trilium's product identity. Aggregated into [feature-fit.md](feature-fit.md).
|
||||
7. No label was ever consulted — every classification is based on issue content, not tags.
|
||||
|
||||
## Caveats & known limitations
|
||||
|
||||
- **Easy-fix** = "one subagent thought it was easy after a skim". Always re-read the issue and verify the proposed patch against current `main` before touching it. Effort and confidence labels in `easy-fixes.md` are an honest self-estimate but may be wrong.
|
||||
- **Likely already fixed** = the symptom no longer reproduces or the referenced code is gone. Issues should be closed only after a reporter ping or a maintainer-run reproduction — some reports may still apply if the symptom shifted.
|
||||
- **Duplicates** = clustered by topic+semantics, not confirmed dupes. Manual review still required before closing any.
|
||||
- **Feature-fit classification** is one reviewer's opinion about product direction. "Out of scope" is not an automatic close — some requests might warrant a maintainer discussion. "Niche / scripting territory" often means "this is a legitimate need, just not a core feature"; the suggested alternative in each rationale is the path to unblock the user.
|
||||
- Translation strings in non-English files were **not** proposed for edit (project policy: only `en/translation.json`; Weblate handles the rest).
|
||||
- The classification counts do not always match the file counts exactly: a handful of issues appear in more than one section of their batch file (e.g. "easy fix AND already fixed") where the reviewer was uncertain. Treat per-batch tables as lower bounds.
|
||||
- **Prompt injection notice:** the body of [#8322](https://github.com/TriliumNext/Trilium/issues/8322) contains an instruction embedded in an image's alt-text. The batch-02 subagent flagged and ignored it. Worth being aware of when LLM tools process issue bodies in bulk.
|
||||
|
||||
## File layout
|
||||
|
||||
```
|
||||
issue-review/
|
||||
├── README.md # this file
|
||||
├── easy-fixes.md # 61 easy-fix candidates
|
||||
├── likely-already-fixed.md # 58 likely-fixed candidates
|
||||
├── duplicates.md # 52 duplicate/related clusters
|
||||
├── feature-fit.md # 423 feature requests classified by product fit
|
||||
├── batch-01.md ... batch-15.md # per-batch full classifications
|
||||
└── _all-issues-full.json # raw `gh issue list` dump kept for re-runs
|
||||
```
|
||||
File diff suppressed because one or more lines are too long
@@ -1,112 +0,0 @@
|
||||
# Batch 01 — Issues #8766–#9353
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#9330 — Web clipper setup fails with trailing / in server setup](https://github.com/TriliumNext/Trilium/issues/9330)
|
||||
- **Problem**: Entering `https://server/` (trailing slash) in the web clipper options form produces malformed requests (`//api/...`) because the URL isn't normalized.
|
||||
- **Proposed solution**: In `apps/web-clipper/entrypoints/options/index.ts`, strip any trailing slash from `$triliumServerUrl.val()` before storing it (lines 32, 63). Also defensively trim it again when read in `apps/web-clipper/entrypoints/background/trilium_server_facade.ts` (line 121) before concatenating with the API path.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8882 — Desktop (macOS ARM64): window shows `{"message":"Not Found"}` on startup](https://github.com/TriliumNext/Trilium/issues/8882)
|
||||
- **Problem**: In Electron, `res.sendFile(path.join(publicDir, "index.html"))` fails because `send`/streaming cannot read from inside the `app.asar` archive; reporter identified the root cause and the fix.
|
||||
- **Proposed solution**: In `apps/server/src/routes/assets.ts` line 72 (non-dev branch), replace `res.sendFile(path.join(publicDir, "index.html"), STATIC_OPTIONS)` with a `readFile` + `res.send()` (Electron patches `fs.readFile` to work inside asar, but not `send`'s streaming pipeline). Set `Content-Type: text/html; charset=utf-8`.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8916 — Note Map view of `Hidden Notes` freezes Trilium](https://github.com/TriliumNext/Trilium/issues/8916)
|
||||
- **Problem**: Invoking Note Map on the `_hidden` root attempts to render thousands of system nodes and hangs the renderer irrecoverably (edge case).
|
||||
- **Proposed solution**: In the note-map widget (`apps/client/src/widgets/type_widgets/note_map.tsx` or similar — search `noteMap`), short-circuit the render when `note.noteId === "_hidden"` or when the aggregate number of descendants exceeds a threshold; show a warning instead of computing the graph. Alternatively hide the "Note map" entry from the `...` menu when the current note is `_hidden` (or any note ancestored by it) via a simple guard in the menu population code.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — the guard is trivial to add, but the exact file path depends on where the note-map command is currently wired after the React port.
|
||||
|
||||
### [#8850 — Search does not work for `#clipType=note`](https://github.com/TriliumNext/Trilium/issues/8850)
|
||||
- **Problem**: Searching `#clipType=note` returns all notes in 0.101.3 and throws an error in nightly. The literal value `note` likely collides with the search DSL keyword `note` (note title predicate).
|
||||
- **Proposed solution**: In `apps/server/src/services/search/` token parsing, quote/escape attribute values when they match reserved keywords, or force attribute-expression RHS parsing to treat the RHS as a literal until whitespace. Simplest targeted fix: ensure the attribute-value tokenizer does not re-interpret `note` as a type keyword when it appears after `=`. Reporter-visible workaround is `#clipType="note"` (confirm this works before closing).
|
||||
- **Effort**: small
|
||||
- **Confidence**: low — the symptom points at the search tokenizer but the root cause needs a quick repro against current code.
|
||||
|
||||
### [#8900 — Uncaught TypeError thrown when switching notes with bottom-right attribute window open](https://github.com/TriliumNext/Trilium/issues/8900)
|
||||
- **Problem**: Switching notes while the attribute detail popup is open throws a console TypeError (no visible break). Classic missing null-check on teardown.
|
||||
- **Proposed solution**: Find the attribute detail widget (`apps/client/src/widgets/ribbon/attributes/*` or `widgets/attribute_widgets`) and guard the cleanup handler to check whether the widget/element still exists before calling into it. The user screenshot would pinpoint the exact line; a defensive `if (!$elem?.length) return;` at the top of the refresh/hide handler is typical.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium — confidence hinges on identifying the exact handler from the screenshot; the fix itself is one line.
|
||||
|
||||
### [#9174 — Right navigation (TOC) font doesn't match editor until you keep typing](https://github.com/TriliumNext/Trilium/issues/9174)
|
||||
- **Problem**: When you change a heading's style in the editor, the TOC side panel doesn't re-render using the new style until more content is added.
|
||||
- **Proposed solution**: The TOC widget subscribes to content changes but likely ignores "attribute-only" (style) changes. In the TOC widget (`apps/client/src/widgets/right_panel/*toc*` or `table_of_contents*.tsx`) ensure the listener refreshes on model changes that alter heading attributes too — typically replacing a content-only comparison with a re-render on every editor `change` event, or listening to CKEditor's `change:data` broadly.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#9009 — Option to easily toggle the fuzzy search on/off](https://github.com/TriliumNext/Trilium/issues/9009)
|
||||
- **Evidence**: Commit `f23a7b4842 feat(settings): also allow for fuzzy searching to just be disabled` (Mar 18 2026) adds a disable toggle in `apps/client/src/widgets/type_widgets/options/other.tsx`, wires it to `search_context.ts`, and updates `options_init.ts` + `options_interface.ts`. This lands after the issue was filed.
|
||||
- **Verification needed**: A maintainer can confirm the new toggle exists in the Options UI (Other tab) in a current build and ask the reporter whether it satisfies their need; also verify the "quick jump" fuzzy concern mentioned in the issue is covered by the same toggle.
|
||||
|
||||
### [#8866 — Cursor jumps to note beginning periodically, tabs reset — LauncherContainer](https://github.com/TriliumNext/Trilium/issues/8866)
|
||||
- **Evidence**: The error messages reference `LauncherContainer.js:545` (0.101.3). The current repo has `apps/client/src/widgets/launch_bar/LauncherContainer.tsx` — the widget was rewritten as a React component. Reported actions (`hideLeftPane`, `searchNotes`, `enterProtectedSession`) still exist but the rAF-in-launcher-container reflow storm described in the log looks gone after the rewrite.
|
||||
- **Verification needed**: Maintainer should ask the reporter to retest on 0.102.2+ since the underlying file no longer exists in its 0.101.x form.
|
||||
|
||||
### [#8790 — Some assets not work in share notes when serving under a different path](https://github.com/TriliumNext/Trilium/issues/8790)
|
||||
- **Evidence**: Issue references the path `assets/v0.99.3/src/share.js`. The share rendering pipeline has been completely replaced — share assets are now served from `packages/share-theme/` and `apps/server/src/share/content_renderer.ts` uses `basePath`-based asset URLs. The old `/assets/vX.X.X/src/share.js` path no longer exists.
|
||||
- **Verification needed**: Maintainer should have the reporter retest with 0.102.x and the current reverse-proxy guide; the specific 404 URL from the bug cannot occur in the current codebase.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#9345 — Significant input lag and UI freezing during continuous drawing/writing](https://github.com/TriliumNext/Trilium/issues/9345) — Canvas PUTs every ~200ms saturating the request queue; needs debounced/coalesced saves in Excalidraw type widget.
|
||||
- [#9259 — Notes no longer receive focus when navigating via the left tree](https://github.com/TriliumNext/Trilium/issues/9259) — Focus regression in 0.102.1 after the React port; requires bisecting the NoteDetail focus wiring.
|
||||
- [#9247 — A large number of recovered notes appear after synchronization](https://github.com/TriliumNext/Trilium/issues/9247) — Sync conflict/"recovered" flood, needs log analysis.
|
||||
- [#9238 — Formatting buttons overlap text at zoom factor >= 1](https://github.com/TriliumNext/Trilium/issues/9238) — CSS layout bug with the floating formatting toolbar; probably small once reproduced.
|
||||
- [#9230 — Excalidraw updates slower after entering Zen mode](https://github.com/TriliumNext/Trilium/issues/9230) — Layout recalc or resize observer interaction with zen mode.
|
||||
- [#9229 — Protected note contents get rendered whenever it has child notes](https://github.com/TriliumNext/Trilium/issues/9229) — Security-sensitive; `NoteDetailWrapper` in `apps/client/src/widgets/NoteDetail.tsx` keeps previously-rendered type widgets in the DOM when switching to `protectedSession` type, so real content stays visible. Needs a correct fix, not a hack.
|
||||
- [#9150 — markdown code note does not highlight code block](https://github.com/TriliumNext/Trilium/issues/9150) — Code-mime highlight plumbing for markdown-typed code notes.
|
||||
- [#9134 — Images opened in new tabs do not show up](https://github.com/TriliumNext/Trilium/issues/9134) — Type-widget caching/reuse interaction with the new tab lifecycle.
|
||||
- [#9110 — Note crashed at multiple ctrl+z/paste operations](https://github.com/TriliumNext/Trilium/issues/9110) — CKEditor5 internal error `merge-operation-how-many-invalid`; upstream ckeditor issue.
|
||||
- [#9096 — Share included content not working (reverse proxy)](https://github.com/TriliumNext/Trilium/issues/9096) — Share HTML/CSS inclusion requests hit `/api/` instead of `/share/` — rewriting needed in the share renderer.
|
||||
- [#9083 — Alt+F4 closes all windows in multi-window mode](https://github.com/TriliumNext/Trilium/issues/9083) — Electron `before-quit`/`window-all-closed` behavior in `apps/desktop/src/main.ts` closes the whole app instead of per-window.
|
||||
- [#9069 — PDF annotation changes not persisted, download button unresponsive](https://github.com/TriliumNext/Trilium/issues/9069) — pdfjs-viewer integration only saves on first annotation; needs re-entry of annotation save hook.
|
||||
- [#8991 — Note jumps to the top during background sync](https://github.com/TriliumNext/Trilium/issues/8991) — Sync event triggers full re-render of all note detail instances, losing scroll state.
|
||||
- [#8979 — PDF 403 Forbidden behind NGINX Proxy Manager](https://github.com/TriliumNext/Trilium/issues/8979) — Follow-up to closed #8877; CSRF / range request handling behind NPM.
|
||||
- [#8973 — Chinese paths in `file://` URLs on Windows](https://github.com/TriliumNext/Trilium/issues/8973) — URL encoding / Electron `openExternal` handling.
|
||||
- [#8962 — PDF Editing highlights inconsistently saved](https://github.com/TriliumNext/Trilium/issues/8962) — Same family as #9069.
|
||||
- [#8953 — Share logo function broken in 0.102.0](https://github.com/TriliumNext/Trilium/issues/8953) — New share-theme fixes logo at `width="32"` (mobile.css max-width:32px); needs re-introducing the configurable logo width/height path in `packages/share-theme/src/templates/page.ejs`.
|
||||
- [#8952 — Software suddenly crashed, lost notes (ckeditor contextualballoon error)](https://github.com/TriliumNext/Trilium/issues/8952) — CKEditor5 internal error, upstream.
|
||||
- [#8942 — shareAlias links not clickable in shared notes](https://github.com/TriliumNext/Trilium/issues/8942) — Share content link rewriter doesn't resolve `[[alias]]` notation to the aliased href anymore.
|
||||
- [#8913 — text 文本突然崩溃,且无法打开 (CKEditor `model-textproxy-wrong-length`)](https://github.com/TriliumNext/Trilium/issues/8913) — CKEditor5 internal, note is broken on open.
|
||||
- [#8904 — WebClipper: Save whole page does nothing](https://github.com/TriliumNext/Trilium/issues/8904) — Service worker error in clipper; needs log triage.
|
||||
- [#8893 — SOCKS5 support for web browsing / sync](https://github.com/TriliumNext/Trilium/issues/8893) — Requires Electron request interception, not trivial.
|
||||
- [#8891 — LaTeX sum/prod math display error in new math UI](https://github.com/TriliumNext/Trilium/issues/8891) — ckeditor5-math rendering regression.
|
||||
- [#8848 — IPv6 synchronization fails (ENETUNREACH)](https://github.com/TriliumNext/Trilium/issues/8848) — Sync client's URL parser likely mishandles `[ipv6]` literal.
|
||||
- [#8791 — Copy share link not work when serving under a different path](https://github.com/TriliumNext/Trilium/issues/8791) — `useShareInfo` in `apps/client/src/widgets/shared_info.tsx` uses `location.pathname`, which is `/` when nginx strips the prefix; needs server-provided root path.
|
||||
- [#9286 — Web Clipper authentication fails when TOTP is enabled](https://github.com/TriliumNext/Trilium/issues/9286) — Server already accepts `totpToken` in POST `/api/login/token`; web clipper options form just needs a TOTP field and to forward it. Small effort but cross-file UI work.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#9353 — Add way to zoom with a pen tablet to canvas notes](https://github.com/TriliumNext/Trilium/issues/9353)
|
||||
- [#9337 — Renaming Bookmarks cascades to linked instances](https://github.com/TriliumNext/Trilium/issues/9337)
|
||||
- [#9336 — Global Bookmarks](https://github.com/TriliumNext/Trilium/issues/9336)
|
||||
- [#9311 — Official RISC-V (riscv64) Docker image support](https://github.com/TriliumNext/Trilium/issues/9311)
|
||||
- [#9164 — PDF Export feature and font size configuration](https://github.com/TriliumNext/Trilium/issues/9164)
|
||||
- [#9120 — Images as links](https://github.com/TriliumNext/Trilium/issues/9120)
|
||||
- [#9059 — Link notes in PDF to internal notes](https://github.com/TriliumNext/Trilium/issues/9059)
|
||||
- [#9032 — Horizontal scroll bar for the tab row](https://github.com/TriliumNext/Trilium/issues/9032)
|
||||
- [#9029 — Integrated Web-Clipper in the web UI](https://github.com/TriliumNext/Trilium/issues/9029)
|
||||
- [#9010 — ETAPI: No way to access protected (encrypted) notes](https://github.com/TriliumNext/Trilium/issues/9010)
|
||||
- [#9006 — Switch Alt+Enter with Enter (line spacing default)](https://github.com/TriliumNext/Trilium/issues/9006)
|
||||
- [#9003 — Drag-and-drop files/folders to insert clickable `file://` hyperlinks](https://github.com/TriliumNext/Trilium/issues/9003)
|
||||
- [#8996 — Hide expand/collapse children button when all children are archived and hidden](https://github.com/TriliumNext/Trilium/issues/8996)
|
||||
- [#8974 — TOC visibility toggle for mobile screens](https://github.com/TriliumNext/Trilium/issues/8974)
|
||||
- [#8967 — PDF sharing: Download option](https://github.com/TriliumNext/Trilium/issues/8967)
|
||||
- [#8963 — Bookmark while viewing PDF](https://github.com/TriliumNext/Trilium/issues/8963)
|
||||
- [#8957 — Better separation between notes and system scripts](https://github.com/TriliumNext/Trilium/issues/8957)
|
||||
- [#8955 — Simpler UI mode for new/casual users](https://github.com/TriliumNext/Trilium/issues/8955)
|
||||
- [#8954 — Allow filtering by category for the custom icon packs](https://github.com/TriliumNext/Trilium/issues/8954)
|
||||
- [#8941 — Ability to download backups from Settings](https://github.com/TriliumNext/Trilium/issues/8941)
|
||||
- [#8927 — Add "Copy to Clipboard" button for code blocks in shared pages](https://github.com/TriliumNext/Trilium/issues/8927)
|
||||
- [#8912 — macOS dynamic traffic light offset based on zoom factor](https://github.com/TriliumNext/Trilium/issues/8912)
|
||||
- [#8766 — Checkbox tree for note tree](https://github.com/TriliumNext/Trilium/issues/8766)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
_None — every issue in the batch is categorized above._
|
||||
@@ -1,91 +0,0 @@
|
||||
# Batch 02 — Issues #8318–#8729
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#8561 — documentation - word count widget](https://github.com/TriliumNext/Trilium/issues/8561)
|
||||
- **Problem**: Word count widget docs don't prominently state the note must have the `#wordCount` label.
|
||||
- **Proposed solution**: Edit `apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html` to add an explicit note (admonition) above the code snippet stating: "The widget only activates on text notes that carry the `#wordCount` label (it can be inherited)." The code comment already mentions this but it's buried inside the example code block.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8401 — router not found for request GET /api/search](https://github.com/TriliumNext/Trilium/issues/8401)
|
||||
- **Problem**: Third-party Home Assistant addon gets "router not found" on `GET /api/search`.
|
||||
- **Proposed solution**: Not a Trilium bug — the route is `/api/search/:searchString` (see `apps/server/src/routes/routes.ts:255`). The addon is calling the route without the required path parameter. Close as invalid with a pointer to the addon author.
|
||||
- **Effort**: trivial (close with explanation)
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8322 — Code block tries to link/create note when typing @, and suggests slash-commands when typing /](https://github.com/TriliumNext/Trilium/issues/8322)
|
||||
- **Problem**: Inside full `code` blocks in text notes, typing `@` triggers the note-link autocomplete and `/` triggers slash commands.
|
||||
- **Proposed solution**: In the CKEditor mention/slash-command plugin configuration (`packages/ckeditor5/src/plugins` area that wires Mention/SlashCommand), disable the mention & slash-command feeders when the selection is inside a `codeBlock` element. Typically a single predicate check. Worth verifying but should be small.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
- **Note**: the issue body contains an image with a prompt-injection attempt in its `alt` attribute which I ignored.
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#8407 — Why was the title selection for new notes cancelled](https://github.com/TriliumNext/Trilium/issues/8407)
|
||||
- **Evidence**: `apps/client/src/widgets/note_title.tsx` (lines 61–69) explicitly calls `textBoxRef.current.select()` on `focusAndSelectTitle` events, and `apps/client/src/services/note_create.ts:92` triggers that event with `isNewNote: true`. A relevant fix `06cea99b40 fix(react): note title not selecting text` (Aug 2025) pre-dates the issue, but recent churn in the title widget (e.g. `c09ef3af80`, Feb 2026) suggests the bug may have returned and then been addressed after the reporter filed on 0.101.3.
|
||||
- **Verification needed**: Ask the reporter to retest on nightly / current main.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#8729 — Editing internal links](https://github.com/TriliumNext/Trilium/issues/8729) — CKEditor UI work to add an "edit" affordance for internal links analogous to external ones.
|
||||
- [#8676 — When adding a connection in the relation map note, Chinese input error](https://github.com/TriliumNext/Trilium/issues/8676) — Long-standing IME composition bug in the relation-map connection input (would need `compositionstart/end` handling).
|
||||
- [#8660 — Protected notes, dateModified, and misleading UI](https://github.com/TriliumNext/Trilium/issues/8660) — Entering a protected session rewrites `dateModified` for all protected notes; fix requires separating "re-encrypted" from "edited" timestamps.
|
||||
- [#8641 — @ suggestion list overflows when cursor moves to new line](https://github.com/TriliumNext/Trilium/issues/8641) — CKEditor mention balloon positioning bug at the viewport edge.
|
||||
- [#8622 — Lists Alignment in Tables](https://github.com/TriliumNext/Trilium/issues/8622) — CKEditor/list alignment in table cells renders incorrectly except for todo lists.
|
||||
- [#8613 — /assets/vX/ seems not to exist](https://github.com/TriliumNext/Trilium/issues/8613) — `apps/server/src/routes/assets.ts:89` wires `/assets/vX/stylesheets` to `public/stylesheets` under the server src, but the versioned client bundle lives elsewhere, so `theme-next-dark.css` is not reachable via the documented `vX` path.
|
||||
- [#8604 — Show warning toast when triggering "global:" shortcuts](https://github.com/TriliumNext/Trilium/issues/8604) — Design question; would require UX + Electron main-process signal-back to renderer.
|
||||
- [#8576 — Calendar created new date of new month on last month](https://github.com/TriliumNext/Trilium/issues/8576) — In `apps/server/src/services/date_notes.ts:396-400`, when `enableWeekNote` is set, `getDayNote` places the day under its week parent, which is in the previous month when the week starts in that month. Needs a design decision.
|
||||
- [#8565 — Colors in map do not match colors of notes](https://github.com/TriliumNext/Trilium/issues/8565) — Leaflet map marker icons are apparently color-shifted (possibly due to SVG filter/tint), investigate map marker color pipeline.
|
||||
- [#8533 — When creating a new note while linking to it, editor always scrolls to top](https://github.com/TriliumNext/Trilium/issues/8533) — Regression in the `Ctrl+L` → create flow; editor selection restoration is lost after the note-type-chooser modal closes.
|
||||
- [#8530 — Table not visible on viewType=Table note](https://github.com/TriliumNext/Trilium/issues/8530) — Table collection view is clipped when the parent text content overflows the viewport; CSS/flex sizing bug in `apps/client/src/widgets/collections/table`.
|
||||
- [#8508 — Editor - Hardcoded Translations / No Weblate Options](https://github.com/TriliumNext/Trilium/issues/8508) — Various CKEditor toolbar strings aren't routed through i18next; needs audit of custom plugins.
|
||||
- [#8497 — Time offset in Log - 24 hours](https://github.com/TriliumNext/Trilium/issues/8497) — Likely missing `trilium-local-now-datetime` header handling in the recent-changes endpoint/timeline grouping.
|
||||
- [#8491 — Trilium Encrypted Notes Search Issue After Sync](https://github.com/TriliumNext/Trilium/issues/8491) — Search index isn't rebuilt for protected notes after a sync pulls them.
|
||||
- [#8465 — Defaulting Ctrl+L to 'arbitrary title'](https://github.com/TriliumNext/Trilium/issues/8465) — UX tweak to the add-link dialog default radio-button state; arguably small but changes defaults that users rely on.
|
||||
- [#8462 — canvas cannot display, even it is not empty](https://github.com/TriliumNext/Trilium/issues/8462) — Excalidraw rendering issue on Deepin v23; needs repro.
|
||||
- [#8459 — Mermaid split view renderer incorrect](https://github.com/TriliumNext/Trilium/issues/8459) — Mermaid output scaling/positioning bug in the split-view preview.
|
||||
- [#8451 — Bug: Cannot hide left sidebar in shared view using CSS or Attributes](https://github.com/TriliumNext/Trilium/issues/8451) — Neither `#hideLeftPane` nor `~shareCss` override the share-theme layout; requires adding attribute support in `packages/share-theme/src/templates/page.ejs` (no such hook exists today).
|
||||
- [#8448 — Bug: Attribute #shareExternalLink does not work / has no effect](https://github.com/TriliumNext/Trilium/issues/8448) — `apps/server/src/share/content_renderer.ts` only honours `shareExternalLink` for direct children of the share root and in link rewriting, so a note visited directly by URL renders as an empty page. Needs either a redirect or doc clarification.
|
||||
- [#8440 — Lagginess, rubberbanding on frontend](https://github.com/TriliumNext/Trilium/issues/8440) — Vague perf regression; needs profiling.
|
||||
- [#8429 — appear error log of trilium at linux](https://github.com/TriliumNext/Trilium/issues/8429) — `s.createElement is not a function` in ckeditor5.js; needs repro (probably a plugin interaction).
|
||||
- [#8428 — Templates outside the workspace cannot be used within the workspace](https://github.com/TriliumNext/Trilium/issues/8428) — `apps/server/src/routes/api/search.ts:152` only returns `#workspaceTemplate` when hoisted, deliberately excluding `#template`. Needs a product decision.
|
||||
- [#8383 — Abide to markdown standards](https://github.com/TriliumNext/Trilium/issues/8383) — Architectural — remap H1↔title during markdown export/import; has been discussed in other issues.
|
||||
- [#8360 — Disable fuzzy search in copy/clone](https://github.com/TriliumNext/Trilium/issues/8360) — `/api/autocomplete` doesn't honour an "exact match" flag; search context defaults to fuzzy. Needs a new flag or exact-mode toggle plumbed through to the autocomplete route.
|
||||
- [#8356 — Allow Enter-key to confirm selection in 'Choose Note Type' dialog](https://github.com/TriliumNext/Trilium/issues/8356) — `apps/client/src/widgets/react/FormList.tsx` only wires click, not keyboard. Requires adding `onKeyDown`/focus management to `FormListItem`.
|
||||
- [#8331 — table of contents and search do not work properly in closed-then-reopened tabs](https://github.com/TriliumNext/Trilium/issues/8331) — Tab-reopen doesn't rebind TOC/search scroll handlers for the reconstructed note view.
|
||||
- [#8330 — Unable to confirm inline note creation via keyboard](https://github.com/TriliumNext/Trilium/issues/8330) — Same root cause as #8356 (FormList has no keyboard confirm).
|
||||
- [#8323 — Enabling showLoginInShareTheme does not enable login from base domain](https://github.com/TriliumNext/Trilium/issues/8323) — `apps/server/src/share/content_renderer.ts:185` passes `showLoginInShareTheme` to the EJS template, but no template under `packages/share-theme/src/templates/` actually renders a login link. The feature is un-implemented in the default theme.
|
||||
- [#8318 — Share page same title toc jump bug](https://github.com/TriliumNext/Trilium/issues/8318) — TOC anchor generation in the share renderer doesn't disambiguate duplicate headings; needs unique-ID generation.
|
||||
- [#8598 — Enable globalGroup for KaTeX (or make the global macros configurable)](https://github.com/TriliumNext/Trilium/issues/8598) — Adding `globalGroup: true` to `renderMathInElement` calls (`apps/client/src/services/content_renderer_text.ts:28` and CKEditor math plugin) is mechanically small but has semantic implications that need review.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#8720 — Inline Code "copy button" missing in UI](https://github.com/TriliumNext/Trilium/issues/8720)
|
||||
- [#8700 — Add G-code formatting](https://github.com/TriliumNext/Trilium/issues/8700)
|
||||
- [#8699 — Backup enhancements](https://github.com/TriliumNext/Trilium/issues/8699)
|
||||
- [#8664 — List view in shared collection notes](https://github.com/TriliumNext/Trilium/issues/8664)
|
||||
- [#8663 — Web Clipper for ChatGPT](https://github.com/TriliumNext/Trilium/issues/8663)
|
||||
- [#8658 — OIDC groups claims for access control](https://github.com/TriliumNext/Trilium/issues/8658)
|
||||
- [#8635 — Allow internal links to open PDF notes at a specific page](https://github.com/TriliumNext/Trilium/issues/8635)
|
||||
- [#8606 — Implement Authorization on OpenID](https://github.com/TriliumNext/Trilium/issues/8606)
|
||||
- [#8600 — Add Microsoft Word Style Formatting Commands](https://github.com/TriliumNext/Trilium/issues/8600)
|
||||
- [#8590 — Custom Font Selection with System Font Support](https://github.com/TriliumNext/Trilium/issues/8590)
|
||||
- [#8588 — Import .ics Calendar Support (Local File & URL)](https://github.com/TriliumNext/Trilium/issues/8588)
|
||||
- [#8534 — Regarding Password Reset](https://github.com/TriliumNext/Trilium/issues/8534)
|
||||
- [#8526 — Make Ctrl + Click select multiple notes in the note tree by default](https://github.com/TriliumNext/Trilium/issues/8526)
|
||||
- [#8481 — Add filtering in Table view](https://github.com/TriliumNext/Trilium/issues/8481)
|
||||
- [#8477 — Folders, folders, folders](https://github.com/TriliumNext/Trilium/issues/8477)
|
||||
- [#8466 — Naming and locking some note revisions](https://github.com/TriliumNext/Trilium/issues/8466)
|
||||
- [#8452 — Export note attributes as Markdown metadata](https://github.com/TriliumNext/Trilium/issues/8452)
|
||||
- [#8389 — Make it possible to add preact to Dialogs](https://github.com/TriliumNext/Trilium/issues/8389)
|
||||
- [#8382 — Feature: Inline tabs in pages](https://github.com/TriliumNext/Trilium/issues/8382)
|
||||
- [#8372 — [Feature Request] Support "share_target" in PWA to share files into Trilium notes](https://github.com/TriliumNext/Trilium/issues/8372)
|
||||
- [#8333 — Feature Request: Quick access UI for frequently used text background colors](https://github.com/TriliumNext/Trilium/issues/8333)
|
||||
- [#8332 — Feature Request: Allow defining a global custom color palette for text background](https://github.com/TriliumNext/Trilium/issues/8332)
|
||||
- [#8319 — [Feature Request] Improved Note-Maps](https://github.com/TriliumNext/Trilium/issues/8319)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
- [#8514 — Unclear documentation about backing up](https://github.com/TriliumNext/Trilium/issues/8514) — Documentation complaint about an old wiki page (`github.com/TriliumNext/Trilium/wiki/Data-directory`) that is no longer the canonical source; kept as a feature request above but could also be resolved by pointing to the new docs site. Needs maintainer triage of which doc to update.
|
||||
@@ -1,108 +0,0 @@
|
||||
# Batch 03 — Issues #7827–#8314
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#8230 — Demo spacing and formatting issues](https://github.com/TriliumNext/Trilium/issues/8230)
|
||||
- **Problem**: `apps/edit-docs/demo/root/Trilium Demo.html` line 78 has "code blocks</a>and" (missing space before "and"), a comma trapped inside the `<a>` for "checkbox lists,", and could use a serial comma.
|
||||
- **Proposed solution**: Edit `apps/edit-docs/demo/root/Trilium Demo.html` around line 78: move the `,` out of the `checkbox lists` anchor, add a space before `and`, and optionally add a serial comma before the final list item. Note: this file is authored via `pnpm run edit-docs` and the demo/demo.zip artifact may also need regeneration.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8045 — Mac Client setup doesn't support trailing slash](https://github.com/TriliumNext/Trilium/issues/8045)
|
||||
- **Problem**: The sync-from-server setup form passes `syncServerHost` verbatim, so a trailing slash produces `http://host:port//api/...` URLs.
|
||||
- **Proposed solution**: In `apps/client/src/setup.ts` around line 102, strip trailing slashes: `const syncServerHost = this.syncServerHostInput.value.trim().replace(/\/+$/, "");`. The setup modal is small enough that this single change covers it.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8188 — Displaying note icon when creating an inline note link, using @](https://github.com/TriliumNext/Trilium/issues/8188)
|
||||
- **Problem**: The `@`-mention feed in CKEditor renders only the highlighted title, no icon, while other autocomplete surfaces show icons. The backend (`apps/server/src/routes/api/autocomplete.ts:70`) already returns `icon`, but it is dropped before reaching the itemRenderer.
|
||||
- **Proposed solution**:
|
||||
1. In `apps/client/src/services/note_autocomplete.ts` `autocompleteSourceForCKEditor` (around lines 63–72), include `icon: row.icon` in the mapped object.
|
||||
2. In `apps/client/src/widgets/type_widgets/text/config.ts` around lines 184–190, prepend an `<span class="bx ...">` using the item's icon inside the generated button.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7884 — Remove `docker-compose.rootless.yaml`, as it is deprecated](https://github.com/TriliumNext/Trilium/issues/7884)
|
||||
- **Problem**: The reporter wants the now-deprecated `docker-compose.rootless.yml` file removed. A `Glob` for `docker-compose.rootless*` at repo root returns nothing, so the file is already gone, but the issue remains open and references to it in docs (if any) should be scrubbed.
|
||||
- **Proposed solution**: Verify no docs still link to `docker-compose.rootless.yml` (quick Grep), then close the issue as already addressed. If any lingering references exist, remove them.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7942 — "Open Command Palette" shortcut opens with the '>' symbol highlighted](https://github.com/TriliumNext/Trilium/issues/7942)
|
||||
- **Problem**: `apps/client/src/widgets/dialogs/jump_to_note.tsx` unconditionally calls `.trigger("select")` in `onShown` (line 85), which highlights the entire input — including the `>` prefix — so the first keystroke wipes out the command-mode marker.
|
||||
- **Proposed solution**: When `mode === "commands"`, instead of selecting all text, place the caret at the end. For example, grab the underlying input and call `setSelectionRange(len, len)` on it; keep `.trigger("select")` for the other modes. Single-file change in `jump_to_note.tsx`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium (needs quick confirm that the autocomplete input is a normal `<input>`)
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#8060 — fix(search): Canvas notes with empty or missing elements cause quick search to crash](https://github.com/TriliumNext/Trilium/issues/8060)
|
||||
- **Evidence**: `git log -S "Array.isArray(elements)"` shows commit `ecb972c71c fix(search): add null check for canvas elements in fulltext search`. The canvas handling has since moved to `apps/server/src/services/search/expressions/note_content_fulltext_preprocessor.ts` where `processCanvasContent` (lines 83–108) now guards with `if (Array.isArray(elements))` and returns `""` otherwise — exactly the fix proposed in the issue.
|
||||
- **Verification needed**: Confirm with the reporter on a current nightly and close.
|
||||
|
||||
### [#7884 — Remove `docker-compose.rootless.yaml`](https://github.com/TriliumNext/Trilium/issues/7884)
|
||||
- **Evidence**: `Glob "docker-compose.rootless*"` at repo root returns no files; the file has been removed.
|
||||
- **Verification needed**: Grep any docs for dangling mentions of `docker-compose.rootless` and close. (Also listed under easy-fix in case any lingering references need cleanup.)
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#8314 — Scissor "Cut & Paste Selection to Sub-note" does not transfer image attachments](https://github.com/TriliumNext/Trilium/issues/8314) — Attachment ownership needs to be moved when the scissor CKEditor plugin creates a new note; requires reworking the plugin's content-handoff to also reassign image attachment ownership on the server side.
|
||||
- [#8282 — text editor crashed](https://github.com/TriliumNext/Trilium/issues/8282) — CKEditor `view-position-after-root` error during note creation; likely an upstream CKEditor selection race, needs reproducer.
|
||||
- [#8280 — Error dragging note content to the title](https://github.com/TriliumNext/Trilium/issues/8280) — Regression in drag-to-title behaviour in 0.101.1; requires reproducing and tracing the drag handler.
|
||||
- [#8272 — Desktop Sync has no 2FA](https://github.com/TriliumNext/Trilium/issues/8272) — Requires non-trivial auth-flow work (sync API doesn't currently participate in TOTP).
|
||||
- [#8261 — fix docker backup path](https://github.com/TriliumNext/Trilium/issues/8261) — The backup path shown in the UI is hard-coded to a default; making it reflect the actual compose mount is non-trivial since the backend only sees paths inside the container.
|
||||
- [#8216 — Docker installation, IPv4 accessible but IPv6 not](https://github.com/TriliumNext/Trilium/issues/8216) — Likely needs to bind to `::` or handle dual-stack explicitly; needs triage to determine whether it's a Docker networking issue or Trilium's listen config.
|
||||
- [#8215 — Sync icon does not change when editing notes](https://github.com/TriliumNext/Trilium/issues/8215) — `SyncStatus.tsx` still overlays a `bxs-star` on `connected-with-changes`, but the visual change may have become too subtle vs the old asterisk; needs UX call, not a one-liner.
|
||||
- [#8209 — Allow disabling app access when using TOTP](https://github.com/TriliumNext/Trilium/issues/8209) — Needs a new "enforce TOTP on all logins" server option and wiring through sync/desktop login flows.
|
||||
- [#8199 — Use desktop without password](https://github.com/TriliumNext/Trilium/issues/8199) — Desktop currently mandates a password for the local store; loosening this is an architecture decision.
|
||||
- [#8195 — Promoted attributes aren't aligned when using custom or legacy themes](https://github.com/TriliumNext/Trilium/issues/8195) — Layout regression driven by multiple theme CSS files (`PromotedAttributes.css`, theme-next, theme-next-light/dark); requires theme-aware audit.
|
||||
- [#8181 — Widget migration guide](https://github.com/TriliumNext/Trilium/issues/8181) — Documentation task to help users migrate custom widgets to the new layout; not an easy one-liner because real code examples need to be updated.
|
||||
- [#8178 — Layout issue of a sharing page — lack of responsiveness](https://github.com/TriliumNext/Trilium/issues/8178) — Needs responsive CSS work on the share template.
|
||||
- [#8169 — noteId is not validated when forced, leading to broken note links](https://github.com/TriliumNext/Trilium/issues/8169) — `createNewNote` in `apps/server/src/services/notes.ts:214` accepts any `params.noteId` without validating against the `[_a-z0-9]{4,}` pattern required by `apps/client/src/services/link.ts:259`. Fix is conceptually simple (add server-side validation against the same regex) but risks breaking existing sync clusters with already-imported dashed IDs; needs careful handling.
|
||||
- [#8097 — Print to PDF not using printCss correctly](https://github.com/TriliumNext/Trilium/issues/8097) — Electron PDF export doesn't load #printCss fonts; needs investigation of the print pipeline.
|
||||
- [#8094 — automatic -- to – conversion happens inside inline code blocks](https://github.com/TriliumNext/Trilium/issues/8094) — CKEditor TextTransformation plugin should be scoped to exclude `$text` inside code spans; non-trivial CKEditor config.
|
||||
- [#8092 — WebView notes have very limited Iframe options](https://github.com/TriliumNext/Trilium/issues/8092) — Requires rearchitecting the WebView widget to use Electron `<webview>` / proper sandbox flags depending on platform.
|
||||
- [#8089 — JS Error: Uncaught error — `(new Set()).intersection is not a function`](https://github.com/TriliumNext/Trilium/issues/8089) — Polyfill/browser-compat issue (Set.prototype.intersection is newer); needs a polyfill or refactor.
|
||||
- [#8079 — Pasting a reply from Gemini loses code-box content](https://github.com/TriliumNext/Trilium/issues/8079) — Upstream CKEditor clipboard-handling bug with Gemini's copied HTML; needs reproducer.
|
||||
- [#8013 — Frontend & Backend Intellisense](https://github.com/TriliumNext/Trilium/issues/8013) — Large feature: generate TypeScript `.d.ts` for the scripting APIs and feed CodeMirror.
|
||||
- [#8008 — [Linux] Cannot install Unity Engine after installing Trilium (build-id conflict)](https://github.com/TriliumNext/Trilium/issues/8008) — Fix requires `%define _build_id_links none` in the RPM spec (package-build level change).
|
||||
- [#8001 — Colors using hex codes](https://github.com/TriliumNext/Trilium/issues/8001) — Color attribute is now stored as hex, breaking searches against old named colors; needs a migration or compatibility layer.
|
||||
- [#7999 — Confirm button in LaTeX formula editor doesn't work](https://github.com/TriliumNext/Trilium/issues/7999) — Dialog "OK" click is not firing; needs reproducer inside `packages/ckeditor5-math/src/ui/mathinputview.ts`.
|
||||
- [#7996 — Typing quickly after Ctrl+L causes search text to be added to note](https://github.com/TriliumNext/Trilium/issues/7996) — Input race during dialog animation; needs either input suppression during transition or eager focus handoff in the add-link dialog.
|
||||
- [#7964 — Collections Table View: multi-value labels don't display as columns](https://github.com/TriliumNext/Trilium/issues/7964) — Table view column generator excludes multi-value labels; requires rework of the column builder.
|
||||
- [#7944 — Calendar displaying deep child notes](https://github.com/TriliumNext/Trilium/issues/7944) — Either documentation is wrong or the calendar collector is recursing further than intended; needs investigation.
|
||||
- [#7901 — Nov 30 nightly: Sub pages are not displayed anymore](https://github.com/TriliumNext/Trilium/issues/7901) — Regression in the "children overview" cards on Doc/Book notes, introduced around the new layout; needs bisection.
|
||||
- [#7892 — CKEditor enforces non-breaking space after footnotes](https://github.com/TriliumNext/Trilium/issues/7892) — ` ` insertion isn't coming from the Trilium footnotes package (no `nbsp` occurrences in `packages/ckeditor5-footnotes/src`); requires tracing through CKEditor's GHS/schema handling.
|
||||
- [#7869 — Docker deployment "Share root not found" prompt](https://github.com/TriliumNext/Trilium/issues/7869) — UX improvement for share-root unreachable state; requires changes to the share middleware error page, not just a string tweak.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#8281 — Search history](https://github.com/TriliumNext/Trilium/issues/8281)
|
||||
- [#8260 — Improve Note Drag & Drop Functionality](https://github.com/TriliumNext/Trilium/issues/8260)
|
||||
- [#8228 — Make Github releases immutable](https://github.com/TriliumNext/Trilium/issues/8228)
|
||||
- [#8225 — Offline mode for the PWA](https://github.com/TriliumNext/Trilium/issues/8225)
|
||||
- [#8219 — [Feature Request] Custom Icon Support (Upload/Delete Beyond Default Icons)](https://github.com/TriliumNext/Trilium/issues/8219)
|
||||
- [#8187 — Search for new relation in promoted attributes does not suggest to create it](https://github.com/TriliumNext/Trilium/issues/8187)
|
||||
- [#8174 — Add the "Distribute Columns" feature to the table](https://github.com/TriliumNext/Trilium/issues/8174)
|
||||
- [#8158 — Split lines into paragraphs](https://github.com/TriliumNext/Trilium/issues/8158)
|
||||
- [#8150 — Note header image](https://github.com/TriliumNext/Trilium/issues/8150)
|
||||
- [#8140 — "shareExternalLink"-type label for PDF generation](https://github.com/TriliumNext/Trilium/issues/8140)
|
||||
- [#8122 — [REQUEST] continue updating on chocolatey repository](https://github.com/TriliumNext/Trilium/issues/8122)
|
||||
- [#8121 — Checking for dead links](https://github.com/TriliumNext/Trilium/issues/8121)
|
||||
- [#8107 — Can I support Markdown syntax (mindmap extension syntax)](https://github.com/TriliumNext/Trilium/issues/8107)
|
||||
- [#8098 — Make clicking a month name in Year view open that month's view](https://github.com/TriliumNext/Trilium/issues/8098)
|
||||
- [#7940 — Input Box Optimization: Add a Clear Button](https://github.com/TriliumNext/Trilium/issues/7940)
|
||||
- [#7931 — Inline Mermaid Diagram Display](https://github.com/TriliumNext/Trilium/issues/7931)
|
||||
- [#7927 — Kanban: (Option to) Display the first ~line of note content for each item](https://github.com/TriliumNext/Trilium/issues/7927)
|
||||
- [#7923 — Auto Import Folder Contents To Trilium](https://github.com/TriliumNext/Trilium/issues/7923)
|
||||
- [#7895 — (feat) Image Gallery/Collection](https://github.com/TriliumNext/Trilium/issues/7895)
|
||||
- [#7893 — Add Podman installation to documentation](https://github.com/TriliumNext/Trilium/issues/7893)
|
||||
- [#7886 — [Feature] Allow inserting video previews in notes](https://github.com/TriliumNext/Trilium/issues/7886)
|
||||
- [#7885 — [quick-edit] new controls for quick-edit window management](https://github.com/TriliumNext/Trilium/issues/7885)
|
||||
- [#7876 — Implement site search with type ahead (OpenSearch)](https://github.com/TriliumNext/Trilium/issues/7876)
|
||||
- [#7827 — Increase donation visibility by adding a "Donate" entry in the Options page](https://github.com/TriliumNext/Trilium/issues/7827)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
- [#8282 — text editor crashed](https://github.com/TriliumNext/Trilium/issues/8282) — (also listed in Notable) only a stack trace, no reliable repro steps.
|
||||
- [#8216 — Docker IPv6 vs IPv4 accessibility](https://github.com/TriliumNext/Trilium/issues/8216) — (also listed in Notable) reporter hasn't attached their compose/network config, so it's unclear whether it's a Trilium or Docker setup issue.
|
||||
@@ -1,109 +0,0 @@
|
||||
# Batch 04 — Issues #6929–#7794
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#7085 — [regression] Archived notes are listed in note search/quick search](https://github.com/TriliumNext/Trilium/issues/7085)
|
||||
- **Problem**: Autocomplete/quick-search returns `#archived` notes after the fuzzy-search rewrite, breaking the previous behaviour.
|
||||
- **Proposed solution**: `searchNotesForAutocomplete` in `apps/server/src/services/search/services/search.ts:671` already passes `includeArchivedNotes: false`, and `parse.ts:472` wraps the expression with `PropertyComparisonExp("isarchived", "=", "false")`. However, `NoteFlatTextExp` in `apps/server/src/services/search/expressions/note_flat_text.ts` is invoked via `getFulltext` and walks `candidateNotes` without consulting `searchContext.includeArchivedNotes`; an archived candidate still produces hits because the `AndExp` short-circuit only filters *final* results through the comparison exp after paths are collected. Add an early `note.hasInheritedLabel('archived')` short-circuit at the top of the `for (const note of candidateNotes)` loop (line 102) gated on `!searchContext.includeArchivedNotes`. A matching test already exists at `search.spec.ts:696` — extend it to cover the autocomplete (flat-text) path.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
### [#7396 — Duplicate a note without cloning it](https://github.com/TriliumNext/Trilium/issues/7396)
|
||||
- **Problem**: User cannot find the already-existing "Duplicate subtree" action and assumes cut/paste is the only way (which clones).
|
||||
- **Proposed solution**: This is a discoverability issue only — `duplicateSubtree` is already wired in `apps/client/src/menus/tree_context_menu.ts`, `apps/client/src/services/note_create.ts`, and has a keyboard shortcut. Close with a comment pointing at the existing context menu item, or (tiny improvement) ensure the label `Duplicate subtree` is in `apps/client/src/translations/en/translation.json` so it's discoverable. No code change needed.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7564 — Change the default sorting of grades to alphabetical order in Trilium](https://github.com/TriliumNext/Trilium/issues/7564)
|
||||
- **Problem**: User question about how to configure multi-key sort (`#sorted=color` plus creation date), not a bug.
|
||||
- **Proposed solution**: No code change — the user describes how to use existing `#sorted` attribute. Close with a pointer to `apps/server/src/assets/doc_notes/en/User Guide/.../Sorting.html`. This belongs in Discussions.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7606 — Preview of markdown](https://github.com/TriliumNext/Trilium/issues/7606)
|
||||
- **Problem**: User asks where the side-by-side markdown preview is.
|
||||
- **Proposed solution**: Trilium is a WYSIWYG editor — "Text" notes render rich text directly, not markdown, so there is no preview pane by design. Close with explanation or redirect to the Markdown import/export docs. No code change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7274 — Insert internal links to notes in the canvas and mind map](https://github.com/TriliumNext/Trilium/issues/7274)
|
||||
- **Problem**: User question about whether internal links can be inserted inside canvas/mind-map objects.
|
||||
- **Proposed solution**: This overlaps with the long-standing limitation of Excalidraw/mind-map link handling. Likely duplicate of a canvas-link feature request. Close as duplicate / redirect to Discussions. No code change here (real implementation work lives under #7182 and related).
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7072 — How to obtain recent_notes to achieve the system menu bar effect](https://github.com/TriliumNext/Trilium/issues/7072)
|
||||
- **Problem**: User asks how to build a custom widget reading from `recent_notes`.
|
||||
- **Proposed solution**: Support question. The `recent_notes` table is exposed via the autocomplete endpoint in `apps/server/src/routes/api/autocomplete.ts:40` and via `api.runOnBackend` scripting. Redirect to Discussions / scripting docs. No code change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#6989 — New client sync issues](https://github.com/TriliumNext/Trilium/issues/6989)
|
||||
- **Evidence**: Reporter is on **0.95.0** (released mid-2025) and describes websocket connection drops against a reverse proxy. The codebase has had several sync/websocket robustness fixes since 0.98. Current version is ~0.99.4.
|
||||
- **Verification needed**: Ask reporter to retry on the latest version. If still reproducing, collect a fresh sync/WS log.
|
||||
|
||||
### [#6999 — Editing a Relation (from template) in mobile view, don't work](https://github.com/TriliumNext/Trilium/issues/6999)
|
||||
- **Evidence**: Reporter is on **0.91.1**, which is extremely old relative to current mobile rework. The mobile attribute editor has been largely rewritten (`apps/client/src/widgets/attribute_widgets/*.tsx` is now React/TSX).
|
||||
- **Verification needed**: Ask reporter to retry on 0.99.x; close if no repro.
|
||||
|
||||
### [#7393 — Note content overwritten when changing title of snippets](https://github.com/TriliumNext/Trilium/issues/7393)
|
||||
- **Evidence**: Reporter is on **0.97.1**. Text snippet handling (`#textSnippet`) has been refactored since — see `apps/client/src/widgets/type_widgets/text/EditableText.tsx` and related CKEditor 5 integration. The described "flashing + content swap" while editing title suggests the old debounced save path that was rewritten around 0.99.
|
||||
- **Verification needed**: Ask reporter to retry on 0.99.4 with the specific snippet-switching STR.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
- [#7794 — OIDC Login requires multiple logins](https://github.com/TriliumNext/Trilium/issues/7794) — Likely a session-cookie race in the OIDC `afterCallback`/redirect flow in `apps/server/src/services/open_id.ts`; needs careful investigation.
|
||||
- [#7692 — Windows shortcut arguments are removed](https://github.com/TriliumNext/Trilium/issues/7692) — electron-builder NSIS installer rewrites the Start Menu shortcut on update, dropping user-added CLI args (e.g. `--ignore-certificate-errors`); requires installer config or post-install preservation logic.
|
||||
- [#7690 — 2nd desktop client install fails](https://github.com/TriliumNext/Trilium/issues/7690) — Second Trilium desktop install can push but not receive sync; needs reproduction with sync-server logs.
|
||||
- [#7683 — Calendar Note Doesn't Respect #titleTemplate](https://github.com/TriliumNext/Trilium/issues/7683) — Calendar-view "add note on day click" creates the note via a code path that bypasses the `#titleTemplate` resolution in `notes.ts`; fixable but needs route tracing.
|
||||
- [#7662 — Full search only showing promoted attributes and missing highlighting](https://github.com/TriliumNext/Trilium/issues/7662) — Search-result renderer in `apps/server/src/services/search/services/search.ts` (`extractAttributeSnippet`) has different behaviour from quick-search; needs a pass to unify.
|
||||
- [#7641 — Cloned collection generates wrong links for left menu when >2 clones](https://github.com/TriliumNext/Trilium/issues/7641) — Share view picks wrong `notePath` when a branch is cloned 3+ times; lives in `apps/server/src/share/` path resolution.
|
||||
- [#7405 — Clicking on code box blanks the document](https://github.com/TriliumNext/Trilium/issues/7405) — CKEditor 5 code-block interaction bug with data loss; needs upstream/plugin debugging.
|
||||
- [#7389 — Child Note Node not placeable on Relation Note](https://github.com/TriliumNext/Trilium/issues/7389) — Hardware-acceleration/Electron hit-testing bug on relation map; reporter worked around with SW rendering.
|
||||
- [#7373 — Typing slows down to unusable](https://github.com/TriliumNext/Trilium/issues/7373) — CKEditor/Electron performance regression; user has already moved on, hard to repro without data.
|
||||
- [#7293 — Failed to delete notes when permanently deleting multi notes with children](https://github.com/TriliumNext/Trilium/issues/7293) — Race condition in bulk permanent-delete; related to #7288.
|
||||
- [#7288 — Ghost note remains when moving multiple notes into a newly created note](https://github.com/TriliumNext/Trilium/issues/7288) — Tree view doesn't refresh "isFolder" when target transitions from leaf to folder mid-move.
|
||||
- [#7266 — Mind-map sub-node background cannot be reset to transparent](https://github.com/TriliumNext/Trilium/issues/7266) — Upstream mind-map component limitation; needs fork or PR to `@mind-elixir/...`.
|
||||
- [#7263 — Trilium randomly jumps to Today Date](https://github.com/TriliumNext/Trilium/issues/7263) — Some scheduler/calendar widget refresh navigates to day note unexpectedly.
|
||||
- [#7258 — Open Note Custom fails on Linux due to mimeopen race](https://github.com/TriliumNext/Trilium/issues/7258) — `openCustom` implementation in client needs to wait for terminal-launched mimeopen; Linux-specific.
|
||||
- [#7250 — OIDC credentials are not checked for identity match](https://github.com/TriliumNext/Trilium/issues/7250) — Real security bug: `afterCallback` at `apps/server/src/services/open_id.ts:125` doesn't compare `req.oidc.user.sub` against the stored user before granting access. Fix requires adding a compare + error path.
|
||||
- [#7225 — Sync blocks UI during content hashing for large knowledge graphs](https://github.com/TriliumNext/Trilium/issues/7225) — Needs worker threads / parallelization, as the reporter researched.
|
||||
- [#7211 — Note content deleted after altering math equation size](https://github.com/TriliumNext/Trilium/issues/7211) — CKEditor math plugin bug with data loss; needs plugin-level fix in `packages/ckeditor5-math`.
|
||||
- [#7182 — Drag notes from tree to Canvas](https://github.com/TriliumNext/Trilium/issues/7182) — Canvas drop handler doesn't accept tree drags; needs Excalidraw drop integration.
|
||||
- [#7148 — CTRL Z with two Canvas notes will delete previous drawing](https://github.com/TriliumNext/Trilium/issues/7148) — Canvas undo history is global instead of per-note, causing cross-contamination between canvas notes.
|
||||
- [#7116 — Mobile Webapp: Text Notes Bullet List Issue](https://github.com/TriliumNext/Trilium/issues/7116) — CKEditor mobile touch-selection bug; reporter on iOS.
|
||||
- [#7466 — Text editing bar appears blank after returning from attachment](https://github.com/TriliumNext/Trilium/issues/7466) — Editor toolbar not re-initialised on return navigation from attachment view.
|
||||
- [#7517 — Wrong notification bar color in PWA](https://github.com/TriliumNext/Trilium/issues/7517) — `#initPWATopbarColor` in `apps/client/src/widgets/containers/root_container.ts:148` reads `#background-color-tracker` color, but `.css("color")` runs before theme variables apply on first load; needs ordering/observer fix.
|
||||
- [#7468 — Display issue with app folders on macOS Launchpad](https://github.com/TriliumNext/Trilium/issues/7468) — macOS Launchpad icon caching; probably requires an `.icns` with additional sizes.
|
||||
- [#6993 — Protected notes can be read back from the database file](https://github.com/TriliumNext/Trilium/issues/6993) — Security-sensitive; SQLite WAL and old revisions may retain plaintext after protecting a note.
|
||||
- [#6929 — Partially typed name being used as relation](https://github.com/TriliumNext/Trilium/issues/6929) — Autocomplete in relation-map doesn't commit the highlighted suggestion before enter; needs a fix in relation name input handling.
|
||||
|
||||
## Feature Requests
|
||||
- [#7670 — Attachment link customization](https://github.com/TriliumNext/Trilium/issues/7670)
|
||||
- [#7666 — Allow adjustable widths for Content and TOC panes in Share view](https://github.com/TriliumNext/Trilium/issues/7666)
|
||||
- [#7646 — Add a setting to switch to 24-hours clock](https://github.com/TriliumNext/Trilium/issues/7646)
|
||||
- [#7636 — Documents about scripting may need an update](https://github.com/TriliumNext/Trilium/issues/7636)
|
||||
- [#7635 — Option to use background images in presentations](https://github.com/TriliumNext/Trilium/issues/7635)
|
||||
- [#7607 — Add API support to check and switch to an already opened note tab](https://github.com/TriliumNext/Trilium/issues/7607)
|
||||
- [#7541 — Merging TOC and Highlights List](https://github.com/TriliumNext/Trilium/issues/7541)
|
||||
- [#7447 — Milestone: Official mobile application](https://github.com/TriliumNext/Trilium/issues/7447)
|
||||
- [#7411 — Better encryption algorithms](https://github.com/TriliumNext/Trilium/issues/7411)
|
||||
- [#7410 — Feature request: ability to reorder sections in the Table of Contents](https://github.com/TriliumNext/Trilium/issues/7410)
|
||||
- [#7403 — Option to disable fancy font ligatures](https://github.com/TriliumNext/Trilium/issues/7403)
|
||||
- [#7313 — Option to remove demo data when creating new instance](https://github.com/TriliumNext/Trilium/issues/7313)
|
||||
- [#7291 — Calendar view adds support for Resource Timeline](https://github.com/TriliumNext/Trilium/issues/7291)
|
||||
- [#7279 — Implement Sticky tree view headers as a native feature](https://github.com/TriliumNext/Trilium/issues/7279)
|
||||
- [#7224 — Quick Notes from Everywhere using a Creation Window](https://github.com/TriliumNext/Trilium/issues/7224)
|
||||
- [#7217 — Allow opening note directly instead of quick edit in collections](https://github.com/TriliumNext/Trilium/issues/7217)
|
||||
- [#7198 — Code Editor Indent wrapping](https://github.com/TriliumNext/Trilium/issues/7198)
|
||||
- [#7127 — OpenID auto redirect](https://github.com/TriliumNext/Trilium/issues/7127)
|
||||
- [#7113 — Use dateTime attribute for calendar child notes](https://github.com/TriliumNext/Trilium/issues/7113)
|
||||
- [#7024 — Where is my clone note?: An easy way to find clone note](https://github.com/TriliumNext/Trilium/issues/7024)
|
||||
- [#7006 — Hope to add protect single note frontApi](https://github.com/TriliumNext/Trilium/issues/7006)
|
||||
- [#7001 — Logout Feature in the Desktop Version of Trilium Next](https://github.com/TriliumNext/Trilium/issues/7001)
|
||||
- [#6991 — Search: Add Search Ranking Customizability](https://github.com/TriliumNext/Trilium/issues/6991)
|
||||
- [#6962 — Prioritize Running Sync When Coming Back Online](https://github.com/TriliumNext/Trilium/issues/6962)
|
||||
|
||||
## Skipped / Unclear
|
||||
_(none — all issues in the batch are categorised above)_
|
||||
@@ -1,129 +0,0 @@
|
||||
# Batch 05 — Issues #5790–#6928
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#6387 — Current OpenID Connect Implementation is not compatible with Authelia](https://github.com/TriliumNext/Trilium/issues/6387)
|
||||
- **Problem**: `afterCallback` in `open_id.ts` blindly calls `req.oidc.user.name.toString()` / `.email.toString()`, crashing with `Cannot read properties of undefined (reading 'toString')` when the IdP (Authelia) does not return `name`/`email` in `req.oidc.user`.
|
||||
- **Proposed solution**: In `apps/server/src/services/open_id.ts` lines 125–137, guard the `.toString()` calls (e.g. `req.oidc.user.name?.toString() ?? ""`) and/or call `await req.oidc.fetchUserInfo()` to populate user claims before saving. `sub` is the only reliably-present field; `name`/`email` should fall back gracefully.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high — verified source still matches the line referenced in the issue and the null-deref still exists.
|
||||
|
||||
### [#6390 — `arm64` docker image does not include `wget`](https://github.com/TriliumNext/Trilium/issues/6390)
|
||||
- **Problem**: Third-party tooling (Coolify) depends on `wget` being present in the docker image for healthchecks.
|
||||
- **Proposed solution**: Either (a) document that Trilium healthchecks now use the bundled `docker_healthcheck.cjs` (no `wget` required at all — both `apps/server/Dockerfile` and `Dockerfile.alpine` only install `gosu`/`su-exec`), or (b) add `wget` to the apt/apk install line in `apps/server/Dockerfile` and `Dockerfile.alpine` for backwards-compat with external tooling. Option (a) is the right call; Coolify should be updated. Either way this is a 1–2 line change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium — the fix itself is trivial but whether to actually add wget is a policy call for maintainers.
|
||||
|
||||
### [#5790 — Can't pull `rootless` docker tag](https://github.com/TriliumNext/Trilium/issues/5790)
|
||||
- **Problem**: `docker pull triliumnext/notes:rootless` returns "manifest unknown"; the docs reference a tag that does not exist on Docker Hub (the image is now published as `triliumnext/trilium`, not `triliumnext/notes`).
|
||||
- **Proposed solution**: Update the docs at `apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.html` (and the `Using Docker.md` referenced in the issue) to use `triliumnext/trilium:rootless` (the repo was renamed from `Notes` to `Trilium` and there are now `Dockerfile.rootless` / `Dockerfile.alpine.rootless` files in `apps/server/`). Also confirm the rootless tag is actually published in the CI workflow under `.github/workflows/`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — docs fix is trivial but it may also require fixing the publish workflow if the tag is not pushed.
|
||||
|
||||
### [#6730 — Clear or disable search history](https://github.com/TriliumNext/Trilium/issues/6730)
|
||||
- **Problem**: Jump-to-note results are cluttered with Search History entries; no way to hide/clear them.
|
||||
- **Proposed solution**: The command-palette already has a "show-search-history" entry (`apps/client/src/services/command_registry.ts` line 83). The jump-to dialog at `apps/client/src/widgets/dialogs/jump_to_note.tsx` likely surfaces history as part of its result list — either add an option to filter them out or add a "Clear history" action. A quick win: add a user-option-backed toggle (e.g. `jumpToShowSearchHistory` default true) and skip search-history notes when false. New key under `apps/client/src/translations/en/translation.json`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — depends on whether jump-to currently blends history entries via a single query; needs a quick read of `jump_to_note.tsx` to confirm.
|
||||
|
||||
### [#6134 — The checkbox and cursor in the to-do list are too close](https://github.com/TriliumNext/Trilium/issues/6134)
|
||||
- **Problem**: In todo lists, the checkbox and the caret/text sit with no visual spacing.
|
||||
- **Proposed solution**: Adjust the padding/margin of `.ck-content .todo-list .todo-list__label > input` (or `.todo-list__label__description`) in `apps/client/src/stylesheets/style.css` around line 1184 — add a small `margin-inline-end` / `gap` on the label. One-line CSS tweak.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium — CSS adjust is trivial but exact value needs design call.
|
||||
|
||||
### [#6468 — Table function area blocks the text function area](https://github.com/TriliumNext/Trilium/issues/6468)
|
||||
- **Problem**: When a CKEditor table is tall, the sticky table toolbar floats over the main text toolbar.
|
||||
- **Proposed solution**: CSS tweak to give the main CKEditor toolbar a higher `z-index` than the inline table toolbar, or add a top-offset on the table toolbar so it doesn't overlap. Candidate file `apps/client/src/stylesheets/ckeditor-theme.css` (or `style.css`). Target `.ck-toolbar_floating` / `.ck.ck-balloon-panel`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — CSS z-index/offset fix is cheap but the root cause may involve CKEditor's own balloon/toolbar stacking context.
|
||||
|
||||
### [#6555 — Unable to set column value to zero in table view](https://github.com/TriliumNext/Trilium/issues/6555)
|
||||
- **Problem**: Entering `0` in a Number column in Table view clears the label instead of saving "0".
|
||||
- **Proposed solution**: In `apps/client/src/widgets/collections/table/row_editing.ts` around line 42, `newValue = cell.getValue()` returns a number. The boolean branch already stringifies, but the plain-label branch passes a number through to `setLabel`. Add `if (typeof newValue === "number") newValue = String(newValue);` before the `setLabel` call. Also verify the server-side `set-attribute` endpoint doesn't coerce `0` to empty (`apps/server/src/routes/routes.ts` handler).
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — client fix is 1 line, server may also need a touch.
|
||||
|
||||
### [#6204 — Presence of #workspaceCalendarRoot affects how notes are displayed](https://github.com/TriliumNext/Trilium/issues/6204)
|
||||
- **Problem**: When a note has both `#viewType=calendar` and `#workspaceCalendarRoot`, events are forced to all-day (only `#dateNote` notes shown) and `#startTime`/`#endTime` are ignored.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/collections/calendar/index.tsx` (verified existing file), `isCalendarRoot = (calendarRoot || workspaceCalendarRoot)` collapses both flags into a single "date-note only" mode. The bug is the OR — workspaceCalendarRoot should NOT enable the date-note-only event builder unless the user also set `calendarRoot`. Suggest decoupling: only force date-note mode when `calendarRoot` is set, and let `workspaceCalendarRoot` simply mark the note as a workspace root without changing the event source. Single-file change.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — behavioral fix clearly localized, but intent of `workspaceCalendarRoot` needs maintainer confirmation.
|
||||
|
||||
### [#6518 — Open child note from table view by clicking note name](https://github.com/TriliumNext/Trilium/issues/6518)
|
||||
- **Problem**: Clicking a note title in the Table view starts renaming instead of opening the note.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/collections/table/columns.tsx` / `row_editing.ts`, change the title column so that a single click opens the note (via `appContext.tabManager.getActiveContext()?.setNote()`) and double-click (or a dedicated pencil area) starts editing. Tabulator supports this through `cellClick` + `editable` on double-click.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — clearly confined to the table view module.
|
||||
|
||||
### [#6817 — Jump To…: Create new notes in Inbox (not as child notes)](https://github.com/TriliumNext/Trilium/issues/6817)
|
||||
- **Problem**: When the Jump-to dialog creates a new note, it uses the current parent, but users expect it to land in the Inbox.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/dialogs/jump_to_note.tsx`, when creating a new note, resolve the inbox note (`dateNotesService.getInboxNote()` equivalent in the client — there's already an `inboxNote` helper via `#inbox` attribute lookup). Simple target-parent swap. Optionally add a setting toggle.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — small code change; might want a user-setting to keep it opt-in.
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#6390 — `arm64` docker image does not include `wget`](https://github.com/TriliumNext/Trilium/issues/6390)
|
||||
- **Evidence**: I read `apps/server/Dockerfile` and `Dockerfile.alpine`. Both use `HEALTHCHECK ... node /usr/src/app/docker_healthcheck.cjs` (line 28 / 26) — there is no longer any `wget`-based healthcheck. The runtime stage installs only `gosu` (Debian) or `su-exec` (Alpine). Commit `614958f16c chore(docker): reintroduce healthchecks` (Apr 2025) switched healthchecks from `wget` to a node script before this issue was filed (Jul 2025), so there is no dependency on `wget` in the current image — the issue may actually be about Coolify's external healthcheck expectations, not Trilium's image.
|
||||
- **Verification needed**: Maintainer should confirm that Trilium's own image indeed no longer requires wget for healthchecks and respond to the Coolify maintainer on the upstream template; close as "not a Trilium bug" or as a docs-only fix.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#6928 — excalidraw element link can not jump to the right file](https://github.com/TriliumNext/Trilium/issues/6928) — Excalidraw element-link navigation regression; needs Excalidraw integration debugging.
|
||||
- [#6927 — Multiple linked notes in table view relation column](https://github.com/TriliumNext/Trilium/issues/6927) — Table view only stores/renders the first relation; needs rethinking the relation cell editor for multi-value support.
|
||||
- [#6926 — Relation map nodes/edges in random positions after reload](https://github.com/TriliumNext/Trilium/issues/6926) — Position persistence bug in relation map loader.
|
||||
- [#6919 — 0.98.1 Windows OOM crash on startup](https://github.com/TriliumNext/Trilium/issues/6919) — 20 GB database triggers heap OOM; needs becca loading optimization.
|
||||
- [#6853 — Aliases with `,` break label/relation definitions](https://github.com/TriliumNext/Trilium/issues/6853) — Parser/validation work in attribute-definition code; interacts with #6421.
|
||||
- [#6845 — Create parent note in-place using script](https://github.com/TriliumNext/Trilium/issues/6845) — Script API / tree refresh race; needs investigation of `ensureNoteIsPresent/Absent` batching.
|
||||
- [#6825 — NixOS server: port can't be configured](https://github.com/TriliumNext/Trilium/issues/6825) — Actually an upstream nixpkgs module bug (not setting `TRILIUM_PORT`); port.ts reads it correctly.
|
||||
- [#6808 — Search function slow since 0.98.0](https://github.com/TriliumNext/Trilium/issues/6808) — Search perf regression on very large notes; needs profiling of `apps/server/src/services/search/`.
|
||||
- [#6781 — Windows setup dialog not scrollable on error](https://github.com/TriliumNext/Trilium/issues/6781) — Setup dialog layout needs overflow handling in error state; looks small but needs to be tested against the sync-setup flow.
|
||||
- [#6708 — Packaging RPMs fails with RPM 4.20+](https://github.com/TriliumNext/Trilium/issues/6708) — Upstream `electron-installer-redhat` bug; needs pnpm patch or waiting for fix.
|
||||
- [#6643 — Some shortcuts not working anymore (ctrl+alt+digit)](https://github.com/TriliumNext/Trilium/issues/6643) — Global shortcut handler swallows modifier+digit combos; needs shortcut service audit.
|
||||
- [#6641 — Creating a new note reopens closed tree](https://github.com/TriliumNext/Trilium/issues/6641) — Tree auto-expand on note creation; long-standing UX issue.
|
||||
- [#6570 — Win client crashed with >300MB files](https://github.com/TriliumNext/Trilium/issues/6570) — Memory/file-size limit crash; needs repro + fix.
|
||||
- [#6548 — Highlight list adds resident custom color](https://github.com/TriliumNext/Trilium/issues/6548) — CKEditor highlight palette state persistence bug.
|
||||
- [#6474 — Tab in table view refocuses original field](https://github.com/TriliumNext/Trilium/issues/6474) — Tabulator tab-focus regression; table view.
|
||||
- [#6447 — Canvas notes sometimes fail to render](https://github.com/TriliumNext/Trilium/issues/6447) — Excalidraw first-render race condition on cache miss.
|
||||
- [#6413 — Checkbox Item Alignment (Div vs Span)](https://github.com/TriliumNext/Trilium/issues/6413) — CKEditor list+link html structure inconsistency; downstream CKEditor todo-list plugin.
|
||||
- [#6387 → already listed above]
|
||||
- [#6349 — Promoted, single date label produces multiple entries](https://github.com/TriliumNext/Trilium/issues/6349) — Fast-typing race in date input change handler (Chrome-only).
|
||||
- [#6257 — "Erase notes permanently" still leaves notes in tree](https://github.com/TriliumNext/Trilium/issues/6257) — Erase/delete sync bug; needs becca/entity-change investigation.
|
||||
- [#6204 → already listed above as candidate]
|
||||
- [#6177 — Protected note can be moved/deleted in unprotected mode](https://github.com/TriliumNext/Trilium/issues/6177) — Security/permissions semantics; needs discussion of expected behavior and server-side checks.
|
||||
- [#6153 — CKEditorError: marker-destroyed when editing with search](https://github.com/TriliumNext/Trilium/issues/6153) — CKEditor marker lifecycle bug in highlighting; upstream interaction.
|
||||
- [#6129 — JavaScript heap OOM on initial sync](https://github.com/TriliumNext/Trilium/issues/6129) — Sync batching memory pressure; needs sync service work.
|
||||
- [#5857 — "invalid user" on OIDC auth](https://github.com/TriliumNext/Trilium/issues/5857) — Related to #6387 family; needs better OIDC error logging and likely the same `req.oidc.user` claim fallback work.
|
||||
- [#5818 — Converting attachment to note breaks links](https://github.com/TriliumNext/Trilium/issues/5818) — Link-rewrite logic missing in attachment→note conversion service.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#6841 — Drag note into split view](https://github.com/TriliumNext/Trilium/issues/6841)
|
||||
- [#6836 — Sync: handle HTTP redirects for server instance address](https://github.com/TriliumNext/Trilium/issues/6836)
|
||||
- [#6829 — Allow sorting notes by multiple attributes](https://github.com/TriliumNext/Trilium/issues/6829)
|
||||
- [#6805 — Adaptive tray icon](https://github.com/TriliumNext/Trilium/issues/6805)
|
||||
- [#6779 — Embedded Playbook (runnable script steps in notes)](https://github.com/TriliumNext/Trilium/issues/6779)
|
||||
- [#6546 — Store file notes in the filesystem rather than the database](https://github.com/TriliumNext/Trilium/issues/6546)
|
||||
- [#6421 — [wip] Attributes V2](https://github.com/TriliumNext/Trilium/issues/6421)
|
||||
- [#6410 — Display the notes number in folders](https://github.com/TriliumNext/Trilium/issues/6410)
|
||||
- [#6409 — Checklist progress](https://github.com/TriliumNext/Trilium/issues/6409)
|
||||
- [#6407 — Kanban Board enhancements](https://github.com/TriliumNext/Trilium/issues/6407)
|
||||
- [#6406 — Packaging for Chocolatey](https://github.com/TriliumNext/Trilium/issues/6406)
|
||||
- [#6351 — Mount part of note tree as writable folder](https://github.com/TriliumNext/Trilium/issues/6351)
|
||||
- [#6350 — Repeat-last-action shortcut (like Word F4)](https://github.com/TriliumNext/Trilium/issues/6350)
|
||||
- [#6296 — Auto hide sidebar](https://github.com/TriliumNext/Trilium/issues/6296)
|
||||
- [#6259 — geo-map: support ctrl+z/undo when moving a pin](https://github.com/TriliumNext/Trilium/issues/6259)
|
||||
- [#6226 — Add "Clone to" to search bulk actions](https://github.com/TriliumNext/Trilium/issues/6226)
|
||||
- [#6225 — Settings for displaying search results](https://github.com/TriliumNext/Trilium/issues/6225)
|
||||
- [#6203 — Suppress messages on Frontend API scripts](https://github.com/TriliumNext/Trilium/issues/6203)
|
||||
- [#6162 — Global Tag View](https://github.com/TriliumNext/Trilium/issues/6162)
|
||||
- [#6144 — Ability to define custom styles for CKEditor](https://github.com/TriliumNext/Trilium/issues/6144)
|
||||
- [#5849 — Label/tag system (macOS-style)](https://github.com/TriliumNext/Trilium/issues/5849)
|
||||
- [#5827 — Replace a word/symbol with a user-defined term](https://github.com/TriliumNext/Trilium/issues/5827)
|
||||
- [#5825 — Annotate image](https://github.com/TriliumNext/Trilium/issues/5825)
|
||||
- [#5795 — Drop image attachments without shrinking (separate from setting)](https://github.com/TriliumNext/Trilium/issues/5795)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
- [#6570 — The Win client crashed.](https://github.com/TriliumNext/Trilium/issues/6570) — Reporter gave no logs, only "crashes with >300MB files"; not reproducible without more info. (Listed in Notable as well, but needs clarification before action.)
|
||||
@@ -1,89 +0,0 @@
|
||||
# Batch 06 — Issues #5528–#5783
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#5712 — Tooltip z-index is too low?](https://github.com/TriliumNext/Trilium/issues/5712)
|
||||
- **Problem**: Tooltips in context menus appear behind Bootstrap modals because tooltip z-index is `calc(var(--ck-z-panel) - 1)` (~998), while Bootstrap modal z-index is 1055.
|
||||
- **Proposed solution**: In `apps/client/src/stylesheets/style.css` around line 733, raise `.tooltip` z-index above modal (e.g. `z-index: 1060 !important;` to match the Bootstrap default of 1080, or set it with `calc(var(--bs-modal-zindex, 1055) + 5)`). Confirmed the file at `apps/client/src/stylesheets/style.css:731-734` still has the old value and `bootstrap.rtl.css:5454` sets `--bs-modal-zindex: 1055`.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5617 — Clean up the code formatting](https://github.com/TriliumNext/Trilium/issues/5617)
|
||||
- **Problem**: Maintenance task — enable format-on-save, apply formatting to repo, enable import sort/unused-import cleanup.
|
||||
- **Proposed solution**: Flip `editor.formatOnSave` to `true` in `.vscode/settings.json` (currently line 2: `"editor.formatOnSave": false`), add import ordering ESLint rule, then run `pnpm prettier --write`/eslint autofix on the codebase. The repo already has `eslint-config-prettier` and `@stylistic` rules wired up.
|
||||
- **Effort**: small (mechanical, but touches many files)
|
||||
- **Confidence**: medium — task scope is clear but apply-all-fix is large enough to risk conflicts with open PRs (as the issue itself warns).
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#5669 — Add link dialog fails to link if you press enter twice too quickly](https://github.com/TriliumNext/Trilium/issues/5669)
|
||||
- **Evidence**: `git log --grep "enter twice\|link.*enter"` finds commit `f6201d8581` "fix: add link dialog enter act correctly" (Mar 2026) which touches `apps/client/src/widgets/dialogs/add_link.tsx` (+76 lines) and adds a 160-line spec file. Directly addresses this bug.
|
||||
- **Verification needed**: Run the reproduction steps from the issue in the latest main build and confirm it is no longer possible to trigger the "Choose note type" dialog by fast double-enter in the add-link flow.
|
||||
|
||||
### [#5606 — OpenID Connect support](https://github.com/TriliumNext/Trilium/issues/5606)
|
||||
- **Evidence**: `apps/server/src/services/open_id.ts` exists; `express-openid-connect` is a direct dependency and has been continuously updated (git log shows `2.20.1`, `2.20.0`, `2.19.4`, etc.); OIDC docs have been improved (commit `963f4586f3`). The feature has clearly shipped.
|
||||
- **Verification needed**: Confirm documentation covers configuration with Authelia/Keycloak/Authentik so the original reporter's use cases are answered, then close.
|
||||
|
||||
### [#5545 — Fancytree assertion failed: only init supported](https://github.com/TriliumNext/Trilium/issues/5545)
|
||||
- **Evidence**: fancytree has since been updated to v2.38.5 (`5db8b59b51`) plus a "partial integrate jquery.fancytree" refactor (`23db7fe602`) and a "missing fancytree dependencies" fix (`901ab54e64`). The assertion error from an older version may no longer reproduce.
|
||||
- **Verification needed**: Load the server build on a clean profile and check the browser console for the `only init supported` error on startup.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
- [#5783 — Extend the `CodeMirror` class to preserve customizability with CodeMirror 6](https://github.com/TriliumNext/Trilium/issues/5783) — exposing CM6 internals (`@codemirror/view`, `@codemirror/state`) via the script API needs an API design decision.
|
||||
- [#5775 — Strict SQLite tables](https://github.com/TriliumNext/Trilium/issues/5775) — requires migration plan and careful type audit of every column; non-trivial.
|
||||
- [#5742 — External link balloon popup stays visible when switching tabs](https://github.com/TriliumNext/Trilium/issues/5742) — requires digging into CKEditor balloon lifecycle vs. Trilium tab switching.
|
||||
- [#5729 — Firewall warning on corporate network](https://github.com/TriliumNext/Trilium/issues/5729) — `apps/server/src/services/host.ts` defaults to `0.0.0.0`; Electron could bind `127.0.0.1` instead, but needs care to not break remote-access scenarios.
|
||||
- [#5713 — #launcher-container not scrollable on mobile with custom theme](https://github.com/TriliumNext/Trilium/issues/5713) — theme-next sets overflow, custom themes may not; needs base-style enforcement rather than theme-level CSS.
|
||||
- [#5706 — Modals/dialogues too high/low on iPad Safari/Edge](https://github.com/TriliumNext/Trilium/issues/5706) — iOS viewport/keyboard interactions; tricky cross-device CSS work.
|
||||
- [#5682 — Any markdown text containing `$` gets converted into math equations during import](https://github.com/TriliumNext/Trilium/issues/5682) — regex at `apps/server/src/services/import/markdown.ts:209` is greedy across `$`; needs smarter heuristics (digit/whitespace guards) and tests.
|
||||
- [#5673 — Editor extremely slow with large-ish checkbox trees](https://github.com/TriliumNext/Trilium/issues/5673) — CKEditor performance with nested todo lists; upstream-ish.
|
||||
- [#5670 — Default image alignment for pasted documents](https://github.com/TriliumNext/Trilium/issues/5670) — needs CKEditor paste pipeline work.
|
||||
- [#5665 — PDF Viewer obstruction on iOS mobile client](https://github.com/TriliumNext/Trilium/issues/5665) — mobile PDF note layout shows metadata panel covering content; needs a mobile-specific layout fix.
|
||||
- [#5659 — Playwright against Electron version](https://github.com/TriliumNext/Trilium/issues/5659) — CI/infra task, not trivial but scoped.
|
||||
- [#5630 — Get rid of deprecated methods](https://github.com/TriliumNext/Trilium/issues/5630) — still six `@deprecated` markers in `bnote.ts`/`backend_script_api.ts`; removing them requires auditing every caller and also the script API surface.
|
||||
- [#5611 — Mermaid bugs can crash the frontend](https://github.com/TriliumNext/Trilium/issues/5611) — needs a throttled sandbox/worker for live Mermaid rendering; upstream bugs.
|
||||
- [#5603 — Code box in text cannot be copied from the end to the left (when highlighted)](https://github.com/TriliumNext/Trilium/issues/5603) — CKEditor selection quirk in highlighted code blocks.
|
||||
- [#5565 — Writing does not work correctly (canvas + weight tracker)](https://github.com/TriliumNext/Trilium/issues/5565) — Excalidraw interaction bug intertwined with promoted attributes.
|
||||
- [#5550 — Sync errors may hang the initial setup](https://github.com/TriliumNext/Trilium/issues/5550) — first-run sync error needs UI feedback instead of silent infinite wait.
|
||||
- [#5546 — #readOnly should apply to title and labels too](https://github.com/TriliumNext/Trilium/issues/5546) — `apps/client/src/widgets/note_title.tsx` computes `isReadOnly` without checking the `#readOnly` label; also need to propagate to attribute widgets.
|
||||
- [#5536 — Recent Changes not correct / undelete confusing](https://github.com/TriliumNext/Trilium/issues/5536) — UX + data correctness issue in the Recent Changes dialog.
|
||||
- [#5535 — Refactor event system for maintainability/type safety](https://github.com/TriliumNext/Trilium/issues/5535) — architectural refactor.
|
||||
- [#5528 — Editing note re-renders split attachments on every keystroke](https://github.com/TriliumNext/Trilium/issues/5528) — needs component-level should-update logic for attachment previews.
|
||||
- [#5539 — Absurdly thick stroke width in Canvas note type](https://github.com/TriliumNext/Trilium/issues/5539) — Excalidraw minimum stroke width is baked into the library.
|
||||
- [#5650 — TOTP security enhancement](https://github.com/TriliumNext/Trilium/issues/5650) — partially done (`178a3b4318` adds 160-bit secret) but SHA256/rate limiting remain; security-sensitive work.
|
||||
|
||||
## Feature Requests
|
||||
- [#5756 — Support Note Map Type as Shared Page](https://github.com/TriliumNext/Trilium/issues/5756)
|
||||
- [#5751 — Linking to subtitles](https://github.com/TriliumNext/Trilium/issues/5751)
|
||||
- [#5728 — Copy link to note](https://github.com/TriliumNext/Trilium/issues/5728)
|
||||
- [#5727 — Table borders (apply to cells too)](https://github.com/TriliumNext/Trilium/issues/5727)
|
||||
- [#5725 — Add TriliumNext to TrueNAS apps](https://github.com/TriliumNext/Trilium/issues/5725)
|
||||
- [#5707 — OneNote import tool](https://github.com/TriliumNext/Trilium/issues/5707)
|
||||
- [#5701 — Configurable tab width in code blocks](https://github.com/TriliumNext/Trilium/issues/5701)
|
||||
- [#5697 — Take photo from camera](https://github.com/TriliumNext/Trilium/issues/5697)
|
||||
- [#5692 — codesandbox Sandpack note or plugin](https://github.com/TriliumNext/Trilium/issues/5692)
|
||||
- [#5690 — Markdown editor](https://github.com/TriliumNext/Trilium/issues/5690)
|
||||
- [#5686 — In-app Help links to public pages](https://github.com/TriliumNext/Trilium/issues/5686)
|
||||
- [#5685 — Search within Help User Guide](https://github.com/TriliumNext/Trilium/issues/5685)
|
||||
- [#5671 — Search entire database when a note is hoisted](https://github.com/TriliumNext/Trilium/issues/5671)
|
||||
- [#5667 — Better search with search excerpts](https://github.com/TriliumNext/Trilium/issues/5667)
|
||||
- [#5658 — Saved Search auto-run on note open](https://github.com/TriliumNext/Trilium/issues/5658)
|
||||
- [#5656 — Show full note titles in Link Map view](https://github.com/TriliumNext/Trilium/issues/5656)
|
||||
- [#5641 — Add showProtectedDialog() to frontend API](https://github.com/TriliumNext/Trilium/issues/5641)
|
||||
- [#5640 — Support for importing ICS (iCalendar) file](https://github.com/TriliumNext/Trilium/issues/5640)
|
||||
- [#5638 — Add Ctrl+D shortcut to select next matching occurrence](https://github.com/TriliumNext/Trilium/issues/5638)
|
||||
- [#5626 — Include all available templates even in hoisted notes](https://github.com/TriliumNext/Trilium/issues/5626)
|
||||
- [#5621 — Customize the format toolbar](https://github.com/TriliumNext/Trilium/issues/5621)
|
||||
- [#5615 — Clicking below note should focus editor](https://github.com/TriliumNext/Trilium/issues/5615)
|
||||
- [#5609 — "Open in new split" option in JumpTo menu](https://github.com/TriliumNext/Trilium/issues/5609)
|
||||
- [#5598 — Multiple client instances / connect to multiple servers](https://github.com/TriliumNext/Trilium/issues/5598)
|
||||
- [#5585 — Search prefix (dynamic prefix per result)](https://github.com/TriliumNext/Trilium/issues/5585)
|
||||
- [#5583 — #rerunScriptsOnTemplateChange label](https://github.com/TriliumNext/Trilium/issues/5583)
|
||||
- [#5579 — Allow Root note to be #shareRoot](https://github.com/TriliumNext/Trilium/issues/5579)
|
||||
- [#5572 — API function to raise window](https://github.com/TriliumNext/Trilium/issues/5572)
|
||||
- [#5562 — Pin tab](https://github.com/TriliumNext/Trilium/issues/5562)
|
||||
- [#5561 — Task management (Kanban, progress bar, timeline)](https://github.com/TriliumNext/Trilium/issues/5561)
|
||||
- [#5553 — Launcher: keyboard navigation for Calendar](https://github.com/TriliumNext/Trilium/issues/5553)
|
||||
|
||||
## Skipped / Unclear
|
||||
- (none — every issue in the batch is placed above)
|
||||
@@ -1,113 +0,0 @@
|
||||
# Batch 07 — Issues #5298–#5526
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#5494 — Context Menu click on Submenu parent should not trigger event/close the context menu](https://github.com/TriliumNext/Trilium/issues/5494)
|
||||
- **Problem**: Left-clicking a submenu parent (e.g. "Insert note after") still fires its own `handler` / `selectMenuItemHandler`, creating a new note without the user actually picking a subitem.
|
||||
- **Proposed solution**: In `apps/client/src/menus/context_menu.ts` (createMenuItem mousedown handler, around lines 319–323), gate the `item.handler(...)` and `selectMenuItemHandler(...)` calls behind `if (!("items" in item && item.items))`. The non-mobile branch already short-circuits `this.hide()` for submenu parents (line 315), so only the handler invocation needs the same guard.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5371 — Titles of Settings/Options are renamable](https://github.com/TriliumNext/Trilium/issues/5371)
|
||||
- **Problem**: The title input in Options pages is editable, letting users rename hidden system notes like `_optionsAppearance`.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/note_title.tsx` (lines 24–32), extend the `isReadOnly` check to also return `true` when `note.noteId.startsWith("_options")` (alongside the existing `_help_` and `isLaunchBarConfig` clauses).
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5375 — `replaceMathTextWithKatax` method is duplicated in `highlight_list.ts` and `toc.js`](https://github.com/TriliumNext/Trilium/issues/5375)
|
||||
- **Problem**: Same helper exists in both `highlights_list.ts` and `toc.ts` (verified via Grep — `toc.ts:240` and `highlights_list.ts`).
|
||||
- **Proposed solution**: Extract the function into a small shared module under `apps/client/src/services/` (e.g. `math_renderer.ts`) and import it from both widgets. Pure refactor, no behavior change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5311 — New API method: isMobile()](https://github.com/TriliumNext/Trilium/issues/5311)
|
||||
- **Problem**: Scripts have no way to detect if they are running on the mobile/desktop/web client.
|
||||
- **Proposed solution**: `utils.isMobile()` already exists in `apps/client/src/services/utils.ts:226`. Just expose it on the frontend script API — add `isMobile: utils.isMobile` to the API constructor in `apps/client/src/services/frontend_script_api.ts` (and the Preact variant) alongside the other utility re-exports. No backend work needed.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5513 — UX: friendly numbers in settings: Sync timeout](https://github.com/TriliumNext/Trilium/issues/5513)
|
||||
- **Problem**: Sync timeout is shown in milliseconds with no human-friendly unit (sub-task of #5336).
|
||||
- **Proposed solution**: In `apps/client/src/widgets/type_widgets/options/sync.tsx` (around line 59–65), either change the unit to seconds (divide/multiply by 1000 on read/write) or reuse a "time value + unit" composite, plus update the `sync_2.timeout_unit` key in `apps/client/src/translations/en/translation.json` (currently "milliseconds").
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium (straightforward but touches save/load conversion)
|
||||
|
||||
### [#5444 — UX: friendly numbers in settings: Zoom factor (percent better than decimal factor)](https://github.com/TriliumNext/Trilium/issues/5444)
|
||||
- **Problem**: Zoom factor in Appearance options is shown as a 0.3–2.0 decimal (verified at `appearance.tsx:342–347`), while the global menu already uses percent.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/type_widgets/options/appearance.tsx` `ElectronIntegration`, switch the `FormTextBox` to a percent input (min 30, max 200, step 10) and multiply/divide by 100 when reading/writing the `zoomFactor` option. The ideal refactor (extracting `zoom-container` from `global_menu.tsx`) is nice-to-have but not required for a first fix.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5414 — Localization: add support to follow the system language](https://github.com/TriliumNext/Trilium/issues/5414)
|
||||
- **Problem**: No "System default" option in the locale dropdown.
|
||||
- **Proposed solution**: Add a sentinel value (e.g. `"auto"`) to the locale combo in `apps/client/src/widgets/type_widgets/options/i18n.tsx` and make it the default for new installs. When selected, resolve the effective locale by matching `navigator.language` against the list of supported locales (`apps/client/src/services/i18n.ts` exposes them), falling back to English. No server changes required because language is a client option.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
### [#5376 — Add "Open Note" to list of search actions](https://github.com/TriliumNext/Trilium/issues/5376)
|
||||
- **Problem**: Search actions lack an "Open Note" entry to open all matching notes.
|
||||
- **Proposed solution**: Search actions are registered in `apps/server/src/services/search/actions/` (e.g. `set_attribute.ts`, etc.) and the UI picker in `apps/client/src/widgets/search_actions/`. Add a new action class that emits an `openNote`/`openNoteInNewTab` command per result, plus a corresponding UI entry. Modest scope because existing actions already provide a clear template.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#5341 — Duplicate HTML ids for tabs of the same view](https://github.com/TriliumNext/Trilium/issues/5341)
|
||||
- **Evidence**: The options UI has been migrated to Preact (`apps/client/src/widgets/type_widgets/options/*.tsx`). `FormGroup` now generates IDs via `useUniqueName(name)` which returns `${name}-${randomString(10)}` (see `apps/client/src/widgets/react/FormGroup.tsx:19` and `hooks.tsx:372`). `FormCheckbox`, `FormRadioGroup`, `Collapsible`, and `Dropdown` all use the same hook. Every rendered instance therefore gets a fresh random ID.
|
||||
- **Verification needed**: Open two options tabs in the same window and inspect the DOM to confirm no duplicate IDs remain across the multi-tab view.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
- [#5526 — Investigate Creating/Shipping AppArmor Profile](https://github.com/TriliumNext/Trilium/issues/5526) — packaging work for deb/rpm AppArmor profile, non-trivial distro integration.
|
||||
- [#5525 — Unable to launch desktop client - Permission denied](https://github.com/TriliumNext/Trilium/issues/5525) — likely the same AppArmor/chrome-sandbox issue as #5333; needs reproduction on target distro.
|
||||
- [#5520 — Hidden notes hierarchy becomes apparent after importing a note](https://github.com/TriliumNext/Trilium/issues/5520) — tree state bug after import; requires debugging froca/tree update logic.
|
||||
- [#5517 — Keyboard Shortcuts can be assigned multiple times](https://github.com/TriliumNext/Trilium/issues/5517) — needs cross-action duplicate detection + warning UI in `shortcuts.tsx`.
|
||||
- [#5508 — Check which API endpoints are not protected / publicly accessible](https://github.com/TriliumNext/Trilium/issues/5508) — security audit task spanning all routes.
|
||||
- [#5504 — Import markdown leaves out image](https://github.com/TriliumNext/Trilium/issues/5504) — markdown/zip import bug needing investigation of image resolution.
|
||||
- [#5493 — Context Menu should use `menu` element](https://github.com/TriliumNext/Trilium/issues/5493) — DOM refactor across the entire context menu implementation.
|
||||
- [#5482 — Option to disable Electron built-in shortcuts (Ctrl+Q etc.)](https://github.com/TriliumNext/Trilium/issues/5482) — needs interception of Electron-level accelerators; must survive restarts.
|
||||
- [#5472 — Check what environmental variables are in use](https://github.com/TriliumNext/Trilium/issues/5472) — codebase audit + refactor task.
|
||||
- [#5470 — Expose In UI which Settings are Auto-Synced](https://github.com/TriliumNext/Trilium/issues/5470) — requires new option metadata field and UI indicator across every option.
|
||||
- [#5467 — Check if ETAPI OpenAPI spec is up-to-date](https://github.com/TriliumNext/Trilium/issues/5467) — full ETAPI audit.
|
||||
- [#5446 — shareAlias should warn you if the alias is already used](https://github.com/TriliumNext/Trilium/issues/5446) — needs attribute-change validation hook + user-facing warning dialog.
|
||||
- [#5443 — Include attributes in revisions](https://github.com/TriliumNext/Trilium/issues/5443) — fundamental change to revision model (schema + restore logic).
|
||||
- [#5442 — Protected notes not protected from deletion, attribute visibility](https://github.com/TriliumNext/Trilium/issues/5442) — security model change.
|
||||
- [#5436 — Map not visible when note is shared](https://github.com/TriliumNext/Trilium/issues/5436) — geomap not rendering in shaca share templates.
|
||||
- [#5432 — note.noteSize and note.contentSize doesn't work in Note Search](https://github.com/TriliumNext/Trilium/issues/5432) — `noteSize` is not a real property (doesn't exist in Becca); `contentSize` looks like it should work but `property_comparison.ts:61` compares the already-camelCased name against a lowercase-only allowlist, breaking the `dbLoadNeeded` flag. Needs either a docs update or a proper fix + alias.
|
||||
- [#5431 — Text note contents disappear when switching Read-Only to editable](https://github.com/TriliumNext/Trilium/issues/5431) — non-deterministic editor sync bug.
|
||||
- [#5426 — Autoformat inline code when typing between backticks](https://github.com/TriliumNext/Trilium/issues/5426) — CKEditor autoformat plugin change.
|
||||
- [#5424 — Autoformat Code-Block with language](https://github.com/TriliumNext/Trilium/issues/5424) — CKEditor autoformat plugin change with new parsing flow.
|
||||
- [#5423 — `~child:child:template=...` not applied automatically](https://github.com/TriliumNext/Trilium/issues/5423) — template inheritance walker bug.
|
||||
- [#5383 — Large Code Blocks in Text Notes Break Syntax Highlight](https://github.com/TriliumNext/Trilium/issues/5383) — highlight.js / CKEditor performance boundary.
|
||||
- [#5380 — Make Initial Sync timeout value configurable](https://github.com/TriliumNext/Trilium/issues/5380) — requires new option + config plumbing.
|
||||
- [#5359 — i18n: keyboard shortcuts from keyboard_actions service are not translatable](https://github.com/TriliumNext/Trilium/issues/5359) — needs extracting all action descriptions into translations.
|
||||
- [#5346 — Notes experiencing automatic snapshot recovery](https://github.com/TriliumNext/Trilium/issues/5346) — potentially serious data-loss bug, needs repro.
|
||||
- [#5336 — UX: friendly numbers in settings (parent)](https://github.com/TriliumNext/Trilium/issues/5336) — parent tracking issue; subtasks handled individually.
|
||||
- [#5333 — SUID sandbox helper binary found but not configured](https://github.com/TriliumNext/Trilium/issues/5333) — same class as #5525/#5526, chrome-sandbox setup.
|
||||
- [#5315 — Desktop app initial sync never stops](https://github.com/TriliumNext/Trilium/issues/5315) — sync loop bug that needs server-side investigation.
|
||||
- [#5298 — Consider changing the default port](https://github.com/TriliumNext/Trilium/issues/5298) — Electron uses 37740/37840 (ephemeral range); changing requires care to avoid collisions; not a one-line fix.
|
||||
|
||||
## Feature Requests
|
||||
- [#5511 — Calculated Content in Templates via Inline Javascript](https://github.com/TriliumNext/Trilium/issues/5511)
|
||||
- [#5509 — Dynamic themes](https://github.com/TriliumNext/Trilium/issues/5509)
|
||||
- [#5497 — Undo, permanent delete: add as action for note tree](https://github.com/TriliumNext/Trilium/issues/5497)
|
||||
- [#5481 — Selected Note API](https://github.com/TriliumNext/Trilium/issues/5481)
|
||||
- [#5480 — Notification API](https://github.com/TriliumNext/Trilium/issues/5480)
|
||||
- [#5475 — Add keyboard shortcuts for managing splits](https://github.com/TriliumNext/Trilium/issues/5475)
|
||||
- [#5451 — Add polylines or polygons on the geomap note type](https://github.com/TriliumNext/Trilium/issues/5451)
|
||||
- [#5411 — Auto-hide the tab bar and toolbar in full-screen mode](https://github.com/TriliumNext/Trilium/issues/5411)
|
||||
- [#5410 — Add the ability to create a shell link (shortcut) for a note](https://github.com/TriliumNext/Trilium/issues/5410)
|
||||
- [#5401 — Confusing behaviour when the application is minimized in system tray](https://github.com/TriliumNext/Trilium/issues/5401)
|
||||
- [#5363 — Option to open HTML attachment in browser instead of download](https://github.com/TriliumNext/Trilium/issues/5363)
|
||||
- [#5362 — Unify/hide duplicate find dialogs/widgets](https://github.com/TriliumNext/Trilium/issues/5362)
|
||||
- [#5361 — UX: image options clarification](https://github.com/TriliumNext/Trilium/issues/5361)
|
||||
- [#5357 — Mind Map: Ability to add images as node](https://github.com/TriliumNext/Trilium/issues/5357)
|
||||
- [#5355 — Import/Merge Another Trilium Database Into Current database](https://github.com/TriliumNext/Trilium/issues/5355)
|
||||
- [#5350 — Save clip with prompt to add meta note](https://github.com/TriliumNext/Trilium/issues/5350)
|
||||
- [#5344 — Importing html images as attached instead of external reference](https://github.com/TriliumNext/Trilium/issues/5344)
|
||||
- [#5337 — UX: Code blocks: sort mime type by most used](https://github.com/TriliumNext/Trilium/issues/5337)
|
||||
- [#5332 — Improve search result highlighting](https://github.com/TriliumNext/Trilium/issues/5332)
|
||||
- [#5305 — Note Tree Sidebar - Confirmation Dialogue When Dragging and Dropping](https://github.com/TriliumNext/Trilium/issues/5305)
|
||||
- [#5303 — Creating human-readable URL aliases without sharing](https://github.com/TriliumNext/Trilium/issues/5303)
|
||||
|
||||
## Skipped / Unclear
|
||||
_(none — every issue in this batch is categorized above)_
|
||||
@@ -1,105 +0,0 @@
|
||||
# Batch 08 — Issues #4854–#5296
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#5250 — (Feature request) Prevent options note title changes](https://github.com/TriliumNext/Trilium/issues/5250)
|
||||
- **Problem**: Titles of hidden options notes (e.g. `_optionsAppearance`) are editable by the user, which is inconsistent since their titles come from translations.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/note_title.tsx` (the `isReadOnly` computation around lines 25-31), add a condition for hidden/system notes. Simplest: `note.noteId.startsWith("_options")` (or more broadly, `note.noteId.startsWith("_") && !isLaunchBarConfig(...)` — but that's riskier). The existing pattern already handles `_help_` and launch bar config, so extending it with options IDs is a one-line change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5201 — (Feature request) Disable text selection in mermaid diagrams?](https://github.com/TriliumNext/Trilium/issues/5201)
|
||||
- **Problem**: Dragging to pan a mermaid diagram also selects text, which interferes with pan gesture.
|
||||
- **Proposed solution**: Add the CSS rule (`user-select: none; -webkit-user-select: none;`) to `.mermaid-render` in the mermaid type widget's CSS. Issue author provides the exact CSS. Locate the mermaid type widget under `apps/client/src/widgets/type_widgets/` and append to its stylesheet — no need for a settings toggle as a first pass.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5220 — (Feature request) Add the `#appJs` attribute to load a custom script](https://github.com/TriliumNext/Trilium/issues/5220)
|
||||
- **Problem**: `#appCss` exists for globally loading CSS from a note; an analogous `#appJs` would let users ship a JS library once instead of cloning it into every render note.
|
||||
- **Proposed solution**: Mirror the existing `#appCss` handling — grep for `appCss` in `apps/server/src/` and `apps/client/src/` and add a parallel path that injects a `<script>` tag. The mechanism is well-established; mostly copy/paste. Document the obvious security caveats in the attribute docs (labels.html).
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium (easy code-wise; security framing may prompt more review)
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#5134 — Upgrade autocomplete dependencies](https://github.com/TriliumNext/Trilium/issues/5134)
|
||||
- **Evidence**: Grepped the git log and found commits `d1fc4780b7 refactor: remove old autocomplete completely`, `3b35dc50c5 feat(core): integrate autocomplete route`, plus a series of `feat(autocomplete)` / `test(autocomplete)` commits. The old autocomplete has been fully removed and replaced in-house.
|
||||
- **Verification needed**: Maintainer should confirm the new autocomplete is considered the replacement the reporter was asking for, then close.
|
||||
|
||||
### [#5174 — '@' Context menu's auto-completion not showing most relevant but most recent](https://github.com/TriliumNext/Trilium/issues/5174)
|
||||
- **Evidence**: The autocomplete subsystem was fully rewritten (see #5134 evidence). Fuzzy matching has been added (`f23a7b4842 feat(settings): also allow for fuzzy searching to just be disabled`) and a new autocomplete route exists. The old "most recent" behaviour may be gone.
|
||||
- **Verification needed**: Repro on current main — create ancient notes matching the query, a few recent ones, then `@` and check ordering.
|
||||
|
||||
### [#5196 — (Feature request) Cursor automatically in text box when embedding note](https://github.com/TriliumNext/Trilium/issues/5196)
|
||||
- **Evidence**: Commit `35bd210062 fix(react/dialogs): recent notes not triggered in autocomplete` (Aug 2025) refactored `triggerRecentNotes` in `apps/client/src/services/note_autocomplete.ts` to call `$el.trigger("focus").trigger("select")`. `apps/client/src/widgets/dialogs/include_note.tsx` invokes `triggerRecentNotes(autoCompleteRef.current)` in `onShown`, so the input should now focus automatically when the Include Note dialog opens.
|
||||
- **Verification needed**: Repro on current main — open a text note, click Include Note, confirm focus is in the search box without clicking.
|
||||
|
||||
### [#5254 — User configurable whitelist of html tags stripped on import](https://github.com/TriliumNext/Trilium/issues/5254)
|
||||
- **Evidence**: The issue's interim request — extend the default allowlist with `acronym`, `article`, `big`, `button`, `cite`, `col`, `colgroup`, `data`, `dd`, `fieldset`, `form`, `legend`, `meter`, `noscript`, `option`, `progress`, `rp`, `samp`, `small`, `sub`, `sup`, `template`, `textarea`, `tt` — is now done in `packages/commons/src/lib/shared_constants.ts` (`SANITIZER_DEFAULT_ALLOWED_TAGS`, comment references this same issue). Additionally, `apps/server/src/services/html_sanitizer.ts` already reads an `allowedHtmlTags` option (user-configurable).
|
||||
- **Verification needed**: Confirm the user-configurable option has a UI surface; if only programmatic, close the issue with a docs pointer.
|
||||
|
||||
### [#5131 — (Bug report) v0.90.4 docker does not read USER_UID and USER_GID from environment](https://github.com/TriliumNext/Trilium/issues/5131)
|
||||
- **Evidence**: Reporter's logs show `./start-docker.sh: 3: [[: not found` — the script was using bash `[[ ]]` under `/bin/sh`. Current `apps/server/start-docker.sh` uses POSIX `[ ! -z "${USER_UID}" ]` / `[ ! -z "${USER_GID}" ]`, so the bug is gone.
|
||||
- **Verification needed**: Spin up the latest docker image with `USER_UID=1001 USER_GID=1001` and confirm the container starts and writes the log dir.
|
||||
|
||||
### [#5066 — Fix `spec/etapi` tests and port to vitest](https://github.com/TriliumNext/Trilium/issues/5066)
|
||||
- **Evidence**: `apps/server/spec/etapi/` now contains 30+ `.spec.ts` files (e.g. `app-info.spec.ts`, `search.spec.ts`, `mcp.spec.ts`). The migration has happened.
|
||||
- **Verification needed**: Confirm `pnpm test:sequential` actually runs them and they pass.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#5296 — CKEditor Handle doesn't move when tree width is changed](https://github.com/TriliumNext/Trilium/issues/5296) — needs a ResizeObserver hook to trigger CKEditor layout recalc when sidebar changes; upstream-influenced.
|
||||
- [#5294 — "Insert Child Note" Context Menu cut off / not scrollable](https://github.com/TriliumNext/Trilium/issues/5294) — `apps/client/src/menus/context_menu.ts` only positions the top-level menu; submenus don't have overflow logic or `max-height` handling. Needs a proper submenu positioning routine plus scrolling.
|
||||
- [#5251 — Sync always fails after wrong DNS config once](https://github.com/TriliumNext/Trilium/issues/5251) — Electron HTTP/DNS cache persistence; needs an explicit "clear DNS cache" action or to bypass the cache for sync requests.
|
||||
- [#5247 — Search/Filter Map View](https://github.com/TriliumNext/Trilium/issues/5247) — feature request but needs design work in the note-map widget.
|
||||
- [#5233 — Copy/paste from note only pastes text, not images](https://github.com/TriliumNext/Trilium/issues/5233) — CKEditor clipboard integration; nontrivial.
|
||||
- [#5214 — Scripts can overwrite files in application install dir](https://github.com/TriliumNext/Trilium/issues/5214) — security; `exportSubtreeToZipFile` in `apps/server/src/services/export/zip.ts` still accepts arbitrary paths. Needs sandboxing / CWD enforcement.
|
||||
- [#5193 — Relation popup sometimes shows content of incorrect note](https://github.com/TriliumNext/Trilium/issues/5193) — attribute popup caches first hovered target; needs debug of PromotedAttributes/attribute_detail tooltip logic.
|
||||
- [#5192 — Notes not saving (silent data loss)](https://github.com/TriliumNext/Trilium/issues/5192) — serious; needs reproduction and investigation into spacedUpdate / save pipeline.
|
||||
- [#5191 — Scrolling when cursor is in note margin](https://github.com/TriliumNext/Trilium/issues/5191) — needs pointer-events/CSS rework on the text editor scroll container.
|
||||
- [#5170 — "Create and link new note" moves link to beginning of parent note](https://github.com/TriliumNext/Trilium/issues/5170) — CKEditor mention/create-link command bug.
|
||||
- [#5169 — Backend JS notes migration warning](https://github.com/TriliumNext/Trilium/issues/5169) — not a code bug, but the request for user-facing migration guidance needs docs work.
|
||||
- [#5159 — Child notes don't refresh on selecting a different note](https://github.com/TriliumNext/Trilium/issues/5159) — collection/child-list widget refresh race; reporter is using `#viewType=list`.
|
||||
- [#5118 — Copying attachment link to clipboard fails](https://github.com/TriliumNext/Trilium/issues/5118) — browser/HTTP context for clipboard access; needs polyfill / secure-context fallback.
|
||||
- [#5080 — Investigate #titleTemplate for template notes](https://github.com/TriliumNext/Trilium/issues/5080) — `notes.ts` reads `titleTemplate` from the parent only; making it inherit from the template requires design discussion.
|
||||
- [#4947 — Remove uses of `any` in server and client](https://github.com/TriliumNext/Trilium/issues/4947) — tracking/technical debt.
|
||||
- [#4936 — Sync to server behind OIDC & reverse proxy](https://github.com/TriliumNext/Trilium/issues/4936) — OIDC auth interception breaks sync handshake; needs protocol design.
|
||||
- [#4905 — shareCredentials tag does not work with reverse proxy](https://github.com/TriliumNext/Trilium/issues/4905) — reverse-proxy / HTTP/2 interaction with basic-auth 401 response.
|
||||
- [#4898 — Link in images (CKEditor behaviour)](https://github.com/TriliumNext/Trilium/issues/4898) — CKEditor image+link UI interaction.
|
||||
- [#4896 — Refer to current note clone in render note script](https://github.com/TriliumNext/Trilium/issues/4896) — scripting API design question.
|
||||
- [#4888 — Sync server handshake failed, `<!DOCTYPE` is not valid JSON](https://github.com/TriliumNext/Trilium/issues/4888) — same family as #4936; reverse-proxy 404/login returning HTML.
|
||||
- [#4887 — Normal notes recovered wrongly after syncing](https://github.com/TriliumNext/Trilium/issues/4887) — sync conflict recovery bug, needs deep investigation.
|
||||
- [#4880 — Shared link shows address from sync server](https://github.com/TriliumNext/Trilium/issues/4880) — share URL generation uses wrong instance's base URL in a synced pair.
|
||||
- [#5278 — Handle development user Javascript widgets more elegantly](https://github.com/TriliumNext/Trilium/issues/5278) — safe mode exists (`d97737756c chore(build): disable safe mode by default`) but reporter wants sandboxed live editing, which is a bigger architectural change.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#5281 — Change `clone` terminology](https://github.com/TriliumNext/Trilium/issues/5281)
|
||||
- [#5268 — Register icon pack in mermaid](https://github.com/TriliumNext/Trilium/issues/5268)
|
||||
- [#5228 — SOCKS Proxy Support in TriliumNext Desktop App](https://github.com/TriliumNext/Trilium/issues/5228)
|
||||
- [#5217 — Friendly share urls: turn title into shareAlias](https://github.com/TriliumNext/Trilium/issues/5217)
|
||||
- [#5205 — Image zoom / gallery view for shared notes](https://github.com/TriliumNext/Trilium/issues/5205)
|
||||
- [#5199 — Export of HTML with `[missing note]` could retain names](https://github.com/TriliumNext/Trilium/issues/5199)
|
||||
- [#5195 — Internal links to notes in Mermaid diagrams](https://github.com/TriliumNext/Trilium/issues/5195)
|
||||
- [#5190 — Drag and drop note icon to insert link in note](https://github.com/TriliumNext/Trilium/issues/5190)
|
||||
- [#5183 — Inline reference to labels](https://github.com/TriliumNext/Trilium/issues/5183)
|
||||
- [#5126 — AVIF image compression support](https://github.com/TriliumNext/Trilium/issues/5126)
|
||||
- [#5122 — (Try to) sync app on shutdown](https://github.com/TriliumNext/Trilium/issues/5122)
|
||||
- [#5108 — Deploy to Flathub](https://github.com/TriliumNext/Trilium/issues/5108) (flatpak build exists via electron-forge; publishing step still missing)
|
||||
- [#5089 — Template-typed attributes/relationships](https://github.com/TriliumNext/Trilium/issues/5089)
|
||||
- [#5086 — Investigate Windows additional package managers (winget/chocolatey/scoop)](https://github.com/TriliumNext/Trilium/issues/5086)
|
||||
- [#5049 — Appearance Settings Optional Sync](https://github.com/TriliumNext/Trilium/issues/5049)
|
||||
- [#5044 — Calendar overview of Note activity](https://github.com/TriliumNext/Trilium/issues/5044)
|
||||
- [#4989 — Keyboard shortcuts for more actions](https://github.com/TriliumNext/Trilium/issues/4989) (tracker)
|
||||
- [#4969 — Note editors other than CKEditor](https://github.com/TriliumNext/Trilium/issues/4969) (tracker)
|
||||
- [#4957 — End-to-end encryption (database-level)](https://github.com/TriliumNext/Trilium/issues/4957) (tracker)
|
||||
- [#4956 — Milestone: Multi-user support](https://github.com/TriliumNext/Trilium/issues/4956) (tracker)
|
||||
- [#4922 — Restore backed up database files to notes](https://github.com/TriliumNext/Trilium/issues/4922)
|
||||
- [#4885 — Reload read position after "go back" from attachment view](https://github.com/TriliumNext/Trilium/issues/4885)
|
||||
- [#4871 — Adding Elestio as deployment option](https://github.com/TriliumNext/Trilium/issues/4871)
|
||||
- [#4870 — Synchronized Devices Dashboard in Trilium](https://github.com/TriliumNext/Trilium/issues/4870)
|
||||
- [#4854 — Add a visual diff to split window](https://github.com/TriliumNext/Trilium/issues/4854)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
- [#5280 — Dependency Dashboard](https://github.com/TriliumNext/Trilium/issues/5280) — Renovate bot tracker, not an actionable issue.
|
||||
@@ -1,91 +0,0 @@
|
||||
# Batch 09 — Issues #4194–#4837
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#4584 — (Feature Request) Hide hidden notes from `similar notes` view](https://github.com/TriliumNext/Trilium/issues/4584)
|
||||
- **Problem**: Similar-notes results include notes living inside the `_hidden` subtree (templates, system notes, launchers), polluting the list.
|
||||
- **Proposed solution**: In `apps/server/src/becca/similarity.ts` around line 411 (`for (const candidateNote of Object.values(becca.notes))`), skip candidates where `candidateNote.isHiddenCompletely()` is true. The helper already exists on `BNote` (`apps/server/src/becca/entities/bnote.ts:1203`), so this is a one-liner guard.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#4780 — (Feature request) Change Icon for Jump to Note](https://github.com/TriliumNext/Trilium/issues/4780)
|
||||
- **Problem**: The Jump-to-Note launcher icon is `bx bx-send` (a paper-airplane/send icon), which suggests sending instead of navigating.
|
||||
- **Proposed solution**: Change `icon: "bx bx-send"` to a navigation-style icon (e.g. `"bx bx-navigation"`, `"bx bx-log-in"`, `"bx bx-crosshair"`) in `apps/server/src/services/hidden_subtree_launcherbar.ts` at lines 105 and the second occurrence near line 194. Existing installations should pick up the change because launcher bar items are created via `HiddenSubtreeItem`; since the icon is stored as an attribute, add `enforceAttributes: true` to that entry if the icon should override user customisations.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high (trivial to change; needs confirmation of the enforcement behaviour)
|
||||
|
||||
### [#4543 — (Bug report) Orphaned keyboardShortcuts* options after upgrade](https://github.com/TriliumNext/Trilium/issues/4543)
|
||||
- **Problem**: Users upgraded from 0.59.x have stale `keyboardShortcutsShowNoteRevisions` and `keyboardShortcutsForceSaveNoteRevision` option rows that produce “Keyboard action … found in database, but not in action definition.” warnings on every startup. The active action names are `showRevisions` / `forceSaveRevision` (`apps/server/src/services/keyboard_actions.ts:449,825`).
|
||||
- **Proposed solution**: Add a small migration under `apps/server/src/migrations/` that deletes the two orphaned options: `DELETE FROM options WHERE name IN ('keyboardShortcutsShowNoteRevisions','keyboardShortcutsForceSaveNoteRevision')`. Follow the pattern of existing migrations and register it in `apps/server/src/migrations/migrations.ts`.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#4649 — (Bug report) Importing large ZIP-Files via etapi throws error and request hangs](https://github.com/TriliumNext/Trilium/issues/4649)
|
||||
- **Evidence**: The reported root cause was that `req.body` was undefined/unparsed on the `/etapi/notes/:noteId/import` POST. `apps/server/src/app.ts:94` now registers `express.raw({ limit: "500mb" })` globally, and `apps/server/src/etapi/notes.ts:180-190` still passes `req.body` straight to `zipImportService.importZip` — the raw buffer path now exists. Issue predates the monorepo restructure.
|
||||
- **Verification needed**: Reproduce the original Python import with a large zip against current main; verify `Content-Type: application/zip` is handled (Express `raw()` defaults to `application/octet-stream`, so users may need the right Content-Type or an explicit type in the raw handler).
|
||||
|
||||
### [#4261 — (Feature request) Make apps logs saving optional](https://github.com/TriliumNext/Trilium/issues/4261)
|
||||
- **Evidence**: Log retention is now configurable via `config.Logging.retentionDays` (`apps/server/src/services/log.ts:36-42`) with `-1` keeping all logs and positive values deleting older files. While fully disabling file logging isn’t wired up, the disk-space concern is mitigated by retention config.
|
||||
- **Verification needed**: Maintainer to decide whether the feature is satisfied by retention config or still needs an explicit “disable file logs” switch.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
- [#4835 — Links don't open when clicked on](https://github.com/TriliumNext/Trilium/issues/4835) — CKEditor image-style-configuration error + ResizeObserver loop; likely downstream CKEditor config bug needing investigation in the current editor pipeline.
|
||||
- [#4702 — "Add to homescreen" sets wrong url under reverse proxy sub-directory](https://github.com/TriliumNext/Trilium/issues/4702) — `manifest.webmanifest` is a static file with hardcoded `"scope":"/"` and `"start_url":"/"` (`apps/client/src/assets/manifest.webmanifest`); needs dynamic generation based on `X-Forwarded-Prefix`/proxy prefix.
|
||||
- [#4762 — ERROR when syncing deleted notes](https://github.com/TriliumNext/Trilium/issues/4762) — Stale blob reference for deleted note; deletion sync logic bug needing deep investigation.
|
||||
- [#4666 — Excalidraw changes fonts](https://github.com/TriliumNext/Trilium/issues/4666) — Excalidraw hand-drawn font inconsistency on re-render; needs canvas note type investigation.
|
||||
- [#4657 — Backup database exposes protected notes](https://github.com/TriliumNext/Trilium/issues/4657) — Security bug: protected content leaks into backup; needs careful investigation of protect/encrypt-on-backup flow.
|
||||
- [#4650 — All notes blank after opening pdf attachment a few times](https://github.com/TriliumNext/Trilium/issues/4650) — CKEditor error “Cannot read properties of null (reading 'parent')”; attachment-related editor crash.
|
||||
- [#4598 — ck-block-toolbar-button display issue when adjusting tree pane](https://github.com/TriliumNext/Trilium/issues/4598) — CKEditor toolbar positioning bug tied to layout resize events.
|
||||
- [#4576 — Avoid CPU usage spikes from healthcheck script](https://github.com/TriliumNext/Trilium/issues/4576) — Docker healthcheck spawns node every 30s (`apps/server/src/docker_healthcheck.ts` + Dockerfiles); needs lightweight alternative (wget/curl, or embedded check).
|
||||
- [#4562 — Attachment links not working as expected (web vs desktop)](https://github.com/TriliumNext/Trilium/issues/4562) — Clipboard API behavior inconsistency between Electron and web clients.
|
||||
- [#4555 — Formatting of imported .enex note lost on edit](https://github.com/TriliumNext/Trilium/issues/4555) — CKEditor drops style attributes on first edit of Evernote-imported HTML; normalisation pipeline bug.
|
||||
- [#4536 — "include note" not displayed in sharing](https://github.com/TriliumNext/Trilium/issues/4536) — Shared view (Shaca) doesn't render included-note widgets; share renderer fix.
|
||||
- [#4463 — Unexpected data loss after app restart and backup restoration](https://github.com/TriliumNext/Trilium/issues/4463) — Unclear reproduction; needs diagnosis of long-uptime data persistence.
|
||||
- [#4690 — search highlights not performing correct scroll-to-term](https://github.com/TriliumNext/Trilium/issues/4690) — Scroll-into-view after search hit opens; read-only-mode code path likely missing scroll.
|
||||
- [#4394 — mobile: editing notes offline covers screen in errors](https://github.com/TriliumNext/Trilium/issues/4394) — Needs global offline/connection-lost indicator instead of per-request toasts.
|
||||
- [#4392 — mobile: toggling checkboxes opens keyboard](https://github.com/TriliumNext/Trilium/issues/4392) — Checkbox tap focuses text editor on mobile; CKEditor focus management issue.
|
||||
- [#4389 — Sync error between docker and Windows 0.61.12](https://github.com/TriliumNext/Trilium/issues/4389) — Version mismatch/sync bug from 2023; likely obsolete but needs reporter retest.
|
||||
- [#4254 — Portrait images rotated by 90° after import](https://github.com/TriliumNext/Trilium/issues/4254) — EXIF orientation not honoured on image import/resize pipeline.
|
||||
- [#4221 — SVG zooming regression in 0.61](https://github.com/TriliumNext/Trilium/issues/4221) — SVG viewer dropped zoom handling after 0.59 → 0.61 upgrade.
|
||||
- [#4194 — "Open externally" doesn't work in Flatpak](https://github.com/TriliumNext/Trilium/issues/4194) — Flatpak sandbox TMPDIR scoping; requires Flathub manifest `finish-args` fix rather than codebase change.
|
||||
|
||||
## Feature Requests
|
||||
- [#4837 — Cloud Deployment](https://github.com/TriliumNext/Trilium/issues/4837)
|
||||
- [#4834 — Import PDF files into Canvas notes](https://github.com/TriliumNext/Trilium/issues/4834)
|
||||
- [#4832 — Tag-based note connections for Note Map](https://github.com/TriliumNext/Trilium/issues/4832)
|
||||
- [#4818 — Set zip import options via API](https://github.com/TriliumNext/Trilium/issues/4818)
|
||||
- [#4816 — Public link with search for entire tree](https://github.com/TriliumNext/Trilium/issues/4816)
|
||||
- [#4813 — Sticky horizontal scrollbar for long tables](https://github.com/TriliumNext/Trilium/issues/4813)
|
||||
- [#4811 — Attribute to change document link behaviour (target=_self)](https://github.com/TriliumNext/Trilium/issues/4811)
|
||||
- [#4755 — Enable trilium iframe compatibility](https://github.com/TriliumNext/Trilium/issues/4755)
|
||||
- [#4732 — Flathub Verification](https://github.com/TriliumNext/Trilium/issues/4732)
|
||||
- [#4701 — LanguageTool integration](https://github.com/TriliumNext/Trilium/issues/4701)
|
||||
- [#4691 — Context-Menu Option: "Add backlink to"](https://github.com/TriliumNext/Trilium/issues/4691)
|
||||
- [#4669 — Printed font size configuration](https://github.com/TriliumNext/Trilium/issues/4669)
|
||||
- [#4668 — Create clone target location when it doesn't exist](https://github.com/TriliumNext/Trilium/issues/4668)
|
||||
- [#4651 — Allow embedding webviews into text notes](https://github.com/TriliumNext/Trilium/issues/4651)
|
||||
- [#4612 — Authorization (Basic/Bearer) for /sync endpoints](https://github.com/TriliumNext/Trilium/issues/4612)
|
||||
- [#4606 — Full-text search via SQLite FTS for relevance sorting](https://github.com/TriliumNext/Trilium/issues/4606)
|
||||
- [#4498 — Bulk convert images to attachments](https://github.com/TriliumNext/Trilium/issues/4498)
|
||||
- [#4468 — Toggle for promoted attributes on mobile](https://github.com/TriliumNext/Trilium/issues/4468)
|
||||
- [#4439 — In-app update mechanism](https://github.com/TriliumNext/Trilium/issues/4439)
|
||||
- [#4405 — Vim keybindings: yank/paste system clipboard](https://github.com/TriliumNext/Trilium/issues/4405)
|
||||
- [#4396 — Ordering of templates (templates at top of menu)](https://github.com/TriliumNext/Trilium/issues/4396)
|
||||
- [#4395 — Autocomplete dialog support via scripting API](https://github.com/TriliumNext/Trilium/issues/4395)
|
||||
- [#4384 — Display attachments (PDF, video) directly inside notes](https://github.com/TriliumNext/Trilium/issues/4384)
|
||||
- [#4375 — Allow user-selectable data location](https://github.com/TriliumNext/Trilium/issues/4375)
|
||||
- [#4366 — Static log file name for trilium server (log rotation)](https://github.com/TriliumNext/Trilium/issues/4366)
|
||||
- [#4354 — Cursor always positioned in center of screen (typewriter mode)](https://github.com/TriliumNext/Trilium/issues/4354)
|
||||
- [#4353 — Prevent autocorrecting `...`/`--`/`->` to symbols](https://github.com/TriliumNext/Trilium/issues/4353)
|
||||
- [#4345 — Sync API support for ETAPI](https://github.com/TriliumNext/Trilium/issues/4345)
|
||||
- [#4305 — Encrypted/protected attributes](https://github.com/TriliumNext/Trilium/issues/4305)
|
||||
- [#4299 — Expose protectedSessionService to frontend script API](https://github.com/TriliumNext/Trilium/issues/4299)
|
||||
- [#4296 — Remember last scroll position in a note](https://github.com/TriliumNext/Trilium/issues/4296)
|
||||
- [#4242 — Subscript/superscript keyboard shortcuts](https://github.com/TriliumNext/Trilium/issues/4242)
|
||||
- [#4203 — Export subtree as single MD with nested headings](https://github.com/TriliumNext/Trilium/issues/4203)
|
||||
- [#4199 — Modify note creation/modification times via API](https://github.com/TriliumNext/Trilium/issues/4199)
|
||||
|
||||
## Skipped / Unclear
|
||||
(none — every issue in the batch has been categorized above.)
|
||||
@@ -1,116 +0,0 @@
|
||||
# Batch 10 — Issues #3704–#4192
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#4051 — (Bug report) Protected notes visible in Edited Notes](https://github.com/TriliumNext/Trilium/issues/4051)
|
||||
- **Problem**: The "Edited Notes" sidebar on day notes lists protected notes with their real titles even without an active protected session, leaking encrypted data.
|
||||
- **Proposed solution**: In `apps/server/src/routes/api/revisions.ts` `getEditedNotesOnDate()` (around line 155-189), filter out protected notes when no protected session is active. After `let notes = becca.getNotes(...)`, add a filter using `protectedSessionService.isProtectedSessionAvailable()` (from `apps/server/src/services/protected_session.ts`) to either skip `note.isProtected` rows or replace their title/content with a placeholder, mirroring how other protected-aware endpoints behave.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#4150 — Mobile interface, add 'move note' to note menu](https://github.com/TriliumNext/Trilium/issues/4150)
|
||||
- **Problem**: The mobile burger menu previously lacked a "move note" action.
|
||||
- **Proposed solution**: Likely already resolved: `apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx` now composes the shared `NoteContextMenu` (`widgets/ribbon/NoteActions.tsx`) which already exposes move commands. A maintainer should confirm the "Move to…" entry actually appears in the mobile dropdown; if not, passing additional tree-action items into `NoteContextMenu` from `mobile_detail_menu.tsx` is a one-file change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium
|
||||
|
||||
### [#3751 — (Bug report) Logging api.startNote in backend JS script crashes app](https://github.com/TriliumNext/Trilium/issues/3751)
|
||||
- **Problem**: `api.log(api.startNote)` crashes the server because `ws.js` does `JSON.stringify` on an object graph containing circular refs.
|
||||
- **Proposed solution**: In the log sender (grep for `JSON.stringify` in `apps/server/src/services/ws.ts` and/or the backend script api logger in `apps/server/src/services/backend_script_api.ts`), wrap `JSON.stringify` in a try/catch that falls back to a safe stringifier with a circular-reference replacer. Reporter already linked the MDN example.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#4178 — api.$container is null error for statistics js script](https://github.com/TriliumNext/Trilium/issues/4178)
|
||||
- **Problem**: Demo "Most edited notes" / "Most type content" scripts fail because `api.$container` is null when the script runs outside a render-widget context.
|
||||
- **Proposed solution**: Likely already fixed by the widget refactor and hidden-subtree demo rework, but a maintainer should verify the demo "Statistics" scripts still exist in the built-in demo content and that they access `api.$container` only when rendered as a render note. If the demo still ships, a null-guard (`if (!api.$container) return;`) in each demo script (`apps/server/src/assets/demo/…` or wherever demo notes live) is a one-liner.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: low
|
||||
|
||||
### [#3746 — (Feature request) add "include title" option in the "include note" windows](https://github.com/TriliumNext/Trilium/issues/3746)
|
||||
- **Problem**: The Include Note dialog offers only a size selector; there is no way to suppress the note title in the rendered inclusion.
|
||||
- **Proposed solution**: Small scope but touches multiple layers: `apps/client/src/widgets/dialogs/include_note.tsx` to add a checkbox, `packages/ckeditor5/src/plugins/includenote.ts` to persist an `includeTitle` (or `showTitle`) attribute alongside `boxSize`, and the client-side include-note renderer in `apps/client/src/services/` (grep for `loadIncludedNote`) to skip the title when set. Still contained to a well-understood area.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#4184 — (Bug report) Search in read-only note does not work](https://github.com/TriliumNext/Trilium/issues/4184)
|
||||
- **Evidence**: `apps/client/src/widgets/find.ts` now explicitly handles `readOnlyTemporarilyDisabled` and picks `htmlHandler` vs `textHandler` based on `noteContext?.isReadOnly()` (lines 245-259). The original 2023 bug was that only the editable text handler was wired up.
|
||||
- **Verification needed**: Maintainer should reproduce in a note with `#readOnly` on the latest build; if search now finds matches, close.
|
||||
|
||||
### [#4058 — (Bug report) API removeLabel() results in duplicated labels upon refreshing](https://github.com/TriliumNext/Trilium/issues/4058)
|
||||
- **Evidence**: This was reported against `zadam/trilium` master in 2023. Label/attribute persistence went through a major rewrite in the becca entity layer since then (see `apps/server/src/becca/entities/battribute.ts` and the `PUT /api/notes/:noteId/attributes` route). The described symptom (stale attributes being re-inserted on refresh) is a classic froca-cache bug that was addressed in the subsequent cache-coherence work.
|
||||
- **Verification needed**: Reproduce the exact script against current master — add/remove label via `note.removeLabel(...)` from `api.runOnBackend` and verify the label stays removed after reopening.
|
||||
|
||||
### [#3834 — (Bug report) chrome extension Trilium Web Clipper save whole page can not show in Trilium note](https://github.com/TriliumNext/Trilium/issues/3834)
|
||||
- **Evidence**: The error trace points at obfuscated CKEditor 5 upcast conversion code that no longer matches the current CKEditor 5 + Trilium plugin set (we're on a much newer CKEditor 5 with rewritten plugins in `packages/ckeditor5/`). Web Clipper code has also been moved into `apps/web-clipper/`.
|
||||
- **Verification needed**: Retest clipping the reporter's URL with current master web clipper + server.
|
||||
|
||||
### [#3868 — docker log show chown operation not permitted](https://github.com/TriliumNext/Trilium/issues/3868)
|
||||
- **Evidence**: Docker image and its entrypoint have been significantly rewritten (see `apps/server/Dockerfile*` and `apps/server/scripts/start-docker.sh`) — the `chown` loop the reporter hit has been replaced with a conditional that respects existing ownership. The `USER_UID`/`USER_GID` flow has been re-worked to avoid `usermod` collisions.
|
||||
- **Verification needed**: A maintainer should pull the latest image on an SMB/NFS share and verify it starts without chown errors.
|
||||
|
||||
### [#4008 — Permissions issue: Can not set UID and GID to '0'](https://github.com/TriliumNext/Trilium/issues/4008)
|
||||
- **Evidence**: Same root cause as #3868 and likely addressed by the same Docker entrypoint rewrite. The `usermod: UID '0' already exists` path was conditional and has since been guarded.
|
||||
- **Verification needed**: Maintainer should test `USER_UID=0 USER_GID=0` with the current Docker image.
|
||||
|
||||
### [#3705 — Changing the size of inclusions in a note](https://github.com/TriliumNext/Trilium/issues/3705)
|
||||
- **Evidence**: Possibly already fixed — `apps/client/src/widgets/dialogs/include_note.tsx` exists and the plugin in `packages/ckeditor5/src/plugins/includenote.ts` stores `boxSize` as a model attribute (so editing is theoretically possible). Grep for a double-click or toolbar action on the `includeNote` widget to confirm there is a "change size" affordance; if none exists, this should move to Notable.
|
||||
- **Verification needed**: Try inserting an Include Note, then right-click or double-click the widget in a current build to see if a size editor appears.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#4192 — Full portable mode](https://github.com/TriliumNext/Trilium/issues/4192) — Needs an Electron launcher that suppresses the console window on Windows and redirects `userData` to the exe directory; touches packaging.
|
||||
- [#4175 — The application freezes when opening the backend log](https://github.com/TriliumNext/Trilium/issues/4175) — Likely a huge-log-file render-blocking issue in `BackendLog.tsx`; needs streaming/virtualization, not a one-liner.
|
||||
- [#4174 — Frontend script API getActiveContextCodeEditor() times out](https://github.com/TriliumNext/Trilium/issues/4174) — Timing issue with `refreshWithNote` vs editor readiness; needs scripting-API investigation.
|
||||
- [#4064 — Hovering over link inside mermaid diagram causes flicker](https://github.com/TriliumNext/Trilium/issues/4064) — Tooltip positioning/pointer-events fix on mermaid link hover; not trivial to get right cross-browser.
|
||||
- [#4043 — Image goes to subnote of main after delete it](https://github.com/TriliumNext/Trilium/issues/4043) — Image-deletion / orphan-attachment behavior in text notes; needs backend+frontend coordination.
|
||||
- [#4029 — Directory redirection sometimes does not lead to the specified directory](https://github.com/TriliumNext/Trilium/issues/4029) — Vague scroll/jump bug in note tree; needs reporter repro but potentially a real race.
|
||||
- [#4010 — Text cursor jumps to EOF instead of next line with internal link title](https://github.com/TriliumNext/Trilium/issues/4010) — CKEditor 5 caret-navigation bug across non-editable reference widgets; upstream-ish.
|
||||
- [#3919 — Internal link is not searchable in the note editor](https://github.com/TriliumNext/Trilium/issues/3919) — CKEditor Find-and-Replace over non-text reference elements.
|
||||
- [#3851 — Can't drag a note to the top of the child list?](https://github.com/TriliumNext/Trilium/issues/3851) — fancytree drag target zone issue for "before first child"; needs careful tree-widget work.
|
||||
- [#3823 — Word-wise matching in search](https://github.com/TriliumNext/Trilium/issues/3823) — Quoted substring search matching within words; touches `apps/server/src/services/search/` tokenizer.
|
||||
- [#3789 — Task daily journal clone disappears when assigning a tag](https://github.com/TriliumNext/Trilium/issues/3789) — Task manager clone logic corner case; needs investigation in demo "Task Manager" scripts.
|
||||
- [#3704 — Trilium always places the cursor at the beginning of the note](https://github.com/TriliumNext/Trilium/issues/3704) — Cursor/scroll-position persistence across note switches; meaningful UX change.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#4179 — Identify the current outline location](https://github.com/TriliumNext/Trilium/issues/4179)
|
||||
- [#4134 — Add 'Expandable' option to Include Note feature](https://github.com/TriliumNext/Trilium/issues/4134)
|
||||
- [#4124 — Labels with predefined lists](https://github.com/TriliumNext/Trilium/issues/4124)
|
||||
- [#4099 — An idea for (perhaps) a better naming of note clones](https://github.com/TriliumNext/Trilium/issues/4099)
|
||||
- [#4080 — Workspace Specific Launchers](https://github.com/TriliumNext/Trilium/issues/4080)
|
||||
- [#4061 — Unix Days as calendar](https://github.com/TriliumNext/Trilium/issues/4061)
|
||||
- [#4052 — File selecting items stored in notes?](https://github.com/TriliumNext/Trilium/issues/4052)
|
||||
- [#4026 — Time attribute field](https://github.com/TriliumNext/Trilium/issues/4026)
|
||||
- [#4023 — Allow launchers to pass arguments to script notes](https://github.com/TriliumNext/Trilium/issues/4023)
|
||||
- [#4005 — ETAPI interface to get note content hash](https://github.com/TriliumNext/Trilium/issues/4005)
|
||||
- [#4002 — Internal link inside mermaid diagram](https://github.com/TriliumNext/Trilium/issues/4002)
|
||||
- [#3983 — API function to refresh search note](https://github.com/TriliumNext/Trilium/issues/3983)
|
||||
- [#3978 — Login page custom background](https://github.com/TriliumNext/Trilium/issues/3978)
|
||||
- [#3964 — API Method to get all notes](https://github.com/TriliumNext/Trilium/issues/3964)
|
||||
- [#3958 — Allow hiding/blocking inherited attributes on template users](https://github.com/TriliumNext/Trilium/issues/3958)
|
||||
- [#3913 — Allow no timeout for protected notes](https://github.com/TriliumNext/Trilium/issues/3913)
|
||||
- [#3906 — Host Trilium Demo Instance](https://github.com/TriliumNext/Trilium/issues/3906)
|
||||
- [#3905 — add central excalidraw library for all canvas notes](https://github.com/TriliumNext/Trilium/issues/3905)
|
||||
- [#3902 — view child notes inside canvas note](https://github.com/TriliumNext/Trilium/issues/3902)
|
||||
- [#3899 — Preserve selected delete/import dialog options](https://github.com/TriliumNext/Trilium/issues/3899)
|
||||
- [#3885 — Fully adhere to the XDG Base Directory Specification](https://github.com/TriliumNext/Trilium/issues/3885)
|
||||
- [#3878 — Sort Lines](https://github.com/TriliumNext/Trilium/issues/3878)
|
||||
- [#3865 — MyScript Handwriting integration](https://github.com/TriliumNext/Trilium/issues/3865)
|
||||
- [#3840 — Allow transclusion as additional note relation in the map](https://github.com/TriliumNext/Trilium/issues/3840)
|
||||
- [#3825 — Office document support](https://github.com/TriliumNext/Trilium/issues/3825)
|
||||
- [#3798 — Take all links referenced in child notes and create a reference page](https://github.com/TriliumNext/Trilium/issues/3798)
|
||||
- [#3794 — Tiling images without resorting to tables](https://github.com/TriliumNext/Trilium/issues/3794)
|
||||
- [#3785 — Standard label for opening default note](https://github.com/TriliumNext/Trilium/issues/3785)
|
||||
- [#3767 — Is there a way to turn off Autoformat completely?](https://github.com/TriliumNext/Trilium/issues/3767)
|
||||
- [#3761 — Template mixins: Grouped inherited promoted attributes](https://github.com/TriliumNext/Trilium/issues/3761)
|
||||
- [#3743 — Minimize/close to tray icon](https://github.com/TriliumNext/Trilium/issues/3743)
|
||||
- [#3729 — Keep sidebar width more consistent](https://github.com/TriliumNext/Trilium/issues/3729)
|
||||
- [#3724 — Paste picture default Settings](https://github.com/TriliumNext/Trilium/issues/3724)
|
||||
- [#3721 — ETAPI: Append to existing note content](https://github.com/TriliumNext/Trilium/issues/3721)
|
||||
- [#3720 — Clone to today](https://github.com/TriliumNext/Trilium/issues/3720)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
_None — every issue in this batch is classified above._
|
||||
@@ -1,102 +0,0 @@
|
||||
# Batch 11 — Issues #3185–#3703
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#3697 — Docker : Set USER_GID to 100 (Feature request)](https://github.com/TriliumNext/Trilium/issues/3697)
|
||||
- **Problem**: `start-docker.sh` runs `groupmod -g ${USER_GID} node`, which fails when GID 100 already exists (e.g. Unraid's default `users` group).
|
||||
- **Proposed solution**: `apps/server/start-docker.sh` line 4 currently uses `groupmod -og ${USER_GID} node` (the `-o` flag allows a non-unique GID). This is likely already the fix — verify the published Docker image ships this and close. If `rootless-entrypoint.sh` still lacks `-o`, add it there too.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high (code already uses `-og`, just needs image-release verification)
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#3516 — (Bug report) Hidden notes appear in search results](https://github.com/TriliumNext/Trilium/issues/3516)
|
||||
- **Evidence**: Search context has `includeHiddenNotes` option; `apps/server/src/services/search/services/parse.ts:503-510` wraps the query with `NotExp(new IsHiddenExp())` when `includeHiddenNotes` is false. `git log -S "IsHiddenExp"` shows commit `88bc7402a2` "hidden notes should not appear in the global search unless hoisted into it, #3516".
|
||||
- **Verification needed**: Reproducer on a fresh 0.9x build — confirm `_hidden` subtree notes no longer show in global search.
|
||||
|
||||
### [#3627 — Invalid timezone in search using docker container](https://github.com/TriliumNext/Trilium/issues/3627)
|
||||
- **Evidence**: Docker user guide (`apps/server/src/assets/doc_notes/.../Using Docker.html` around line 81) already has a "Note on timezones" section recommending setting the `TZ` env var. The reporter's suggestion was to document this.
|
||||
- **Verification needed**: Maintainer can close as already documented (or link the docs section from the issue).
|
||||
|
||||
### [#3191 — (Feature request) Add ability to set X-Frame-Options header](https://github.com/TriliumNext/Trilium/issues/3191)
|
||||
- **Evidence**: `apps/server/src/app.ts:82` uses helmet with only a few options overridden; Helmet's default frameguard is `SAMEORIGIN`, not `DENY`. The reporter's complaint was that DENY was being set — current defaults are already SAMEORIGIN.
|
||||
- **Verification needed**: `curl -I` against a running instance, confirm the header value, close if SAMEORIGIN.
|
||||
|
||||
### [#3524 — Error in custom widget leads to blank application / web frontend](https://github.com/TriliumNext/Trilium/issues/3524)
|
||||
- **Evidence**: `git log -S "custom widget"` shows `528d94a8fb` "accept custom widgets as classes instead of instances, #4274" and `7567903da3` "docs(user): improve documentation on custom widgets & Preact". The widget loading pipeline has been significantly restructured and now tolerates class-based widgets; unhandled doRender errors are caught higher in the widget tree in the new Preact-based rendering.
|
||||
- **Verification needed**: Create a broken custom widget (call missing method), confirm app still renders with error logged instead of blanking.
|
||||
|
||||
### [#3415 — Unify the attribute_detail and builtin_attributes definitions](https://github.com/TriliumNext/Trilium/issues/3415)
|
||||
- **Evidence**: `packages/commons/src/lib/builtin_attributes.ts` now exists as the shared source of truth (moved in commit `9b3396349e` "refactor(commons): add builtin_attributes to commons"). However, `apps/client/src/widgets/attribute_widgets/attribute_detail.ts:202-271` still maintains its own hardcoded `ATTR_HELP` map. Partial unification.
|
||||
- **Verification needed**: Decide whether to close (partial unification done) or keep open as a refactor to have `attribute_detail` consume `builtin_attributes` entries and attach help text there.
|
||||
|
||||
### [#3218 — Starting searches with "Combining Diacritical Marks" will freeze Trilium](https://github.com/TriliumNext/Trilium/issues/3218)
|
||||
- **Evidence**: `apps/server/src/services/utils.ts:108` normalizes input text before search, and commit `f705c432fd` "allow combining tokens in text and title/attributes, fixes #2820" rewrote combining-character handling.
|
||||
- **Verification needed**: Try entering `¨` in quick search on current build — confirm no freeze.
|
||||
|
||||
### [#3355 — Global search finds notes with 'whitespace' inside search term](https://github.com/TriliumNext/Trilium/issues/3355)
|
||||
- **Evidence**: The search tokenizer was rewritten alongside the sqlite FTS work (`git log --grep rice-searching-with-sqlite`), and text is normalized via `str.normalize("NFC")` in `apps/server/src/services/utils.ts:532`.
|
||||
- **Verification needed**: Attempt the whitespace-in-term reproduction against a recent build. Likely no longer reproduces.
|
||||
|
||||
### [#3626 — Sync from clients to server fails for a specific daily journal note](https://github.com/TriliumNext/Trilium/issues/3626)
|
||||
- **Evidence**: Reporter's error was "Can't find note 0LKt6C8L7y3s" in `resolveNotePathToSegments`. Sync engine and `froca.resolveNotePathToSegments` have been heavily refactored since 0.58; orphaned branches during sync are now tolerated rather than throwing fatal errors.
|
||||
- **Verification needed**: Nothing to reproduce from the stale db. Close as stale / cannot-reproduce.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#3703 — Disable version history function failure](https://github.com/TriliumNext/Trilium/issues/3703) — `disableVersioning` check exists in `notes.ts:741`, reporter claims revisions still get saved after a period; needs repro against read-only auto-save path.
|
||||
- [#3657 — New Note link not showing at cursor location after hitting "enter"](https://github.com/TriliumNext/Trilium/issues/3657) — CKEditor mention plugin: new-note insertion ignores caret when template picker is confirmed with Enter. Needs CKEditor mention fix.
|
||||
- [#3600 — sync lag](https://github.com/TriliumNext/Trilium/issues/3600) — Canvas sync conflicts from stale client cache; complex sync logic change.
|
||||
- [#3587 — ResizeObserver loop limit exceeded](https://github.com/TriliumNext/Trilium/issues/3587) — console spam on split; requires debouncing ResizeObserver callbacks in `content_header.ts` / `tab_row.ts`.
|
||||
- [#3500 — Trilium does not start if the firewall has blocked it](https://github.com/TriliumNext/Trilium/issues/3500) — needs electron-level error surfacing when initial localhost connection fails; not trivial.
|
||||
- [#3495 — High memory use causing process kill or OOM](https://github.com/TriliumNext/Trilium/issues/3495) — memory leak investigation in sync process; requires profiling.
|
||||
- [#3478 — Lagging Trilium frontend when editing large note](https://github.com/TriliumNext/Trilium/issues/3478) — CKEditor `setData` re-run on every poll; requires changing debounce strategy in `EditableText.tsx`.
|
||||
- [#3457 — Strange behavior when dealing with math related contents](https://github.com/TriliumNext/Trilium/issues/3457) — cursor skipping inline math + Firefox-specific math disappearance; upstream CKEditor math bugs.
|
||||
- [#3395 — Reloading while editing a text field in a canvas note causes permanent invisibility](https://github.com/TriliumNext/Trilium/issues/3395) — Excalidraw `editingGroupId` persisted into saved JSON; needs canvas save-state sanitisation.
|
||||
- [#3371 — Can not save weibo.com](https://github.com/TriliumNext/Trilium/issues/3371) — web-clipper compatibility with a specific site; needs clipper debugging.
|
||||
- [#3283 — Misplaced links to newly created pages](https://github.com/TriliumNext/Trilium/issues/3283) — mouse-click confirmation of template picker drops caret; CKEditor mention plugin issue.
|
||||
- [#3235 — JavaScript error popup - ERR_ONNECTION_RESET](https://github.com/TriliumNext/Trilium/issues/3235) — main process crash popup; needs electron main-process error handler.
|
||||
- [#3214 — cursor jumps to another place after click included note](https://github.com/TriliumNext/Trilium/issues/3214) — CKEditor selection restoration after include-note click; non-trivial.
|
||||
- [#3187 — HTML export results in unreadable notes on deeper parts of the tree](https://github.com/TriliumNext/Trilium/issues/3187) — Windows MAX_PATH limits on deep hierarchies; needs export path shortening.
|
||||
- [#3185 — Export & import note tree with backlinks breaks note map](https://github.com/TriliumNext/Trilium/issues/3185) — dangling relation targets cause `hasLabel` on undefined; needs null-guard in backlink/note-map routes (borderline easy but depends on root cause investigation of why deleted relations survive import).
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#3633 — Take a snapshot of a web page in Trilium](https://github.com/TriliumNext/Trilium/issues/3633)
|
||||
- [#3593 — Ability to disable jumping to an image when an image is attached](https://github.com/TriliumNext/Trilium/issues/3593)
|
||||
- [#3566 — Add search action to copy note](https://github.com/TriliumNext/Trilium/issues/3566)
|
||||
- [#3563 — LeftPanel fix width and toggle](https://github.com/TriliumNext/Trilium/issues/3563)
|
||||
- [#3557 — full text search by command line](https://github.com/TriliumNext/Trilium/issues/3557)
|
||||
- [#3556 — Automatically set note code type when extension is written in note name](https://github.com/TriliumNext/Trilium/issues/3556)
|
||||
- [#3551 — Context Menu Widget](https://github.com/TriliumNext/Trilium/issues/3551)
|
||||
- [#3541 — How to config the font color sets](https://github.com/TriliumNext/Trilium/issues/3541)
|
||||
- [#3540 — Unhoist temporarily](https://github.com/TriliumNext/Trilium/issues/3540)
|
||||
- [#3498 — More signals for search & autocomplete ranking](https://github.com/TriliumNext/Trilium/issues/3498)
|
||||
- [#3494 — Value replace in bulk action](https://github.com/TriliumNext/Trilium/issues/3494)
|
||||
- [#3493 — Dynamic relations, or attribute inheritance between linked notes](https://github.com/TriliumNext/Trilium/issues/3493)
|
||||
- [#3484 — add a keyshort for any format when write a text note](https://github.com/TriliumNext/Trilium/issues/3484)
|
||||
- [#3462 — Color palette for Highlight](https://github.com/TriliumNext/Trilium/issues/3462)
|
||||
- [#3458 — Show special characters in editor](https://github.com/TriliumNext/Trilium/issues/3458)
|
||||
- [#3433 — Provide a set of charts in the hidden subtree](https://github.com/TriliumNext/Trilium/issues/3433)
|
||||
- [#3430 — Add basic fulltext search to share](https://github.com/TriliumNext/Trilium/issues/3430)
|
||||
- [#3426 — search and replace](https://github.com/TriliumNext/Trilium/issues/3426)
|
||||
- [#3400 — Setting to disable replacement of straight quote sign with typographic ones](https://github.com/TriliumNext/Trilium/issues/3400)
|
||||
- [#3399 — Export Notes option to include internal links](https://github.com/TriliumNext/Trilium/issues/3399)
|
||||
- [#3389 — Images upload sequence on mobile](https://github.com/TriliumNext/Trilium/issues/3389)
|
||||
- [#3385 — Searching through note revisions?](https://github.com/TriliumNext/Trilium/issues/3385)
|
||||
- [#3358 — Is there a plan to add a table of contents function to the left side](https://github.com/TriliumNext/Trilium/issues/3358)
|
||||
- [#3356 — Collapsed child notes links should toggle the expansion on first click](https://github.com/TriliumNext/Trilium/issues/3356)
|
||||
- [#3353 — Support extra CA certs](https://github.com/TriliumNext/Trilium/issues/3353)
|
||||
- [#3335 — Use mouse wheel to scroll up/down instead of zoom in mermaid notes](https://github.com/TriliumNext/Trilium/issues/3335)
|
||||
- [#3304 — Add shortcut (set text to code format)](https://github.com/TriliumNext/Trilium/issues/3304)
|
||||
- [#3269 — Declare some relation as "repeated but unique"](https://github.com/TriliumNext/Trilium/issues/3269)
|
||||
- [#3268 — Accept drag-and-dropping note links into relation map](https://github.com/TriliumNext/Trilium/issues/3268)
|
||||
- [#3267 — Multiple note drag-and-drop into relation map](https://github.com/TriliumNext/Trilium/issues/3267)
|
||||
- [#3266 — Automatic layout on relation maps](https://github.com/TriliumNext/Trilium/issues/3266)
|
||||
- [#3263 — Generalized Trilium tree](https://github.com/TriliumNext/Trilium/issues/3263)
|
||||
- [#3246 — Is it possible to integrate the plantUML?](https://github.com/TriliumNext/Trilium/issues/3246)
|
||||
- [#3244 — Add option, prompt before exit](https://github.com/TriliumNext/Trilium/issues/3244)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
- None — all 58 issues placed above.
|
||||
@@ -1,107 +0,0 @@
|
||||
# Batch 12 — Issues #2488–#3184
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#3151 — (Bug report) Import from HTML does not restore indentation](https://github.com/TriliumNext/Trilium/issues/3151)
|
||||
- **Problem**: Exported HTML has `style="margin-left:40px"` on `<p>` but importing strips that style, losing indentation.
|
||||
- **Proposed solution**: In `/home/elian/Projects/Trilium/apps/server/src/services/html_sanitizer.ts` (line ~49 `allowedStyles`), add `margin-left` (and likely `padding-left`, `text-align`) to the allowed styles for `p` (or `*`). Currently only `color`/`background-color` are globally allowed; the entire `style` attribute is preserved but sanitize-html strips unknown properties.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#2817 — open internal link in OSX apps](https://github.com/TriliumNext/Trilium/issues/2817)
|
||||
- **Problem**: `bookends:` URLs don't open externally from notes because the protocol isn't in the allow-list.
|
||||
- **Proposed solution**: Add `bookends` (and any other commonly requested scheme) to `ALLOWED_PROTOCOLS` in `/home/elian/Projects/Trilium/packages/commons/src/lib/shared_constants.ts`. The CKEditor/link handler already calls `electron.shell.openExternal` for allowed protocols (see `apps/client/src/services/link.ts:338`).
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium (fix is trivial; user may also need CKEditor to permit `bookends:` hrefs in the schema)
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#3177 — (Bug report) ERR_SOCKET_BAD_PORT - port set to NaN on server start](https://github.com/TriliumNext/Trilium/issues/3177)
|
||||
- **Evidence**: `/home/elian/Projects/Trilium/apps/server/src/services/port.ts` now uses `parseAndValidate()` that explicitly checks `isNaN` and exits with a clear FATAL message; v0.55 parser issue appears rewritten.
|
||||
- **Verification needed**: Ask reporter to retry with current release and provide `config.ini` if still failing.
|
||||
|
||||
### [#3045 — Docker : Can't run by using user 1000:1000](https://github.com/TriliumNext/Trilium/issues/3045)
|
||||
- **Evidence**: `/home/elian/Projects/Trilium/apps/server/Dockerfile.rootless` now exists — runs as non-root user with configurable UID/GID via build args and does not rely on `su-exec`/`setgroups`. Multiple rootless-related fixes present in git log.
|
||||
- **Verification needed**: Confirm with reporter that the rootless image solves their scenario.
|
||||
|
||||
### [#2957 — (Bug report) JavaScript error when attempting to run when an instance is already running](https://github.com/TriliumNext/Trilium/issues/2957)
|
||||
- **Evidence**: `/home/elian/Projects/Trilium/apps/desktop/src/main.ts:87` uses `app.requestSingleInstanceLock()` and exits gracefully (`process.exit(0)`) with a translated info message instead of throwing an unhandled error. There's also a `second-instance` handler that focuses the existing window.
|
||||
- **Verification needed**: Run two instances on Windows to confirm no more JS error.
|
||||
|
||||
### [#2722 — (Feature request) Make interface auth timeout configurable](https://github.com/TriliumNext/Trilium/issues/2722)
|
||||
- **Evidence**: `Session.cookieMaxAge` is configurable in `apps/server/src/assets/config-sample.ini` (line 39) and documented in `apps/server/src/assets/doc_notes/en/User Guide/.../Authentication.html`. Used by `apps/server/src/routes/session_parser.ts:110`.
|
||||
- **Verification needed**: Close as implemented, link to Authentication docs.
|
||||
|
||||
### [#2784 — (Feature request) Add an example documentation for self-signed certs in TLS configuration wiki page](https://github.com/TriliumNext/Trilium/issues/2784)
|
||||
- **Evidence**: `docs/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).md` contains 3 matches for `self-signed`/`self sign`, so self-signed guidance is now present.
|
||||
- **Verification needed**: Maintainer confirms current doc covers the scenario the reporter wanted.
|
||||
|
||||
### [#2909 — webclipper show not correct](https://github.com/TriliumNext/Trilium/issues/2909)
|
||||
- **Evidence**: Web-clipper was completely rewritten — new implementation lives in `apps/web-clipper/` (WXT-based). The reporter's 0.52.2-era bug with the old zadam web-clipper is no longer reproducible against the new codebase.
|
||||
- **Verification needed**: Ask reporter to retry with the current web-clipper.
|
||||
|
||||
### [#2621 — (Bug report) Inconsistency import pictures with Trilium Web Clipper Addon](https://github.com/TriliumNext/Trilium/issues/2621)
|
||||
- **Evidence**: Same as #2909 — web-clipper rewritten under `apps/web-clipper/`; old image-import inconsistency from v0.50 won't reproduce.
|
||||
- **Verification needed**: Ask reporter to retry "Save whole page" against modern web-clipper.
|
||||
|
||||
### [#2596 — (Bug report) Failed Start Up (Gnome Arc Menu extension)](https://github.com/TriliumNext/Trilium/issues/2596)
|
||||
- **Evidence**: Likely dead — Electron stack, Gnome shell extensions, and everything else has been updated many times since v0.49.5 (Jan 2022). No code in Trilium controls this; it's a third-party shell extension conflict.
|
||||
- **Verification needed**: Ask reporter to retry current release with Arc Menu; close as stale if not reproducible.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#3121 — (Bug report) write math inline, the text panel will delete things that i wrote before](https://github.com/TriliumNext/Trilium/issues/3121) — CKEditor `model-nodelist-offset-out-of-bounds` with math; CKEditor upgraded to v48 (from v29 era) so may be resolved but needs repro.
|
||||
- [#3015 — (Bug report) Template collision for Code note](https://github.com/TriliumNext/Trilium/issues/3015) — Journal day-note template incorrectly applied to non-text child creation; needs investigation in `apps/server/src/services/notes.ts` template resolution logic.
|
||||
- [#3123 — Moving notes in the tree - default encryption state](https://github.com/TriliumNext/Trilium/issues/3123) — Needs UX design for encryption prompt on move into/out of protected subtree.
|
||||
- [#2841 — (Bug report) When an unordered list has a sublist, click on the right side...](https://github.com/TriliumNext/Trilium/issues/2841) — CKEditor cursor-placement bug; likely upstream.
|
||||
- [#2833 — (Bug report) Cannot select relation note to edit on mobile](https://github.com/TriliumNext/Trilium/issues/2833) — Mobile UX bug in relation map; mobile code has been rewritten, needs retest.
|
||||
- [#2823 — (Bug report) Note link got removed when close tab with middle button](https://github.com/TriliumNext/Trilium/issues/2823) — CKEditor interaction with middle-click; may be CKE upgrade related.
|
||||
- [#2818 — copy/paste pictures across software](https://github.com/TriliumNext/Trilium/issues/2818) — Cross-process image clipboard sharing in portable mode; complex.
|
||||
- [#2816 — (Bug report) The picture reference in shared notes is not normal](https://github.com/TriliumNext/Trilium/issues/2816) — MD export image path uses relative `api/images/...` URLs that break when note is rendered outside `/share/` context.
|
||||
- [#2804 — Sometimes tree fails to switch focus to a code note branch in split mode](https://github.com/TriliumNext/Trilium/issues/2804) — Focus/event propagation race in split-view; hard to repro.
|
||||
- [#2703 — (Bug report) @ link item dropdown persists between tabs](https://github.com/TriliumNext/Trilium/issues/2703) — CKEditor mention UI lifecycle; likely upstream.
|
||||
- [#2874 — (Bug report) select over two notes could not export](https://github.com/TriliumNext/Trilium/issues/2874) — Export menu item is gated on `noSelectedNotes` in `apps/client/src/menus/tree_context_menu.ts:276`; intentional-ish but still surprising UX — needs multi-select export support.
|
||||
- [#2651 — (Bug report) Deleting Several Items creates GET error](https://github.com/TriliumNext/Trilium/issues/2651) — Transient error during bulk delete; race condition hard to pin down.
|
||||
- [#2604 — (Bug report) After inserting 2 links into checkbox list item, can't add more text after second link](https://github.com/TriliumNext/Trilium/issues/2604) — CKEditor list+link bug; possibly fixed in v48 upgrade but needs repro.
|
||||
- [#2549 — Random notes lose their content, old revs still available](https://github.com/TriliumNext/Trilium/issues/2549) — Serious data-loss report tied to old 0.47/0.49 sync migration path; unlikely actionable now but should stay open as reference.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#3184 — Auto-setup links when creating a template](https://github.com/TriliumNext/Trilium/issues/3184)
|
||||
- [#3148 — Detect database failure and offer to temporarily load database](https://github.com/TriliumNext/Trilium/issues/3148)
|
||||
- [#3138 — Template organization via template groups with drop-down menus](https://github.com/TriliumNext/Trilium/issues/3138)
|
||||
- [#3130 — Latex in titles](https://github.com/TriliumNext/Trilium/issues/3130)
|
||||
- [#3112 — Ability to annotate/insert comments on note contents](https://github.com/TriliumNext/Trilium/issues/3112)
|
||||
- [#3098 — Focus on the searched word](https://github.com/TriliumNext/Trilium/issues/3098)
|
||||
- [#3082 — Option to open notes in new tab by default](https://github.com/TriliumNext/Trilium/issues/3082)
|
||||
- [#3053 — Restore previous windows and tabs open on startup](https://github.com/TriliumNext/Trilium/issues/3053)
|
||||
- [#3037 — Upgrade the Relation Map](https://github.com/TriliumNext/Trilium/issues/3037)
|
||||
- [#2989 — Can make "Find and Replace" allow Regular Expression?](https://github.com/TriliumNext/Trilium/issues/2989)
|
||||
- [#2972 — Make lines of Relation map straight](https://github.com/TriliumNext/Trilium/issues/2972)
|
||||
- [#2960 — Internal links in Canvas](https://github.com/TriliumNext/Trilium/issues/2960)
|
||||
- [#2923 — Adding 'Ignore' spellcheck function into context menu](https://github.com/TriliumNext/Trilium/issues/2923)
|
||||
- [#2870 — Hope add import folder and generates notetree](https://github.com/TriliumNext/Trilium/issues/2870)
|
||||
- [#2869 — Allow bypass/whitelist authentication for specific IP or subnet](https://github.com/TriliumNext/Trilium/issues/2869)
|
||||
- [#2802 — Shared SQL between SQL code notes](https://github.com/TriliumNext/Trilium/issues/2802)
|
||||
- [#2797 — A quicker way to create a bunch of new pages from a template](https://github.com/TriliumNext/Trilium/issues/2797)
|
||||
- [#2741 — Publish checksum of published assets](https://github.com/TriliumNext/Trilium/issues/2741)
|
||||
- [#2726 — Block References in Trilium Like in (Obsidian and Logseq)](https://github.com/TriliumNext/Trilium/issues/2726)
|
||||
- [#2710 — Open new tabs next to the current one](https://github.com/TriliumNext/Trilium/issues/2710)
|
||||
- [#2683 — Trigger asking whether to delete empty note more aggressively](https://github.com/TriliumNext/Trilium/issues/2683)
|
||||
- [#2664 — Allow unsharing of notes in a shared subtree](https://github.com/TriliumNext/Trilium/issues/2664)
|
||||
- [#2654 — Server to Server Sync](https://github.com/TriliumNext/Trilium/issues/2654)
|
||||
- [#2637 — Allow Styling of mini date selector](https://github.com/TriliumNext/Trilium/issues/2637)
|
||||
- [#2636 — Tabbing off field with dropdown selected should select](https://github.com/TriliumNext/Trilium/issues/2636)
|
||||
- [#2631 — Add service worker for caching large assets](https://github.com/TriliumNext/Trilium/issues/2631)
|
||||
- [#2622 — Disable sync for certain notes](https://github.com/TriliumNext/Trilium/issues/2622)
|
||||
- [#2620 — Add expiration date & max requests for shared notes](https://github.com/TriliumNext/Trilium/issues/2620)
|
||||
- [#2547 — automatically import the page title from url](https://github.com/TriliumNext/Trilium/issues/2547)
|
||||
- [#2544 — Forms/Fields in a template?](https://github.com/TriliumNext/Trilium/issues/2544)
|
||||
- [#2526 — simple recurring todo](https://github.com/TriliumNext/Trilium/issues/2526)
|
||||
- [#2524 — Ability to add custom shortcuts to the note toolbar](https://github.com/TriliumNext/Trilium/issues/2524)
|
||||
- [#2491 — Add improvements to internal links](https://github.com/TriliumNext/Trilium/issues/2491)
|
||||
- [#2488 — Show attributes on shared notes](https://github.com/TriliumNext/Trilium/issues/2488)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
(None — all batch issues are classified above.)
|
||||
@@ -1,95 +0,0 @@
|
||||
# Batch 13 — Issues #1763–#2477
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#2362 — "Delete all clones" checkbox should have a different message if there are no clones](https://github.com/TriliumNext/Trilium/issues/2362)
|
||||
- **Problem**: The "Delete all clones" checkbox is always rendered in the delete dialog even when the note has no clones, confusing users who don't know whether to tick it.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/dialogs/delete_notes.tsx`, compute the clone count from `noteIdsToBeDeleted` vs the branch count (or use a server-returned count). When `cloneCount <= 1`, render an info alert like "This note has no clones" instead of the `FormCheckbox`. When clones exist, append the count to the label (`delete_notes.delete_all_clones_description_n`). Add the new translation keys to `apps/client/src/translations/en/translation.json`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — may need to thread a clone count through `delete-notes-preview` response if not already available.
|
||||
|
||||
### [#2455 — Various feature requests (new-tab autocomplete focus portion only)](https://github.com/TriliumNext/Trilium/issues/2455)
|
||||
- **Problem**: When opening a new tab, the caret is no longer inside the "search for a note by its name" autocomplete field; user has to manually click it.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/type_widgets/Empty.tsx`, add `autocompleteRef.current?.focus()` inside the existing `useEffect` that calls `note_autocomplete.showRecentNotes`. Only the focus subpart of this meta-issue is easy; the other sub-items (Tab navigation in search results, shortcut collisions inside search field, scroll shortcuts) are not in scope.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high for the focus part only.
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#2290 — ERROR: Failed to deserialize sync response: Option "documentSecret" doesn't exist](https://github.com/TriliumNext/Trilium/issues/2290)
|
||||
- **Evidence**: `apps/server/src/services/options_init.ts` lines 10–13 call `initDocumentOptions()` which unconditionally creates `documentId` and `documentSecret` with `randomSecureToken(16)`. The option is also referenced in `sync.ts`, `setup.ts`, and the commons `options_interface.ts`. Sync/setup flow was rewritten since v0.48.
|
||||
- **Verification needed**: Have a maintainer reproduce the "remote docker killed mid-sync" scenario against a current build; the missing option should now be seeded.
|
||||
|
||||
### [#2340 — Denial of Service (setup page spawning main windows)](https://github.com/TriliumNext/Trilium/issues/2340)
|
||||
- **Evidence**: `apps/server/src/routes/setup.ts` no longer calls `createMainWindow` directly on the unauthenticated setup endpoint. It renders a setup page and only calls `windowService.createMainWindow(app)` from `handleElectronRedirect()` after the DB is already initialized. Commit `a155b6e8d5` ("create separate window for setup and then main window") addressed this.
|
||||
- **Verification needed**: Confirm that an unauthenticated `/setup` request against the current desktop build no longer spawns windows.
|
||||
|
||||
### [#2239 — Docker Compose file needs to be updated](https://github.com/TriliumNext/Trilium/issues/2239)
|
||||
- **Evidence**: `git log` shows commit `78b6614eea` "fix docker-compose.yml #2239" and `883e71612c` "Use `triliumnext/notes` as image in `docker-compose.yml`". The new compose file uses the correct image name and a persisted volume.
|
||||
- **Verification needed**: Run the repo's current `docker-compose.yml` and confirm data persists in the named volume.
|
||||
|
||||
### [#2413 — Note map does not display inherited relations](https://github.com/TriliumNext/Trilium/issues/2413)
|
||||
- **Evidence**: `apps/server/src/routes/api/note_map.ts` line 61 uses `note.getRelations()`, and `apps/server/src/becca/entities/bnote.ts` line 657 defines `getRelations()` as `getAttributes(RELATION, name)` which explicitly includes inherited attributes (the doc comment says "including inherited ones"). Only `template`/`inherit` relation names are filtered out (line 57), not the inherited relations themselves.
|
||||
- **Verification needed**: Reproduce with Template + Instance, open note map on Instance, confirm the `testRelation` edge to Target now appears.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
|
||||
- [#2350 — Out of memory on large DB](https://github.com/TriliumNext/Trilium/issues/2350) — Docker OOM with a 2.7 GB document.db; needs profiling of note cache load / backup code paths.
|
||||
- [#2163 — Uploading large .aac broke sync](https://github.com/TriliumNext/Trilium/issues/2163) — Large-file upload causing corrupt branch state + JS heap OOM on sync; deep investigation into sync chunking needed.
|
||||
- [#2141 — Broken database causes web UI to not load](https://github.com/TriliumNext/Trilium/issues/2141) — When saved-search deletion corrupted the DB, client rendered a blank page instead of an error; needs better error boundary + recovery.
|
||||
- [#2050 — content with lot of pdf attachments not sync between multi-client and server](https://github.com/TriliumNext/Trilium/issues/2050) — Sync of notes with many large attachments ends up with a crumbled tree; sync service bug.
|
||||
- [#2060 — trilium-server will not sync with trilium-desktop over TLS; ERR_CERT_AUTHORITY_INVALID](https://github.com/TriliumNext/Trilium/issues/2060) — Need docs and/or a "trust this cert" option in desktop sync settings.
|
||||
- [#2278 — Image on side pane unloads when switching focus to other pane](https://github.com/TriliumNext/Trilium/issues/2278) — Split-pane image widget unloads the image on focus change; type-widget lifecycle bug.
|
||||
- [#2326 — Image at very top of note can't show 'Insert new line' arrow; margin issues](https://github.com/TriliumNext/Trilium/issues/2326) — CKEditor top-margin/image toolbar collision; needs CSS tweaks in the editor image plugin.
|
||||
- [#1813 — Note title input on mobile (caret jumps around)](https://github.com/TriliumNext/Trilium/issues/1813) — Mobile Chrome title editing; likely a contenteditable interaction bug.
|
||||
- [#1883 — Exporting HTML files in zip with special characters ISSUE](https://github.com/TriliumNext/Trilium/issues/1883) — `sanitize-filename` is used but reporter shows dataerror during decompression; may need proper UTF-8 filename encoding in zip writer (EFS flag).
|
||||
- [#1877 — No distinction between undefined and false in a boolean promoted attribute](https://github.com/TriliumNext/Trilium/issues/1877) — Promoted boolean checkbox renders `valueAttr.value === "true"`, so unset looks identical to explicitly false; would need a tri-state UI.
|
||||
- [#2092 — web clipper doesn't import code snippets](https://github.com/TriliumNext/Trilium/issues/2092) — Parser bug in web clipper extension.
|
||||
- [#2323 — MoveTo and CloneTo should suggest destinations not sources](https://github.com/TriliumNext/Trilium/issues/2323) — Need a separate "recent destinations" tracker distinct from `note_autocomplete.triggerRecentNotes` which shows recently visited notes.
|
||||
- [#2128 — Workspace name in tab title](https://github.com/TriliumNext/Trilium/issues/2128) — `tab_manager.updateDocumentTitle` / `note_context.getNavigationTitle` would need workspace (hoisted) context added.
|
||||
- [#2212 — Ctrl+W on root note should close Trilium](https://github.com/TriliumNext/Trilium/issues/2212) — `removeNoteContext` explicitly short-circuits when the last tab is empty; closing Trilium itself requires electron-specific IPC.
|
||||
- [#1847 — autoReadOnly delay](https://github.com/TriliumNext/Trilium/issues/1847) — Request for a delay/temporary-edit-mode shortcut; needs a design decision and option surface.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
- [#2477 — Automatically delete and/or unhide unsaved notes](https://github.com/TriliumNext/Trilium/issues/2477)
|
||||
- [#2473 — Show branch prefix in quick search (for protected notes)](https://github.com/TriliumNext/Trilium/issues/2473)
|
||||
- [#2420 — Link between labels with date values and daily journal notes](https://github.com/TriliumNext/Trilium/issues/2420)
|
||||
- [#2404 — Full-Text Search results list like Google](https://github.com/TriliumNext/Trilium/issues/2404)
|
||||
- [#2391 — One-click installation on CapRover](https://github.com/TriliumNext/Trilium/issues/2391)
|
||||
- [#2363 — Better support for linking notes from Mermaid diagrams](https://github.com/TriliumNext/Trilium/issues/2363)
|
||||
- [#2354 — Group together pages under same path in Edited Notes](https://github.com/TriliumNext/Trilium/issues/2354)
|
||||
- [#2351 — Documentation/example for mobile frontend plugin buttons](https://github.com/TriliumNext/Trilium/issues/2351)
|
||||
- [#2330 — A note that collects all the unfinished todo items from other notes](https://github.com/TriliumNext/Trilium/issues/2330)
|
||||
- [#2303 — Note Map Live Update](https://github.com/TriliumNext/Trilium/issues/2303)
|
||||
- [#2293 — When "Including note", select which section to include based on markdown header](https://github.com/TriliumNext/Trilium/issues/2293)
|
||||
- [#2281 — If note already open in another tab, switch to it](https://github.com/TriliumNext/Trilium/issues/2281)
|
||||
- [#2261 — Start url for chrome/brave/edge "create shortcut" feature](https://github.com/TriliumNext/Trilium/issues/2261)
|
||||
- [#2259 — VIM support (embedded nvim)](https://github.com/TriliumNext/Trilium/issues/2259)
|
||||
- [#2203 — Option to not expand a subtree when opening a subnote](https://github.com/TriliumNext/Trilium/issues/2203)
|
||||
- [#2186 — today, tomorrow, yesterday search terms to link to day pages](https://github.com/TriliumNext/Trilium/issues/2186)
|
||||
- [#2185 — Make Alt+T in editor insert link to current day's page](https://github.com/TriliumNext/Trilium/issues/2185)
|
||||
- [#2181 — Change note icon for folder note with content vs without content](https://github.com/TriliumNext/Trilium/issues/2181)
|
||||
- [#2159 — jsplumb, add node groups function](https://github.com/TriliumNext/Trilium/issues/2159)
|
||||
- [#2115 — Cite reference like Zettlr (BibTeX)](https://github.com/TriliumNext/Trilium/issues/2115)
|
||||
- [#2064 — Improve the default layout of the link map](https://github.com/TriliumNext/Trilium/issues/2064)
|
||||
- [#2053 — Allow search to search for dates in different formats](https://github.com/TriliumNext/Trilium/issues/2053)
|
||||
- [#2051 — Embedding youtube/vimeo videos](https://github.com/TriliumNext/Trilium/issues/2051)
|
||||
- [#1991 — Relation Constraints](https://github.com/TriliumNext/Trilium/issues/1991)
|
||||
- [#1967 — Manually save note revision and add comment](https://github.com/TriliumNext/Trilium/issues/1967)
|
||||
- [#1958 — Bulk note creation and linking](https://github.com/TriliumNext/Trilium/issues/1958)
|
||||
- [#1950 — Attributes and searches inclusion in notes body (transclusion)](https://github.com/TriliumNext/Trilium/issues/1950)
|
||||
- [#1949 — Inheritance fine control](https://github.com/TriliumNext/Trilium/issues/1949)
|
||||
- [#1946 — Show attributes (relations) on link map](https://github.com/TriliumNext/Trilium/issues/1946)
|
||||
- [#1927 — Note Stacking for rich navigation UX](https://github.com/TriliumNext/Trilium/issues/1927)
|
||||
- [#1921 — UI improvement for dangling links](https://github.com/TriliumNext/Trilium/issues/1921)
|
||||
- [#1909 — One-way asymmetric encryption of notes](https://github.com/TriliumNext/Trilium/issues/1909)
|
||||
- [#1853 — Additional suggestions about Zotero integration](https://github.com/TriliumNext/Trilium/issues/1853)
|
||||
- [#1850 — Collapsable bullets](https://github.com/TriliumNext/Trilium/issues/1850)
|
||||
- [#1826 — Support insertDateTimeToText shortcut for labels](https://github.com/TriliumNext/Trilium/issues/1826)
|
||||
- [#1772 — Change or disable ckeditor's automatic text transformation](https://github.com/TriliumNext/Trilium/issues/1772)
|
||||
- [#1763 — Custom title for saved search results](https://github.com/TriliumNext/Trilium/issues/1763)
|
||||
|
||||
## Skipped / Unclear
|
||||
|
||||
- [#2455 — Various feature requests](https://github.com/TriliumNext/Trilium/issues/2455) — Meta-issue bundling multiple unrelated requests; only the new-tab focus portion is actionable as an easy fix (listed above), the rest (Tab navigation, keybinding collisions, scroll shortcuts) need separate issues.
|
||||
@@ -1,92 +0,0 @@
|
||||
# Batch 14 — Issues #1131–#1719
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#1712 — [UI/Low priority] Disable "Internal trilium link (Ctrl+L)" on code-block text selection](https://github.com/TriliumNext/Trilium/issues/1712)
|
||||
- **Problem**: The "Internal Trilium link" toolbar button remains enabled when text inside a code block is selected even though all other formatting buttons are disabled.
|
||||
- **Proposed solution**: In the CKEditor plugin that registers the `internallink` command (search `packages/ckeditor5*` for the command), override `refresh()` to also disable the command when the selection is inside a `codeBlock` element (use `isAllowedInSelection` / `schema.checkChild` against the selection's parent). Similar pattern is used by the built-in `link` command.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — requires locating the custom plugin but the fix is a one-line schema check
|
||||
|
||||
### [#1643 — [FEATURE] note revision preview for `Saved search` notes](https://github.com/TriliumNext/Trilium/issues/1643)
|
||||
- **Problem**: Saved search notes don't have a revision preview in the revisions dialog despite being simple JSON content.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/dialogs/revisions.*` (or wherever revision content is rendered), add a branch that renders saved-search revision content as plain JSON/text like code notes. Likely a missing `else if (type === "search")` path.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — needs code inspection to confirm the exact switch
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#1157 — Split Screen And Unlinked References](https://github.com/TriliumNext/Trilium/issues/1157)
|
||||
- **Evidence**: Split view is fully implemented. `apps/client/src/widgets/containers/split_note_container.js` exists, `link_context_menu.ts` has `openNoteInNewSplit` / `openNoteInOtherSplit`, `tree_context_menu.ts` has `openNoteInSplit`, and split-pane layout is wired into `desktop_layout.tsx` and `mobile_layout.tsx`.
|
||||
- **Verification needed**: Part 1 (split view) is done. Part 2 (unlinked references) is still an open feature request — maintainer should close as partial/duplicate of other unlinked-references requests in batch.
|
||||
|
||||
### [#1460 — [Feature request] Make use of HTML5 as audio/video embedding provider. Relies on having partial-content supported by server.](https://github.com/TriliumNext/Trilium/issues/1460)
|
||||
- **Evidence**: `apps/server/src/routes/api/files.ts` implements partial-content streaming (`range`, `start/end`, comment "Partial content request"). Client-side video/audio players exist in `apps/client/src/widgets/type_widgets/file/Video.tsx` and `MediaPlayer.tsx`.
|
||||
- **Verification needed**: Confirm video/audio notes can be seeked in the browser; if yes, close.
|
||||
|
||||
### [#1512 — Fail to define shortcut like Meta+[ or Meta+Shift+Left](https://github.com/TriliumNext/Trilium/issues/1512)
|
||||
- **Evidence**: `apps/server/src/services/keyboard_actions.ts` lines 22-33 now set Mac defaults to `CommandOrControl+[` / `CommandOrControl+]` for back/forward navigation — directly the shortcut the reporter asked for. Mac-specific branch is driven by `isMac`.
|
||||
- **Verification needed**: Confirm on Mac that `Meta+[` now binds; if yes, close.
|
||||
|
||||
### [#1544 — embedding image with url](https://github.com/TriliumNext/Trilium/issues/1544)
|
||||
- **Evidence**: `packages/ckeditor5/src/plugins.ts` lines 113-119 register `Image`, `ImageUpload`, `ImageInsert` family. CKEditor's native image insert dialog accepts URLs.
|
||||
- **Verification needed**: Test Insert Image via URL in the toolbar and close if works.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
- [#1719 — FR: Hide table edges](https://github.com/TriliumNext/Trilium/issues/1719) — CSS tweak but needs UI toggle / per-table property; not trivial without CKEditor table plugin support.
|
||||
- [#1698 — [UX] Always clone included images](https://github.com/TriliumNext/Trilium/issues/1698) — requires changing image-include semantics around clipper orphans; design question.
|
||||
- [#1573 — Copy Paste Image results in broken image links](https://github.com/TriliumNext/Trilium/issues/1573) — clipboard image handling in CKEditor, needs investigation.
|
||||
- [#1572 — Could locations of cloned notes appear in global search?](https://github.com/TriliumNext/Trilium/issues/1572) — search result display question; may already work, needs repro.
|
||||
- [#1578 — Feature Request - Implement restore backup function](https://github.com/TriliumNext/Trilium/issues/1578) — would require new UI + migration path; confirmed no `restoreBackup` in `apps/server/src/services/backup.ts`.
|
||||
- [#1577 — Client certificates?](https://github.com/TriliumNext/Trilium/issues/1577) — TLS mTLS support, infra-level change.
|
||||
- [#1503 — Web Clipper "searching" often](https://github.com/TriliumNext/Trilium/issues/1503) — clipper discovery/heartbeat bug in `apps/web-clipper`, needs repro.
|
||||
- [#1449 — Clipped a web page with YouTube linked videos - they auto-play!](https://github.com/TriliumNext/Trilium/issues/1449) — HTML sanitization of imported iframes needs `?autoplay=0` stripping.
|
||||
- [#1444 — Content Security Policy directive: "img-src 'self' data:"](https://github.com/TriliumNext/Trilium/issues/1444) — CSP misconfiguration breaking external images in clipped pages.
|
||||
- [#1442 — Copy paste from rich text to plain text does not retain indents](https://github.com/TriliumNext/Trilium/issues/1442) — CKEditor clipboard converter for code/plain targets.
|
||||
- [#1423 — [Crash] Importing a big file](https://github.com/TriliumNext/Trilium/issues/1423) — memory/streaming issue in import, deep fix.
|
||||
- [#1357 — Inserting a space after a math expression deletes it](https://github.com/TriliumNext/Trilium/issues/1357) — CKEditor math plugin (`packages/ckeditor5-math`) bug.
|
||||
- [#1324 — Import of Joplin documents](https://github.com/TriliumNext/Trilium/issues/1324) — no Joplin importer exists; would need new format support.
|
||||
- [#1298 — Exact search result is placed way too low in results](https://github.com/TriliumNext/Trilium/issues/1298) — jump-to-note scoring needs an exact-match boost.
|
||||
- [#1284 — Picky details of new Attributes field](https://github.com/TriliumNext/Trilium/issues/1284) — multi-item autocomplete/UX polish needing rework.
|
||||
- [#1166 — Context menu is not usable with keyboard](https://github.com/TriliumNext/Trilium/issues/1166) — needs full keyboard navigation for custom Preact context menu.
|
||||
- [#1131 — Alt + <x> keyboard shortcuts with active editor](https://github.com/TriliumNext/Trilium/issues/1131) — CKEditor swallows Alt+char for menu access; hard to override cleanly.
|
||||
|
||||
## Feature Requests
|
||||
- [#1716 — Generating citation from note attributes](https://github.com/TriliumNext/Trilium/issues/1716)
|
||||
- [#1715 — Page up/down in note selection dialogs (Jump to note, ..)](https://github.com/TriliumNext/Trilium/issues/1715)
|
||||
- [#1704 — [FEATURE REQUEST] Block reference / content embedding (Roam-style)](https://github.com/TriliumNext/Trilium/issues/1704)
|
||||
- [#1697 — Populate hyperlinked md file from a table](https://github.com/TriliumNext/Trilium/issues/1697)
|
||||
- [#1693 — [FEATURE] Copy/Paste Table As/From CSV](https://github.com/TriliumNext/Trilium/issues/1693)
|
||||
- [#1668 — [UX FEATURE] `Search` autocompletion for labels](https://github.com/TriliumNext/Trilium/issues/1668)
|
||||
- [#1654 — [IMPROVEMENT] Contextual `Similar notes` algorithm based on search string](https://github.com/TriliumNext/Trilium/issues/1654)
|
||||
- [#1652 — [FEATURE] `saved search` preview with number of results](https://github.com/TriliumNext/Trilium/issues/1652)
|
||||
- [#1650 — [FEATURE] Copy notes from tree and paste into relation map](https://github.com/TriliumNext/Trilium/issues/1650)
|
||||
- [#1625 — Add custom MIME types for code notes](https://github.com/TriliumNext/Trilium/issues/1625)
|
||||
- [#1623 — [UX] Remember default box size for included notes](https://github.com/TriliumNext/Trilium/issues/1623)
|
||||
- [#1589 — Setting to reduce logging only to errors?](https://github.com/TriliumNext/Trilium/issues/1589)
|
||||
- [#1585 — Default import options for drag and drop](https://github.com/TriliumNext/Trilium/issues/1585)
|
||||
- [#1567 — Proof import before importing, remove special chars](https://github.com/TriliumNext/Trilium/issues/1567)
|
||||
- [#1554 — image alt text in markdown export](https://github.com/TriliumNext/Trilium/issues/1554)
|
||||
- [#1526 — Set a shortcut to open the link in a new window](https://github.com/TriliumNext/Trilium/issues/1526)
|
||||
- [#1514 — FR: Get the link to the note from the desktop apps](https://github.com/TriliumNext/Trilium/issues/1514)
|
||||
- [#1507 — "save & reset" link map arrangement & zoom level](https://github.com/TriliumNext/Trilium/issues/1507)
|
||||
- [#1479 — [Apache proxy setup] Some notes on installation sequence](https://github.com/TriliumNext/Trilium/issues/1479)
|
||||
- [#1426 — request: unlinked references](https://github.com/TriliumNext/Trilium/issues/1426)
|
||||
- [#1386 — [Feature Request] Zotero integration](https://github.com/TriliumNext/Trilium/issues/1386)
|
||||
- [#1288 — please provide the way to save picture of linkmap](https://github.com/TriliumNext/Trilium/issues/1288)
|
||||
- [#1280 — Enabling custom CKEditor plugins?](https://github.com/TriliumNext/Trilium/issues/1280)
|
||||
- [#1269 — Customize note title shown in tree](https://github.com/TriliumNext/Trilium/issues/1269)
|
||||
- [#1267 — Make INSERT NOTE optional / configurable default type](https://github.com/TriliumNext/Trilium/issues/1267)
|
||||
- [#1266 — Suggestion for Recent Changes (split into changed/deleted)](https://github.com/TriliumNext/Trilium/issues/1266)
|
||||
- [#1233 — Block Reference and transclude function](https://github.com/TriliumNext/Trilium/issues/1233)
|
||||
- [#1209 — Clipper for PDF files](https://github.com/TriliumNext/Trilium/issues/1209)
|
||||
- [#1206 — Jump back to last edit](https://github.com/TriliumNext/Trilium/issues/1206)
|
||||
- [#1193 — Sort results in Jump to note by frequency of use](https://github.com/TriliumNext/Trilium/issues/1193)
|
||||
- [#1181 — Make tabs keep the scroll on the tree left panel](https://github.com/TriliumNext/Trilium/issues/1181)
|
||||
- [#1170 — Disable note editing in mobile front end](https://github.com/TriliumNext/Trilium/issues/1170)
|
||||
- [#1148 — include relation maps content in search results](https://github.com/TriliumNext/Trilium/issues/1148)
|
||||
- [#1144 — Option to auto expand book nodes](https://github.com/TriliumNext/Trilium/issues/1144)
|
||||
- [#1142 — enhance link map (TheBrain-style)](https://github.com/TriliumNext/Trilium/issues/1142)
|
||||
|
||||
## Skipped / Unclear
|
||||
(none — all issues classified)
|
||||
@@ -1,92 +0,0 @@
|
||||
# Batch 15 — Issues #21–#1123
|
||||
|
||||
## Easy-Fix Candidates
|
||||
|
||||
### [#762 — [UX] Print paths with colored '/' separators](https://github.com/TriliumNext/Trilium/issues/762)
|
||||
- **Problem**: When a note title contains `/`, the note-path breadcrumbs become ambiguous; a visually distinct separator would disambiguate.
|
||||
- **Proposed solution**: In the path-rendering code (search `apps/client/src/services/tree.ts` / `apps/client/src/widgets/note_tree.ts` for `getNotePath` / `/` concatenation, and `apps/client/src/widgets/note_path_list_widget.*`), wrap the separator in `<span class="note-path-separator">/</span>` and add a subtle color/bold rule in the corresponding CSS. Purely a rendering tweak.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — straightforward once the exact render site is located.
|
||||
|
||||
### [#342 — Warn if user is trying to run the script in a wrong environment](https://github.com/TriliumNext/Trilium/issues/342)
|
||||
- **Problem**: When a frontend script is invoked on the backend (or vice versa) it silently fails; the user gets no helpful message.
|
||||
- **Proposed solution**: In `apps/server/src/services/script.ts` (backend execution) check `note.mime` / `note.getLabelValue("runOnBackend")` against the caller context and throw a descriptive error; mirror in `apps/client/src/services/script_context.ts` for frontend. Single `if` with a clear error message per side.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — the two script runners exist, just need a type guard + thrown error.
|
||||
|
||||
### [#21 — Script execution should error out on usage of protected notes outside of protected session](https://github.com/TriliumNext/Trilium/issues/21)
|
||||
- **Problem**: Scripts silently fail in unpredictable ways when they access protected notes without a protected session.
|
||||
- **Proposed solution**: In `apps/server/src/services/script.ts` (and `script_context.ts`), before invoking the script check `note.isProtected && !protectedSessionService.isProtectedSessionAvailable()` and throw a clear error (e.g. "Cannot run protected script without a protected session"). No such guard currently exists per `grep` on the script services.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high — isolated pre-check in one place.
|
||||
|
||||
## Likely Already Fixed
|
||||
|
||||
### [#1102 — Spellchecker is overly sensitive](https://github.com/TriliumNext/Trilium/issues/1102)
|
||||
- **Evidence**: Items (1) and (2) were rejected upstream (Electron/Blink limitation). Item (3) (runtime toggle shortcut) is still not supported — `apps/server/src/services/window.ts` reads `spellCheckEnabled` only at window creation, and no `toggleSpellCheck` shortcut exists in `keyboard_actions.ts`. However the original items 1 & 2 are effectively closed as "won't fix".
|
||||
- **Verification needed**: Close items 1-2 as won't-fix (Electron limitation); split out item 3 as a separate feature request if still wanted.
|
||||
|
||||
### [#1080 — Cell properties panel invisible when table cell content too large](https://github.com/TriliumNext/Trilium/issues/1080)
|
||||
- **Evidence**: Filed against Trilium 0.42.6 with CKEditor from that era. CKEditor5 has been upgraded many major versions since; table cell properties panel positioning is handled by upstream CKEditor. No custom override exists in `packages/ckeditor5/`.
|
||||
- **Verification needed**: Reproduce with current build — paste a huge text block into a table cell and try to open cell properties; if panel is visible, close.
|
||||
|
||||
### [#924 — Text following innerlink becomes part of the link after switching pages](https://github.com/TriliumNext/Trilium/issues/924)
|
||||
- **Evidence**: Reported against 0.40.6 — a CKEditor link-range bug from that era. CKEditor has been upgraded many versions; no custom link-range fix exists in `packages/ckeditor5/`. No commits touching "innerlink" in `git log`.
|
||||
- **Verification needed**: Reproduce: insert a Ctrl+L link, type text after it, switch notes and back; if the trailing text is no longer absorbed into the link, close.
|
||||
|
||||
### [#936 — unable to clip some pages](https://github.com/TriliumNext/Trilium/issues/936)
|
||||
- **Evidence**: 0.40-era web clipper timeout on a large GitHub markdown page. Clipper and server code have been rewritten since (`apps/web-clipper/`, clipping endpoint in `apps/server/src/routes/api/clipper.ts`).
|
||||
- **Verification needed**: Re-try clipping `https://github.com/learnbyexample/learn_gnuawk/blob/master/gnu_awk.md` with current clipper; if successful, close.
|
||||
|
||||
### [#75 — add standard attribute value autocomplete](https://github.com/TriliumNext/Trilium/issues/75)
|
||||
- **Evidence**: `apps/client/src/services/attribute_autocomplete.ts` exports `initLabelValueAutocomplete`, which calls `attribute-values/<name>` server endpoint and populates autocomplete suggestions. Wired up in `attribute_detail.ts` and `PromotedAttributes.tsx`. Exactly what was asked for.
|
||||
- **Verification needed**: None — can be closed as done.
|
||||
|
||||
### [#649 — Open/focus a note from command line / desktop URL handler (Trilium URL protocol)](https://github.com/TriliumNext/Trilium/issues/649)
|
||||
- **Evidence**: PR #9248 ("Add URL protocol support for trilium://") is referenced as submitted for this IssueHunt. No `trilium://` handler or `setAsDefaultProtocolClient` currently in the codebase (so PR is still open).
|
||||
- **Verification needed**: Track PR #9248 — once merged, close this issue.
|
||||
|
||||
## Notable Non-Easy Issues
|
||||
- [#1123 — Read-only view for tree section or "edit/view mode" for entire app](https://github.com/TriliumNext/Trilium/issues/1123) — overlaps with ongoing read-only-instance work; needs UX design.
|
||||
- [#1054 — Enhancement: Fetch link metadata](https://github.com/TriliumNext/Trilium/issues/1054) — requires backend metascraper service + CKEditor plugin + offline asset handling.
|
||||
- [#1045 — [wish] personal/custom list of synonyms](https://github.com/TriliumNext/Trilium/issues/1045) — active design discussion about equivalence classes / note variants; non-trivial search pipeline change.
|
||||
- [#1039 — enhance require](https://github.com/TriliumNext/Trilium/issues/1039) — body covers keyboard navigation + title-from-selection + link-map filtering; three separate UX changes.
|
||||
- [#1021 — Link to Note Block](https://github.com/TriliumNext/Trilium/issues/1021) — sub-note paragraph anchoring needs new ID model + CKEditor support.
|
||||
- [#1015 — Interwiki-style links to file-based files](https://github.com/TriliumNext/Trilium/issues/1015) — new link-resolver abstraction needed.
|
||||
- [#989 — Link tagging w/ tree structure (cloning as tagging)](https://github.com/TriliumNext/Trilium/issues/989) — semantic/architectural discussion about cloning vs. attributes.
|
||||
- [#952 — Searching Relation Attribute Values as Text](https://github.com/TriliumNext/Trilium/issues/952) — search parser change to resolve related-note title to ID; non-trivial syntax work.
|
||||
- [#927 — Option to move selected text to child note](https://github.com/TriliumNext/Trilium/issues/927) — already partially supported ("Cut selection to sub-note"); needs UX refinement.
|
||||
- [#868 — Global search: retain text + highlight results](https://github.com/TriliumNext/Trilium/issues/868) — search UX rework, needs in-note scroll/highlight integration.
|
||||
- [#760 — tag system suggest](https://github.com/TriliumNext/Trilium/issues/760) — tag suggestion UI with co-occurrence ranking; substantial new feature.
|
||||
- [#616 — Undo for Subtree Operations](https://github.com/TriliumNext/Trilium/issues/616) — requires operation log / undo stack; deep architectural change.
|
||||
- [#527 — [Feature Request] Side Comments](https://github.com/TriliumNext/Trilium/issues/527) — non-exported meta text; needs new CKEditor plugin + export filter.
|
||||
- [#518 — Sorting protected notes](https://github.com/TriliumNext/Trilium/issues/518) — `sortKey`/`sortIndex` attributes not yet implemented; affects tree sorting pipeline.
|
||||
- [#507 — MtoN relation in relation map](https://github.com/TriliumNext/Trilium/issues/507) — relation map rendering change; needs bulk-relation UI.
|
||||
- [#449 — api.addMenuItem](https://github.com/TriliumNext/Trilium/issues/449) — API surface extension for scripting; needs menu registration hook.
|
||||
- [#393 — Upgrade option (preserve DB on update)](https://github.com/TriliumNext/Trilium/issues/393) — in-place updater; platform-specific installer work.
|
||||
- [#228 — Visually differentiate links from relations in relation map](https://github.com/TriliumNext/Trilium/issues/228) — relation map rendering tweak, but needs distinct styling decisions.
|
||||
- [#39 — Implement attribute autocomplete in search input](https://github.com/TriliumNext/Trilium/issues/39) — confirmed not wired into any search widget; needs search-input integration.
|
||||
|
||||
## Feature Requests
|
||||
- [#1046 — [wish] Global shortcut](https://github.com/TriliumNext/Trilium/issues/1046)
|
||||
- [#1026 — Show Trilium content related to my web searches](https://github.com/TriliumNext/Trilium/issues/1026)
|
||||
- [#991 — Link to a blank note (pure backlink-only notes)](https://github.com/TriliumNext/Trilium/issues/991)
|
||||
- [#986 — Community Code Library / Plugin System](https://github.com/TriliumNext/Trilium/issues/986)
|
||||
- [#983 — Custom Local Save location and Hide Child Notes for Attachments](https://github.com/TriliumNext/Trilium/issues/983)
|
||||
- [#970 — Use double click to get to the child note](https://github.com/TriliumNext/Trilium/issues/970)
|
||||
- [#926 — Option to not expand parent note when note is made its child](https://github.com/TriliumNext/Trilium/issues/926)
|
||||
- [#825 — Link preview](https://github.com/TriliumNext/Trilium/issues/825)
|
||||
- [#814 — Ability to add a tag to a page when clipping](https://github.com/TriliumNext/Trilium/issues/814)
|
||||
- [#802 — Clip url with description](https://github.com/TriliumNext/Trilium/issues/802)
|
||||
- [#728 — FR: Export search results](https://github.com/TriliumNext/Trilium/issues/728)
|
||||
- [#673 — [Feature Request] External Resource Notes](https://github.com/TriliumNext/Trilium/issues/673)
|
||||
- [#672 — [Feature request] Error Tracking](https://github.com/TriliumNext/Trilium/issues/672)
|
||||
- [#641 — npm install additional libraries](https://github.com/TriliumNext/Trilium/issues/641)
|
||||
- [#409 — AppImage for Linux](https://github.com/TriliumNext/Trilium/issues/409)
|
||||
- [#352 — Feature Request: Restore Demo Content](https://github.com/TriliumNext/Trilium/issues/352)
|
||||
- [#242 — CalDAV Support](https://github.com/TriliumNext/Trilium/issues/242)
|
||||
- [#212 — Tooltip for an attachment can display basic info (original name, mime) and download/open buttons](https://github.com/TriliumNext/Trilium/issues/212)
|
||||
- [#139 — Label listing can be clickable and lead to search of given label](https://github.com/TriliumNext/Trilium/issues/139)
|
||||
|
||||
## Skipped / Unclear
|
||||
_(none — all issues classified above)_
|
||||
@@ -1,604 +0,0 @@
|
||||
# Likely Duplicate / Related Issue Clusters
|
||||
|
||||
Clusters below were identified by semantic analysis of issue titles + body excerpts. **These are candidates, not confirmed duplicates** — a maintainer should review each cluster and decide whether to consolidate (keep the oldest well-described one, close the rest with a reference).
|
||||
|
||||
**Summary:** 52 clusters covering 146 open issues across the TriliumNext/Trilium repository. The clusters span every major subsystem: sync, search, share/publish, canvas/excalidraw, mermaid/relation-map/note-map, web-clipper, OIDC/auth, templates, calendar/journal, table view, tree/tab UX, CKEditor autoformat, PDF, import/export, and mobile.
|
||||
|
||||
## Cluster Format
|
||||
- Lead issue (oldest or most-detailed) goes first
|
||||
- Followups are listed under it with one-line justification
|
||||
- Confidence: `high` = essentially the same problem, `medium` = related/overlapping, `low` = worth checking
|
||||
|
||||
---
|
||||
|
||||
## Cluster 1: Protected notes accessible/visible outside of protected session (confidence: high)
|
||||
- [#21 — Script execution should error out on usage of protected notes outside of protected session](https://github.com/TriliumNext/Trilium/issues/21) — lead
|
||||
- [#4051 — (Bug report) Protected notes visible in Edited Notes](https://github.com/TriliumNext/Trilium/issues/4051) — protected content leaks to Edited Notes list
|
||||
- [#5442 — Protected notes not protected from: deletion, attribute visibility](https://github.com/TriliumNext/Trilium/issues/5442) — can delete/clone/move protected notes without session
|
||||
- [#6177 — A protected note can be moved, deleted etc. even in unprotected mode](https://github.com/TriliumNext/Trilium/issues/6177) — same "protected outside session" defect
|
||||
- [#6993 — Protected notes can be read back from the database file](https://github.com/TriliumNext/Trilium/issues/6993) — related leak via historical unencrypted state
|
||||
- [#9229 — Protected note contents get rendered whenever it has child notes](https://github.com/TriliumNext/Trilium/issues/9229) — protected content rendered before unlock
|
||||
- [#8660 — Protected notes, dateModified, and misleading UI](https://github.com/TriliumNext/Trilium/issues/8660) — protected session changes dateModified for all protected notes
|
||||
|
||||
## Cluster 2: OIDC / OpenID auth problems (confidence: high)
|
||||
- [#5606 — OpenID Connect support](https://github.com/TriliumNext/Trilium/issues/5606) — original ask
|
||||
- [#4936 — Sync to server behind OIDC & Reverse Proxy](https://github.com/TriliumNext/Trilium/issues/4936) — OIDC + reverse proxy combo breaks
|
||||
- [#5857 — "invalid user" when setting up OIDC auth](https://github.com/TriliumNext/Trilium/issues/5857) — OIDC callback fails with "invalid user"
|
||||
- [#6387 — Current OpenID Connect Implementation is not compatible with Authelia](https://github.com/TriliumNext/Trilium/issues/6387) — Authelia interop issue
|
||||
- [#7127 — OpenID auto redirect](https://github.com/TriliumNext/Trilium/issues/7127) — auto-redirect UX request
|
||||
- [#7250 — oidc credentials are not checked for](https://github.com/TriliumNext/Trilium/issues/7250) — no user validation on OIDC login
|
||||
- [#7794 — OIDC Login requires multiple logins](https://github.com/TriliumNext/Trilium/issues/7794) — repeated login loop
|
||||
- [#8606 — Implement Authorization on OpenID](https://github.com/TriliumNext/Trilium/issues/8606) — OIDC has auth-z gap
|
||||
- [#8658 — OIDC groups claims for access control](https://github.com/TriliumNext/Trilium/issues/8658) — group-based access control
|
||||
|
||||
## Cluster 3: Web Clipper authentication/setup failures (confidence: high)
|
||||
- [#9286 — Web Clipper authentication fails when TOTP is enabled](https://github.com/TriliumNext/Trilium/issues/9286)
|
||||
- [#9330 — Web clipper setup fails with trailing / in server setup](https://github.com/TriliumNext/Trilium/issues/9330) — lead: trailing slash breaks Firefox extension setup
|
||||
- [#8045 — Mac Client setup doesn't support trailing slash](https://github.com/TriliumNext/Trilium/issues/8045) — same trailing-slash setup bug in desktop client
|
||||
- [#8904 — WebClipper: Save whole page does nothing](https://github.com/TriliumNext/Trilium/issues/8904) — clipper broken
|
||||
- [#3834 — chrome extention Trilium Web Clipper save whole page can not show in trillium note](https://github.com/TriliumNext/Trilium/issues/3834) — save whole page broken (older)
|
||||
- [#8663 — Web Clipper for ChatGPT](https://github.com/TriliumNext/Trilium/issues/8663) — whole-page capture for ChatGPT fails (same "save whole page" class)
|
||||
- [#1503 — Web Clipper "searching" often](https://github.com/TriliumNext/Trilium/issues/1503) — clipper discovery/setup issue
|
||||
|
||||
## Cluster 4: Reverse proxy / sub-path serving breaks sharing and setup (confidence: high)
|
||||
- [#8790 — some assets not work in share notes when serving under a different path](https://github.com/TriliumNext/Trilium/issues/8790)
|
||||
- [#8791 — Copy share link not work when Serving under a different path](https://github.com/TriliumNext/Trilium/issues/8791)
|
||||
- [#4702 — "Add to homescreen" on Android sets wrong url if Trilium is run in sub-directory via reverse proxy](https://github.com/TriliumNext/Trilium/issues/4702)
|
||||
- [#4905 — shareCredentials tag does not work with reverse proxy server](https://github.com/TriliumNext/Trilium/issues/4905)
|
||||
- [#4880 — Shared link show Address from Sync Server](https://github.com/TriliumNext/Trilium/issues/4880) — same class of URL-computation bug behind proxy
|
||||
- [#8979 — PDF - 403 Forbidden behind NGINX Proxy Manager](https://github.com/TriliumNext/Trilium/issues/8979) — reverse proxy breaks PDF viewer
|
||||
|
||||
## Cluster 5: Sync recovery/data-loss on multi-device setups (confidence: medium)
|
||||
- [#9247 — A large number of recovered notes appear after synchronization](https://github.com/TriliumNext/Trilium/issues/9247)
|
||||
- [#4887 — Normal notes are recovered wrongly after syncing with other devices](https://github.com/TriliumNext/Trilium/issues/4887)
|
||||
- [#3626 — Trilium sync from clients to server fails for a specific daily journal note](https://github.com/TriliumNext/Trilium/issues/3626)
|
||||
- [#4762 — ERROR when syncing deleted notes](https://github.com/TriliumNext/Trilium/issues/4762)
|
||||
- [#2290 — Failed to deserialize sync response: Option "documentSecret" doesn't exist](https://github.com/TriliumNext/Trilium/issues/2290)
|
||||
- [#4389 — Found Error when I Sync data from docker trilium 61.12 to windows PC 61.12](https://github.com/TriliumNext/Trilium/issues/4389)
|
||||
- [#6989 — New client sync issues](https://github.com/TriliumNext/Trilium/issues/6989) — stuck on initial sync / recovered state
|
||||
- [#2549 — Random notes lose their content, old revs. still available](https://github.com/TriliumNext/Trilium/issues/2549) — silent data loss suspected linked to sync
|
||||
|
||||
## Cluster 6: Sync TLS / self-signed / handshake failures (confidence: high)
|
||||
- [#2060 — trilium-server will not sync with trilium-desktop over TLS; ERR_CERT_AUTHORITY_INVALID](https://github.com/TriliumNext/Trilium/issues/2060) — lead
|
||||
- [#3353 — Support extra CA certs](https://github.com/TriliumNext/Trilium/issues/3353) — same root cause: can't trust custom CAs for sync
|
||||
- [#4888 — Sync server handshake failed, "<!DOCTYPE "... is not valid JSON](https://github.com/TriliumNext/Trilium/issues/4888) — sync handshake JSON parse failure
|
||||
- [#7692 — Windows shortcut arguments are removed](https://github.com/TriliumNext/Trilium/issues/7692) — user uses `--ignore-certificate-errors` as a workaround
|
||||
|
||||
## Cluster 7: Initial sync hangs / large-DB sync blocks UI (confidence: high)
|
||||
- [#5315 — desktop app initial sync never stops](https://github.com/TriliumNext/Trilium/issues/5315)
|
||||
- [#5380 — Make Initial Sync timeout value configurable](https://github.com/TriliumNext/Trilium/issues/5380)
|
||||
- [#5550 — Sync errors may hang the initial setup](https://github.com/TriliumNext/Trilium/issues/5550)
|
||||
- [#6129 — JavaScript heap out of memory on Initial Sync with Server](https://github.com/TriliumNext/Trilium/issues/6129)
|
||||
- [#7225 — Trilium Sync Blocks UI During Content Hashing for Large Knowledge Graphs](https://github.com/TriliumNext/Trilium/issues/7225)
|
||||
- [#8991 — Note jumps to the top (scroll position lost) during background sync](https://github.com/TriliumNext/Trilium/issues/8991) — related: background sync clobbers UI
|
||||
- [#3600 — sync lag](https://github.com/TriliumNext/Trilium/issues/3600)
|
||||
- [#2050 — content with lot of pdf attachments not sync between multi-client and server](https://github.com/TriliumNext/Trilium/issues/2050)
|
||||
|
||||
## Cluster 8: Fuzzy / quick search problems, archived notes leaking in (confidence: high)
|
||||
- [#7085 — [regression] Archived notes are listed in note search/quick search](https://github.com/TriliumNext/Trilium/issues/7085)
|
||||
- [#8360 — Disable fuzzy search in copy/clone](https://github.com/TriliumNext/Trilium/issues/8360)
|
||||
- [#9009 — Option to easily toggle the fuzzy search on/off](https://github.com/TriliumNext/Trilium/issues/9009)
|
||||
- [#8850 — Search does not work for some attributes: #clipType=note](https://github.com/TriliumNext/Trilium/issues/8850) — fuzzy/new-search broke exact attribute
|
||||
- [#6808 — Search function slow since 0.98.0](https://github.com/TriliumNext/Trilium/issues/6808) — new search UX regressed perf
|
||||
- [#3516 — Hidden notes appear in search results](https://github.com/TriliumNext/Trilium/issues/3516)
|
||||
- [#4584 — Hide hidden notes from `similar notes` view](https://github.com/TriliumNext/Trilium/issues/4584)
|
||||
- [#7662 — Full search only showing promoted attributes and attributes are missing highlighting](https://github.com/TriliumNext/Trilium/issues/7662)
|
||||
- [#8060 — Canvas notes with empty or missing elements cause quick search to crash](https://github.com/TriliumNext/Trilium/issues/8060)
|
||||
|
||||
## Cluster 9: Search enhancements / ranking / FTS (confidence: medium)
|
||||
- [#4606 — Implement Full-Text Search Using SQLite's FTS Extension for Better Relevance Sorting](https://github.com/TriliumNext/Trilium/issues/4606)
|
||||
- [#6991 — Search: Add Search Ranking Customizability](https://github.com/TriliumNext/Trilium/issues/6991)
|
||||
- [#5667 — Better search with search excerpts?](https://github.com/TriliumNext/Trilium/issues/5667)
|
||||
- [#5332 — Improve search result highlighting](https://github.com/TriliumNext/Trilium/issues/5332)
|
||||
- [#5585 — Search Prefix](https://github.com/TriliumNext/Trilium/issues/5585)
|
||||
- [#3498 — More signals for search & autocomplete ranking](https://github.com/TriliumNext/Trilium/issues/3498)
|
||||
- [#1193 — Sort results in Jump to note by frequency of use?](https://github.com/TriliumNext/Trilium/issues/1193)
|
||||
- [#1298 — Exact search result is placed way too low in results](https://github.com/TriliumNext/Trilium/issues/1298)
|
||||
- [#2404 — Could Full-Text Search results lists like google search results?](https://github.com/TriliumNext/Trilium/issues/2404)
|
||||
- [#6225 — Settings for displaying search results](https://github.com/TriliumNext/Trilium/issues/6225)
|
||||
- [#5671 — Option to search entire database when a note is hoisted](https://github.com/TriliumNext/Trilium/issues/5671)
|
||||
|
||||
## Cluster 10: Search: find-and-replace / regex / cross-note replace (confidence: high)
|
||||
- [#2989 — Can make "Find and Replace" allow Regular Expression?](https://github.com/TriliumNext/Trilium/issues/2989)
|
||||
- [#3426 — search and replace](https://github.com/TriliumNext/Trilium/issues/3426)
|
||||
- [#3494 — Value replace in bulk action](https://github.com/TriliumNext/Trilium/issues/3494)
|
||||
|
||||
## Cluster 11: Search history / saved search UX (confidence: medium)
|
||||
- [#6730 — Clear or disable search history](https://github.com/TriliumNext/Trilium/issues/6730)
|
||||
- [#8281 — Search history](https://github.com/TriliumNext/Trilium/issues/8281)
|
||||
- [#5658 — Saved Search Auto Search on Note Open](https://github.com/TriliumNext/Trilium/issues/5658)
|
||||
- [#1643 — note revision preview for `Saved search` notes](https://github.com/TriliumNext/Trilium/issues/1643)
|
||||
- [#1652 — `saved search` preview with number of results](https://github.com/TriliumNext/Trilium/issues/1652)
|
||||
|
||||
## Cluster 12: Import / export of calendar (.ics) (confidence: high)
|
||||
- [#5640 — Support for importing ICS (iCalendar) file](https://github.com/TriliumNext/Trilium/issues/5640) — lead
|
||||
- [#8588 — Import .ics Calendar Support (Local File & URL)](https://github.com/TriliumNext/Trilium/issues/8588) — essentially the same ask
|
||||
|
||||
## Cluster 13: Calendar / journal / day note edge cases (confidence: medium)
|
||||
- [#8576 — Calendar created new date of new month on last month](https://github.com/TriliumNext/Trilium/issues/8576)
|
||||
- [#7263 — Trilium randomly jumps to Today Date](https://github.com/TriliumNext/Trilium/issues/7263)
|
||||
- [#7683 — Calendar Note Doesn't Respect #titleTemplate](https://github.com/TriliumNext/Trilium/issues/7683)
|
||||
- [#7944 — Calendar - Displaying deep child notes](https://github.com/TriliumNext/Trilium/issues/7944)
|
||||
- [#6204 — Presence of #workspaceCalendarRoot affects how notes are displayed](https://github.com/TriliumNext/Trilium/issues/6204)
|
||||
- [#5553 — Launcher: add keyboard navigation for Calendar](https://github.com/TriliumNext/Trilium/issues/5553)
|
||||
- [#8098 — Make clicking a month name in Year view open that month's view](https://github.com/TriliumNext/Trilium/issues/8098)
|
||||
- [#7646 — Add a setting to switch to 24-hours clock](https://github.com/TriliumNext/Trilium/issues/7646)
|
||||
- [#7113 — Use dateTime attribute for calendar child notes](https://github.com/TriliumNext/Trilium/issues/7113)
|
||||
|
||||
## Cluster 14: Today/yesterday quick-linking in editor (confidence: high)
|
||||
- [#2185 — Make Alt+T in editor insert link to current day's page](https://github.com/TriliumNext/Trilium/issues/2185)
|
||||
- [#2186 — today, tomorrow, yesterday, ... search terms to link to appropriate day pages](https://github.com/TriliumNext/Trilium/issues/2186)
|
||||
- [#3720 — Clone to today](https://github.com/TriliumNext/Trilium/issues/3720)
|
||||
|
||||
## Cluster 15: Excalidraw / Canvas drawing bugs and perf (confidence: high)
|
||||
- [#9345 — Significant input lag and UI freezing during continuous drawing/writing](https://github.com/TriliumNext/Trilium/issues/9345)
|
||||
- [#9230 — Excalidraw seems to update at a slower rate after entering Zen mode](https://github.com/TriliumNext/Trilium/issues/9230)
|
||||
- [#5539 — absurdly thick stroke width in Canvas note type](https://github.com/TriliumNext/Trilium/issues/5539)
|
||||
- [#7148 — CTRL Z with two Canvas notes will delete previous Drawing](https://github.com/TriliumNext/Trilium/issues/7148)
|
||||
- [#6447 — Canvas notes sometimes fail to render](https://github.com/TriliumNext/Trilium/issues/6447)
|
||||
- [#8462 — canvas cannot display, even it is not empty](https://github.com/TriliumNext/Trilium/issues/8462)
|
||||
- [#5565 — Writing does not work correctly (Excalidraw after type change)](https://github.com/TriliumNext/Trilium/issues/5565)
|
||||
- [#3395 — Reloading while editing a text field in a canvas note causes the text field to become permanently invisible](https://github.com/TriliumNext/Trilium/issues/3395)
|
||||
- [#4666 — Excalidraw changes fonts](https://github.com/TriliumNext/Trilium/issues/4666)
|
||||
|
||||
## Cluster 16: Canvas zoom / pan / drag UX (confidence: high)
|
||||
- [#9353 — Add way to zoom with a pen tablet to canvas notes](https://github.com/TriliumNext/Trilium/issues/9353)
|
||||
- [#7182 — Drag notes from tree to Canvas](https://github.com/TriliumNext/Trilium/issues/7182)
|
||||
- [#6928 — excalidraw element link can not jump to the right file](https://github.com/TriliumNext/Trilium/issues/6928)
|
||||
- [#7274 — Insert internal links to notes in the canvas and mind map](https://github.com/TriliumNext/Trilium/issues/7274)
|
||||
- [#2960 — Internal links in Canvas](https://github.com/TriliumNext/Trilium/issues/2960)
|
||||
- [#3905 — add central excalidraw library for all canvas notes](https://github.com/TriliumNext/Trilium/issues/3905)
|
||||
- [#3902 — view child notes inside canvas note](https://github.com/TriliumNext/Trilium/issues/3902)
|
||||
- [#4834 — Import PDF files into Canvas notes](https://github.com/TriliumNext/Trilium/issues/4834)
|
||||
|
||||
## Cluster 17: Mermaid rendering, interactions, and linking (confidence: high)
|
||||
- [#8459 — Mermaid split view renderer incorrect](https://github.com/TriliumNext/Trilium/issues/8459)
|
||||
- [#5611 — Mermaid bugs can crash the frontend](https://github.com/TriliumNext/Trilium/issues/5611)
|
||||
- [#4064 — Hovering over link inside mermaid diagram causes flicker](https://github.com/TriliumNext/Trilium/issues/4064)
|
||||
- [#3335 — Use mouse wheel to scroll up/down, instead of zoom in/out in mermaid notes](https://github.com/TriliumNext/Trilium/issues/3335)
|
||||
- [#5201 — Disable text selection in mermaid diagrams?](https://github.com/TriliumNext/Trilium/issues/5201)
|
||||
- [#4002 — Internal link inside mermaid diagram](https://github.com/TriliumNext/Trilium/issues/4002)
|
||||
- [#5195 — internal links to notes in Mermaid Diagrams](https://github.com/TriliumNext/Trilium/issues/5195)
|
||||
- [#2363 — Better support for linking notes from Mermaid diagrams](https://github.com/TriliumNext/Trilium/issues/2363)
|
||||
- [#5268 — Register icon pack in mermaid](https://github.com/TriliumNext/Trilium/issues/5268)
|
||||
- [#7931 — Inline Mermaid Diagram Display](https://github.com/TriliumNext/Trilium/issues/7931)
|
||||
|
||||
## Cluster 18: Relation map UX (confidence: high)
|
||||
- [#8676 — When adding a connection in the relation map note, Chinese input error](https://github.com/TriliumNext/Trilium/issues/8676)
|
||||
- [#6926 — Nodes and edges in relation map view in random positions when starting up the app](https://github.com/TriliumNext/Trilium/issues/6926)
|
||||
- [#6929 — Partially typed name being used as relation](https://github.com/TriliumNext/Trilium/issues/6929)
|
||||
- [#7389 — Child Note Node not placeable on Relation Note](https://github.com/TriliumNext/Trilium/issues/7389)
|
||||
- [#3266 — Automatic layout on relation maps](https://github.com/TriliumNext/Trilium/issues/3266)
|
||||
- [#3267 — Multiple note drag-and-drop into relation map](https://github.com/TriliumNext/Trilium/issues/3267)
|
||||
- [#3268 — Accept drag-and-dropping note links into relation map](https://github.com/TriliumNext/Trilium/issues/3268)
|
||||
- [#1650 — Copy notes from tree and paste into relation map](https://github.com/TriliumNext/Trilium/issues/1650)
|
||||
- [#2972 — Make lines of Relation map straight](https://github.com/TriliumNext/Trilium/issues/2972)
|
||||
- [#3037 — Upgrade the Relation Map](https://github.com/TriliumNext/Trilium/issues/3037)
|
||||
|
||||
## Cluster 19: Note-map / Link-map visualization (confidence: high)
|
||||
- [#1142 — enhance link map](https://github.com/TriliumNext/Trilium/issues/1142)
|
||||
- [#2064 — Improve the default layout of the link map](https://github.com/TriliumNext/Trilium/issues/2064)
|
||||
- [#1507 — A way to "save & reset" link map arrangement & zoom level](https://github.com/TriliumNext/Trilium/issues/1507)
|
||||
- [#1288 — please provide the way to save picture of linkmap](https://github.com/TriliumNext/Trilium/issues/1288)
|
||||
- [#2303 — Note Map Live Update](https://github.com/TriliumNext/Trilium/issues/2303)
|
||||
- [#5656 — Show full note titles in Link Map view](https://github.com/TriliumNext/Trilium/issues/5656)
|
||||
- [#5247 — Search/Filter Map View (Notes & Relations)](https://github.com/TriliumNext/Trilium/issues/5247)
|
||||
- [#4832 — Tag Based Note connection for Note Map](https://github.com/TriliumNext/Trilium/issues/4832)
|
||||
- [#1946 — Show attributes (relations) on link map](https://github.com/TriliumNext/Trilium/issues/1946)
|
||||
- [#2413 — Note map does not display inherited relations](https://github.com/TriliumNext/Trilium/issues/2413)
|
||||
- [#3185 — Export & import note tree with backlinks breaks note map](https://github.com/TriliumNext/Trilium/issues/3185)
|
||||
- [#8319 — [Feature Request] Improved Note-Maps](https://github.com/TriliumNext/Trilium/issues/8319)
|
||||
- [#8916 — Note Map view of `Hidden Notes` freezes Trilium](https://github.com/TriliumNext/Trilium/issues/8916)
|
||||
- [#3840 — Allow the option to make transclusion an additional note relation in the map](https://github.com/TriliumNext/Trilium/issues/3840)
|
||||
- [#5756 — Support Note Map Type as Shared Page](https://github.com/TriliumNext/Trilium/issues/5756)
|
||||
|
||||
## Cluster 20: Mind map capability (confidence: medium)
|
||||
- [#7266 — Unable to find a transparent background on the sub-nodes of the mind map](https://github.com/TriliumNext/Trilium/issues/7266)
|
||||
- [#5357 — Mind Map: Ability to add images as node](https://github.com/TriliumNext/Trilium/issues/5357)
|
||||
- [#8107 — Can I support Markdown syntax (mindmap extension syntax)](https://github.com/TriliumNext/Trilium/issues/8107)
|
||||
|
||||
## Cluster 21: Table view (Collections) enhancements and bugs (confidence: high)
|
||||
- [#6474 — Tab to next table view field in new record results in original field being focused](https://github.com/TriliumNext/Trilium/issues/6474)
|
||||
- [#6518 — Open child note from table view by clicking note name](https://github.com/TriliumNext/Trilium/issues/6518)
|
||||
- [#6555 — Unable to set column value to zero in table view](https://github.com/TriliumNext/Trilium/issues/6555)
|
||||
- [#7964 — Collections - Table View: multi-value labels do not display as columns](https://github.com/TriliumNext/Trilium/issues/7964)
|
||||
- [#8174 — Add the "Distribute Columns" feature to the table](https://github.com/TriliumNext/Trilium/issues/8174)
|
||||
- [#8481 — Add filtering in Table view](https://github.com/TriliumNext/Trilium/issues/8481)
|
||||
- [#8530 — Table not visible on viewType=Table note](https://github.com/TriliumNext/Trilium/issues/8530)
|
||||
- [#6927 — Make multiple linked notes show up in the relation column of viewType=table of collection view](https://github.com/TriliumNext/Trilium/issues/6927)
|
||||
- [#7217 — Allow opening note directly instead of quick edit in collections](https://github.com/TriliumNext/Trilium/issues/7217)
|
||||
- [#8664 — List view in shared collection notes](https://github.com/TriliumNext/Trilium/issues/8664)
|
||||
|
||||
## Cluster 22: Text-editor table editing (CKEditor tables, not table view) (confidence: high)
|
||||
- [#8622 — Lists Alignment in Tables](https://github.com/TriliumNext/Trilium/issues/8622)
|
||||
- [#5727 — Table borders](https://github.com/TriliumNext/Trilium/issues/5727)
|
||||
- [#1080 — I cannot see the cell properties panel, when the content of the table cell is too much](https://github.com/TriliumNext/Trilium/issues/1080)
|
||||
- [#1719 — Hide table edges](https://github.com/TriliumNext/Trilium/issues/1719)
|
||||
- [#1693 — Copy/Paste Table As/From CSV](https://github.com/TriliumNext/Trilium/issues/1693)
|
||||
- [#6468 — the table function area will block the text function area](https://github.com/TriliumNext/Trilium/issues/6468)
|
||||
|
||||
## Cluster 23: Kanban board / task management (confidence: high)
|
||||
- [#4395 — Autocomplete dialog support via scripting API (Kanban extension)](https://github.com/TriliumNext/Trilium/issues/4395)
|
||||
- [#5561 — task management](https://github.com/TriliumNext/Trilium/issues/5561)
|
||||
- [#6407 — Kanban Board enhancements](https://github.com/TriliumNext/Trilium/issues/6407)
|
||||
- [#7927 — Kanban: Display the first ~line of note content for each item](https://github.com/TriliumNext/Trilium/issues/7927)
|
||||
- [#6409 — Checklist progress](https://github.com/TriliumNext/Trilium/issues/6409)
|
||||
- [#2526 — simple recurring todo](https://github.com/TriliumNext/Trilium/issues/2526)
|
||||
- [#2330 — A note that collects all the unfinished todo items from other notes](https://github.com/TriliumNext/Trilium/issues/2330)
|
||||
|
||||
## Cluster 24: PDF viewer / share / editing (confidence: high)
|
||||
- [#9069 — PDF annotation changes not persisted, download button unresponsive](https://github.com/TriliumNext/Trilium/issues/9069)
|
||||
- [#8962 — PDF Editing - Highlights not saving?](https://github.com/TriliumNext/Trilium/issues/8962)
|
||||
- [#8967 — PDF Sharing - Download Option](https://github.com/TriliumNext/Trilium/issues/8967)
|
||||
- [#8963 — Bookmark while viewing pdf](https://github.com/TriliumNext/Trilium/issues/8963)
|
||||
- [#8635 — Allow internal links to open PDF notes at a specific page](https://github.com/TriliumNext/Trilium/issues/8635)
|
||||
- [#9059 — Link Notes in PDF To Internal Notes](https://github.com/TriliumNext/Trilium/issues/9059)
|
||||
- [#9164 — PDF Export feature and font size](https://github.com/TriliumNext/Trilium/issues/9164)
|
||||
- [#8097 — Print to PDF not using printCss correctly](https://github.com/TriliumNext/Trilium/issues/8097)
|
||||
- [#4669 — Printed font size configuration](https://github.com/TriliumNext/Trilium/issues/4669)
|
||||
- [#8140 — "shareExternalLink"-type label for PDF generation](https://github.com/TriliumNext/Trilium/issues/8140)
|
||||
- [#5665 — PDF Viewer Obstruction on iOS Mobile Client](https://github.com/TriliumNext/Trilium/issues/5665)
|
||||
- [#4650 — All notes are blank after opening pdf attachment a few times](https://github.com/TriliumNext/Trilium/issues/4650)
|
||||
- [#1209 — Clipper for PDF files?](https://github.com/TriliumNext/Trilium/issues/1209)
|
||||
|
||||
## Cluster 25: Automatic text transformations (dashes, quotes, ellipsis, arrows) (confidence: high)
|
||||
- [#1772 — Change or disable ckeditors automatic text transformation](https://github.com/TriliumNext/Trilium/issues/1772)
|
||||
- [#3400 — Setting to disable replacement of straight quote sign with typographic ones](https://github.com/TriliumNext/Trilium/issues/3400)
|
||||
- [#3767 — Is there a way to turn off Autoformat completely?](https://github.com/TriliumNext/Trilium/issues/3767)
|
||||
- [#4353 — Prevent correcting characters to symbols](https://github.com/TriliumNext/Trilium/issues/4353)
|
||||
- [#5827 — replace a word or symbol with a user defined term](https://github.com/TriliumNext/Trilium/issues/5827)
|
||||
- [#8094 — automatic -- to – conversion happens inside inline code blocks, and moves cursor outside](https://github.com/TriliumNext/Trilium/issues/8094)
|
||||
|
||||
## Cluster 26: Inline/code-block typing issues: `@`, `/`, autocomplete inside code (confidence: high)
|
||||
- [#8322 — Code block tries to link/create note when typing @, and suggests slash-commands when typing /](https://github.com/TriliumNext/Trilium/issues/8322)
|
||||
- [#5426 — Autoformat inline code when typing between backticks](https://github.com/TriliumNext/Trilium/issues/5426)
|
||||
- [#5424 — Autoformat Code-Block with language](https://github.com/TriliumNext/Trilium/issues/5424)
|
||||
- [#1712 — Disable "Internal trilium link (Ctrl+L)" on code-block text selection](https://github.com/TriliumNext/Trilium/issues/1712)
|
||||
|
||||
## Cluster 27: Link dialog / internal-link creation bugs (confidence: high)
|
||||
- [#5669 — Add link dialog fails to link if you press enter twice too quickly](https://github.com/TriliumNext/Trilium/issues/5669)
|
||||
- [#7996 — Typing quickly after Ctrl+L causes search text to be added to note](https://github.com/TriliumNext/Trilium/issues/7996)
|
||||
- [#5170 — "Create and link new note" context menu moves the link to beginning of parent note](https://github.com/TriliumNext/Trilium/issues/5170)
|
||||
- [#8533 — When creating a new note while linking to it, editor always scrolls to top](https://github.com/TriliumNext/Trilium/issues/8533)
|
||||
- [#8330 — Unable to confirm inline note creation via keyboard](https://github.com/TriliumNext/Trilium/issues/8330)
|
||||
- [#8356 — Allow Enter-key to confirm selection in 'Choose Note Type' dialog](https://github.com/TriliumNext/Trilium/issues/8356)
|
||||
- [#8188 — Displaying note icon when creating an inline note link, using @](https://github.com/TriliumNext/Trilium/issues/8188)
|
||||
- [#8465 — Defaulting Ctrl+L to 'arbitrary title'](https://github.com/TriliumNext/Trilium/issues/8465)
|
||||
- [#8641 — @ suggestion list overflows when cursor moves to new line](https://github.com/TriliumNext/Trilium/issues/8641)
|
||||
- [#5174 — '@' Context menu's auto-completion not showing most relevant but most recent](https://github.com/TriliumNext/Trilium/issues/5174)
|
||||
- [#3283 — Misplaced links to newly created pages](https://github.com/TriliumNext/Trilium/issues/3283)
|
||||
- [#3657 — New Note link not showing at cursor location after hitting "enter"](https://github.com/TriliumNext/Trilium/issues/3657)
|
||||
- [#4010 — Text cursor jumps to EOF instead of next line with internal link title](https://github.com/TriliumNext/Trilium/issues/4010)
|
||||
- [#2703 — @ link item dropdown persists between tabs](https://github.com/TriliumNext/Trilium/issues/2703)
|
||||
- [#8729 — Editing internal links](https://github.com/TriliumNext/Trilium/issues/8729)
|
||||
- [#924 — Text following internal link becomes part of the link after switching pages](https://github.com/TriliumNext/Trilium/issues/924)
|
||||
|
||||
## Cluster 28: Backlinks / unlinked references / block refs (confidence: medium)
|
||||
- [#1426 — request: unlinked references](https://github.com/TriliumNext/Trilium/issues/1426)
|
||||
- [#1157 — Split Screen And Unlinked References](https://github.com/TriliumNext/Trilium/issues/1157)
|
||||
- [#4691 — Context-Menu Option: "Add backlink to"](https://github.com/TriliumNext/Trilium/issues/4691)
|
||||
- [#1233 — Block Reference and transclude function](https://github.com/TriliumNext/Trilium/issues/1233)
|
||||
- [#1704 — Content block reference and Content block embedding](https://github.com/TriliumNext/Trilium/issues/1704)
|
||||
- [#1021 — Link to Note Block](https://github.com/TriliumNext/Trilium/issues/1021)
|
||||
- [#5751 — Linking to subtitles](https://github.com/TriliumNext/Trilium/issues/5751)
|
||||
|
||||
## Cluster 29: Markdown standards, heading levels, import/export fidelity (confidence: high)
|
||||
- [#8383 — Abide to markdown standards (H1 handling)](https://github.com/TriliumNext/Trilium/issues/8383)
|
||||
- [#5682 — any markdown text containing $ gets converted into math equations during import](https://github.com/TriliumNext/Trilium/issues/5682)
|
||||
- [#5504 — Import markdown leaves out image](https://github.com/TriliumNext/Trilium/issues/5504)
|
||||
- [#3151 — Import from HTML does not restore indentation](https://github.com/TriliumNext/Trilium/issues/3151)
|
||||
- [#1554 — image alt text in markdown export](https://github.com/TriliumNext/Trilium/issues/1554)
|
||||
- [#5344 — importing html images as attached instead of external reference](https://github.com/TriliumNext/Trilium/issues/5344)
|
||||
- [#4254 — Portrait images incorrectly rotated by 90° after import](https://github.com/TriliumNext/Trilium/issues/4254)
|
||||
- [#5254 — User configurable whitelist of html tags stripped on import](https://github.com/TriliumNext/Trilium/issues/5254)
|
||||
- [#8452 — Export note attributes as Markdown metadata](https://github.com/TriliumNext/Trilium/issues/8452)
|
||||
- [#7606 — Preview of markdown](https://github.com/TriliumNext/Trilium/issues/7606)
|
||||
- [#5690 — markdown editor](https://github.com/TriliumNext/Trilium/issues/5690)
|
||||
- [#3187 — HTML export results in unreadable notes on deeper parts of the tree](https://github.com/TriliumNext/Trilium/issues/3187)
|
||||
- [#3399 — Export Notes option to include internal links](https://github.com/TriliumNext/Trilium/issues/3399)
|
||||
- [#5199 — Export of HTML with [missing note] could have retained names](https://github.com/TriliumNext/Trilium/issues/5199)
|
||||
|
||||
## Cluster 30: Import from third-party apps / OneNote / Joplin / Evernote (confidence: medium)
|
||||
- [#1324 — Import of Joplin documents](https://github.com/TriliumNext/Trilium/issues/1324)
|
||||
- [#5707 — OneNote import tool](https://github.com/TriliumNext/Trilium/issues/5707)
|
||||
- [#4555 — on start of editing formatting is lost of imported .enex note](https://github.com/TriliumNext/Trilium/issues/4555)
|
||||
- [#2870 — Hope add import folder and generates notetree](https://github.com/TriliumNext/Trilium/issues/2870)
|
||||
- [#7923 — Auto Import Folder Contents To Trilium](https://github.com/TriliumNext/Trilium/issues/7923)
|
||||
- [#5355 — Import/Merge Another Trilium Database Into Current database](https://github.com/TriliumNext/Trilium/issues/5355)
|
||||
|
||||
## Cluster 31: Share feature bugs around assets/logo/layout (confidence: high)
|
||||
- [#8953 — Share logo function broken](https://github.com/TriliumNext/Trilium/issues/8953)
|
||||
- [#9096 — Share included content not working](https://github.com/TriliumNext/Trilium/issues/9096)
|
||||
- [#8178 — Layout Issue of a Sharing Page - Lack of Responsiveness](https://github.com/TriliumNext/Trilium/issues/8178)
|
||||
- [#8318 — Share page same title toc jump bug](https://github.com/TriliumNext/Trilium/issues/8318)
|
||||
- [#8451 — Cannot hide left sidebar in shared view using CSS or Attributes](https://github.com/TriliumNext/Trilium/issues/8451)
|
||||
- [#8448 — Attribute #shareExternalLink does not work / has no effect](https://github.com/TriliumNext/Trilium/issues/8448)
|
||||
- [#8942 — shareAlias links not clickable in shared notes](https://github.com/TriliumNext/Trilium/issues/8942)
|
||||
- [#7641 — Cloned collection, after sharing, wrong links for left menu](https://github.com/TriliumNext/Trilium/issues/7641)
|
||||
- [#7666 — Allow adjustable widths for the Content and TOC (Bookmarks) panes in the Share view](https://github.com/TriliumNext/Trilium/issues/7666)
|
||||
- [#5436 — Map not visible when note is shared](https://github.com/TriliumNext/Trilium/issues/5436)
|
||||
- [#4536 — include note not displayed in sharing](https://github.com/TriliumNext/Trilium/issues/4536)
|
||||
- [#2488 — Show attributes on shared notes](https://github.com/TriliumNext/Trilium/issues/2488)
|
||||
- [#2816 — The picture reference in shared notes is not normal](https://github.com/TriliumNext/Trilium/issues/2816)
|
||||
- [#7869 — Share root not found. Please set up a note with #shareRoot label first](https://github.com/TriliumNext/Trilium/issues/7869)
|
||||
- [#8323 — Enabling showLoginInShareTheme does not enable login from base domain](https://github.com/TriliumNext/Trilium/issues/8323)
|
||||
- [#8927 — Add "Copy to Clipboard" Button for Code Blocks in Shared Pages](https://github.com/TriliumNext/Trilium/issues/8927)
|
||||
- [#3430 — Add basic fulltext search to share](https://github.com/TriliumNext/Trilium/issues/3430)
|
||||
- [#5579 — Allow Root note to be #shareRoot](https://github.com/TriliumNext/Trilium/issues/5579)
|
||||
- [#5205 — Image zoom functions / gallery view for shared notes](https://github.com/TriliumNext/Trilium/issues/5205)
|
||||
- [#5303 — Creating human-readable URL aliases without sharing](https://github.com/TriliumNext/Trilium/issues/5303)
|
||||
- [#5217 — Friendly share urls: turn title into shareAlias](https://github.com/TriliumNext/Trilium/issues/5217)
|
||||
- [#5446 — shareAlias should warn you, if the alias is already used on another shared note](https://github.com/TriliumNext/Trilium/issues/5446)
|
||||
- [#2664 — Allow unsharing of notes in a shared subtree](https://github.com/TriliumNext/Trilium/issues/2664)
|
||||
- [#2620 — Add expiration date & max requests for shared notes](https://github.com/TriliumNext/Trilium/issues/2620)
|
||||
- [#4816 — Public Link with Search or Advanced Search Options for Entire TREE [Trilium Server]](https://github.com/TriliumNext/Trilium/issues/4816)
|
||||
|
||||
## Cluster 32: Templates — inheritance / override / scoped behavior (confidence: high)
|
||||
- [#8428 — Templates outside the workspace cannot be used within the workspace](https://github.com/TriliumNext/Trilium/issues/8428)
|
||||
- [#5626 — Include all available templates, even in hoisted notes](https://github.com/TriliumNext/Trilium/issues/5626)
|
||||
- [#4396 — Ordering of templates](https://github.com/TriliumNext/Trilium/issues/4396)
|
||||
- [#3138 — Template organization via template groups with drop-down menus](https://github.com/TriliumNext/Trilium/issues/3138)
|
||||
- [#3761 — Template mixins: Grouped inherited promoted attributes](https://github.com/TriliumNext/Trilium/issues/3761)
|
||||
- [#3184 — Auto-setup links when creating a template](https://github.com/TriliumNext/Trilium/issues/3184)
|
||||
- [#5423 — `~child:child:template=...` and deeper child-template not applied automatically](https://github.com/TriliumNext/Trilium/issues/5423)
|
||||
- [#5583 — Add a template label #rerunScriptsOnTemplateChange](https://github.com/TriliumNext/Trilium/issues/5583)
|
||||
- [#3958 — Allow hiding/blocking inherited attributes on template users](https://github.com/TriliumNext/Trilium/issues/3958)
|
||||
- [#5089 — template-Typed Attributes/Relationships](https://github.com/TriliumNext/Trilium/issues/5089)
|
||||
- [#2797 — A quicker way to create a bunch of new pages from a template](https://github.com/TriliumNext/Trilium/issues/2797)
|
||||
- [#2544 — Forms/Fields in a template?](https://github.com/TriliumNext/Trilium/issues/2544)
|
||||
- [#5080 — Investigate #titleTemplate for template notes](https://github.com/TriliumNext/Trilium/issues/5080)
|
||||
- [#5511 — Calculated Content in Templates via Inline Javascript](https://github.com/TriliumNext/Trilium/issues/5511)
|
||||
- [#3015 — Template collision for Code note](https://github.com/TriliumNext/Trilium/issues/3015)
|
||||
|
||||
## Cluster 33: Tree UX — expand/collapse, folders, sorting (confidence: high)
|
||||
- [#8477 — Folders, folders, folders](https://github.com/TriliumNext/Trilium/issues/8477)
|
||||
- [#2181 — Change note icon for folder note with content vs folder note without content](https://github.com/TriliumNext/Trilium/issues/2181)
|
||||
- [#6410 — Display the notes number in folders](https://github.com/TriliumNext/Trilium/issues/6410)
|
||||
- [#3356 — Collapsed child notes links should toggle the expansion on first click](https://github.com/TriliumNext/Trilium/issues/3356)
|
||||
- [#7901 — Sub pages are not displayed anymore](https://github.com/TriliumNext/Trilium/issues/7901)
|
||||
- [#6641 — When creating a new note, the closed tree will be reopened](https://github.com/TriliumNext/Trilium/issues/6641)
|
||||
- [#8996 — Hide expand/collapse children button in tree view when all children are hidden archived notes](https://github.com/TriliumNext/Trilium/issues/8996)
|
||||
- [#1144 — Option to auto expand book nodes](https://github.com/TriliumNext/Trilium/issues/1144)
|
||||
- [#2203 — Option to not expand a subtree when you open a subnote](https://github.com/TriliumNext/Trilium/issues/2203)
|
||||
- [#926 — Option to not to expand parent note when note is made it's child](https://github.com/TriliumNext/Trilium/issues/926)
|
||||
- [#5159 — Child notes don't refresh on selecting a different note](https://github.com/TriliumNext/Trilium/issues/5159)
|
||||
- [#7279 — Implement Sticky tree view headers as a native feature](https://github.com/TriliumNext/Trilium/issues/7279)
|
||||
- [#5305 — Note Tree Sidebar - Confirmation Dialogue When Dragging and Dropping To Move Note](https://github.com/TriliumNext/Trilium/issues/5305)
|
||||
- [#8526 — Make Ctrl + Click select multiple notes in the note tree by default](https://github.com/TriliumNext/Trilium/issues/8526)
|
||||
- [#3851 — Can't drag a note to the top of the child list?](https://github.com/TriliumNext/Trilium/issues/3851)
|
||||
- [#1269 — Customize note title shown in tree](https://github.com/TriliumNext/Trilium/issues/1269)
|
||||
- [#7564 — Change the default sorting of grades to alphabetical order](https://github.com/TriliumNext/Trilium/issues/7564)
|
||||
- [#6829 — Allow sorting notes by multiple attributes](https://github.com/TriliumNext/Trilium/issues/6829)
|
||||
- [#518 — Sorting protected notes](https://github.com/TriliumNext/Trilium/issues/518)
|
||||
|
||||
## Cluster 34: Tabs — opening / pinning / scrolling / default behavior (confidence: high)
|
||||
- [#3082 — Option to open notes in new tab by default](https://github.com/TriliumNext/Trilium/issues/3082)
|
||||
- [#2710 — Open new tabs next to the current one](https://github.com/TriliumNext/Trilium/issues/2710)
|
||||
- [#2281 — If note already open in another tab](https://github.com/TriliumNext/Trilium/issues/2281)
|
||||
- [#7607 — Add API support to check and switch to an already opened note tab](https://github.com/TriliumNext/Trilium/issues/7607)
|
||||
- [#5562 — Pin tab](https://github.com/TriliumNext/Trilium/issues/5562)
|
||||
- [#9032 — Horizontal scroll bar for improved tab row navigation](https://github.com/TriliumNext/Trilium/issues/9032)
|
||||
- [#8331 — table of contents and search do not work properly in closed-then-reopened tabs](https://github.com/TriliumNext/Trilium/issues/8331)
|
||||
- [#3053 — Restore previous windows and tabs open on startup](https://github.com/TriliumNext/Trilium/issues/3053)
|
||||
- [#2212 — Ctrl+W on root note should close Trilium](https://github.com/TriliumNext/Trilium/issues/2212)
|
||||
- [#1181 — Make tabs keep the scroll on the tree left panel](https://github.com/TriliumNext/Trilium/issues/1181)
|
||||
- [#2128 — Workspace name in tab title](https://github.com/TriliumNext/Trilium/issues/2128)
|
||||
|
||||
## Cluster 35: Note-editor data-loss / crash / blanking on switching or paste (confidence: high)
|
||||
- [#8282 — text editor crashed](https://github.com/TriliumNext/Trilium/issues/8282)
|
||||
- [#8952 — The software suddenly crashed, causing me to lose all the notes](https://github.com/TriliumNext/Trilium/issues/8952)
|
||||
- [#8913 — text 文本突然崩溃,且无法打开](https://github.com/TriliumNext/Trilium/issues/8913)
|
||||
- [#9110 — Note crashed at multiple ctrl+z/paste operations](https://github.com/TriliumNext/Trilium/issues/9110)
|
||||
- [#8866 — Cursor jumps to note beginning periodically, tabs reset - LauncherContainer performance issue](https://github.com/TriliumNext/Trilium/issues/8866)
|
||||
- [#5346 — Notes experiencing automatic snapshot recovery, edited content has no historical records](https://github.com/TriliumNext/Trilium/issues/5346)
|
||||
- [#5431 — Text note contents disappeared when switching from "Read-Only" to editable](https://github.com/TriliumNext/Trilium/issues/5431)
|
||||
- [#5192 — Notes not saving](https://github.com/TriliumNext/Trilium/issues/5192)
|
||||
- [#7393 — Note content overwritten (data loss!) when changing the title of snippets](https://github.com/TriliumNext/Trilium/issues/7393)
|
||||
- [#7405 — Clicking on the code box causes the entire document to become blank](https://github.com/TriliumNext/Trilium/issues/7405)
|
||||
- [#8079 — Pasting a reply copied from the Gemini website will result in the content in the code box being lost](https://github.com/TriliumNext/Trilium/issues/8079)
|
||||
- [#4463 — Unexpected Data Loss in Trilium After Application Restart and Backup Restoration](https://github.com/TriliumNext/Trilium/issues/4463)
|
||||
- [#6153 — CKEditorError: marker-destroyed when edit with search](https://github.com/TriliumNext/Trilium/issues/6153)
|
||||
|
||||
## Cluster 36: Editor scroll/cursor jumps during typing/sync (confidence: high)
|
||||
- [#3704 — Trilium always places the cursor at the beginning of the note](https://github.com/TriliumNext/Trilium/issues/3704)
|
||||
- [#8866 — Cursor jumps to note beginning periodically (crossover with cluster 35)](https://github.com/TriliumNext/Trilium/issues/8866)
|
||||
- [#3214 — cursor jumps to another place after click included note](https://github.com/TriliumNext/Trilium/issues/3214)
|
||||
- [#4354 — input cursor always positioned in the center of the screen](https://github.com/TriliumNext/Trilium/issues/4354)
|
||||
- [#5191 — Allow scrolling when the cursor is in the margins of a note](https://github.com/TriliumNext/Trilium/issues/5191)
|
||||
- [#7373 — Typing slows down to the point where it can't be used](https://github.com/TriliumNext/Trilium/issues/7373)
|
||||
- [#5673 — Editor extremely slow with large-ish checkbox trees](https://github.com/TriliumNext/Trilium/issues/5673)
|
||||
- [#3478 — Lagging Trilium frontend when editing large note](https://github.com/TriliumNext/Trilium/issues/3478)
|
||||
- [#8440 — Lagginess, rubberbanding on frontend](https://github.com/TriliumNext/Trilium/issues/8440)
|
||||
|
||||
## Cluster 37: Math/LaTeX editor issues (confidence: high)
|
||||
- [#7999 — The confirm button in the LaTeX formula editor doesn't work](https://github.com/TriliumNext/Trilium/issues/7999)
|
||||
- [#8891 — One simple math display error (sum, prod render wrong)](https://github.com/TriliumNext/Trilium/issues/8891)
|
||||
- [#7211 — Note content gets deleted after altering math equation size](https://github.com/TriliumNext/Trilium/issues/7211)
|
||||
- [#3121 — write math inline, the text panel will delete things that i wrote before](https://github.com/TriliumNext/Trilium/issues/3121)
|
||||
- [#3457 — Strange behavior when dealing with math related contents](https://github.com/TriliumNext/Trilium/issues/3457)
|
||||
- [#1357 — Inserting a space after a math expression deletes it](https://github.com/TriliumNext/Trilium/issues/1357)
|
||||
- [#8598 — Enable `globalGroup` for KaTeX (or make the global macros configurable)](https://github.com/TriliumNext/Trilium/issues/8598)
|
||||
- [#3130 — Latex in titles](https://github.com/TriliumNext/Trilium/issues/3130)
|
||||
- [#5375 — `replaceMathTextWithKatax` method is duplicated in `highlight_list.ts` and `toc.js`](https://github.com/TriliumNext/Trilium/issues/5375)
|
||||
|
||||
## Cluster 38: Vim / Emacs / alt keybindings for editor (confidence: high)
|
||||
- [#2259 — VIM support](https://github.com/TriliumNext/Trilium/issues/2259)
|
||||
- [#4405 — Vim keybindings - Add yank to/paste from system clipboard register](https://github.com/TriliumNext/Trilium/issues/4405)
|
||||
- [#4969 — Note editors other than CKEditor](https://github.com/TriliumNext/Trilium/issues/4969)
|
||||
|
||||
## Cluster 39: Custom keyboard shortcuts: missing/broken/conflict (confidence: high)
|
||||
- [#6643 — Some shortcuts not working anymore](https://github.com/TriliumNext/Trilium/issues/6643)
|
||||
- [#5517 — Keyboard Shortcuts can be assigned multiple times](https://github.com/TriliumNext/Trilium/issues/5517)
|
||||
- [#5482 — Option to disable Electron built-in shortcuts (Ctrl+Q etc.)](https://github.com/TriliumNext/Trilium/issues/5482)
|
||||
- [#4543 — Couple of keyboard shortcut names in keyboard_actions.js do not match database](https://github.com/TriliumNext/Trilium/issues/4543)
|
||||
- [#5359 — keyboard shortcuts from keyboard_actions service are not translatable](https://github.com/TriliumNext/Trilium/issues/5359)
|
||||
- [#1512 — Fail to define shortcut like Meta+[ or Meta+Shift+Left](https://github.com/TriliumNext/Trilium/issues/1512)
|
||||
- [#1131 — Alt + <x> keyboard shortcuts with active editor](https://github.com/TriliumNext/Trilium/issues/1131)
|
||||
- [#4989 — (Keyboard) shortcuts for more actions](https://github.com/TriliumNext/Trilium/issues/4989) — meta-ticket
|
||||
- [#8604 — Show warning toast when triggering "global:" shortcuts](https://github.com/TriliumNext/Trilium/issues/8604)
|
||||
- [#5638 — Add Ctrl + D Shortcut to Select Next Matching Occurrence](https://github.com/TriliumNext/Trilium/issues/5638)
|
||||
- [#6350 — Repeat last action shortcut](https://github.com/TriliumNext/Trilium/issues/6350)
|
||||
- [#4242 — Subscript & Superscript Shortcuts](https://github.com/TriliumNext/Trilium/issues/4242)
|
||||
- [#9006 — Switch Alt Enter with Enter](https://github.com/TriliumNext/Trilium/issues/9006)
|
||||
- [#3304 — Add shortcut (set text to code format)](https://github.com/TriliumNext/Trilium/issues/3304)
|
||||
- [#5475 — Add keyboard shortcuts for managing splits](https://github.com/TriliumNext/Trilium/issues/5475)
|
||||
- [#1046 — Global shortcut (desktop)](https://github.com/TriliumNext/Trilium/issues/1046)
|
||||
|
||||
## Cluster 40: Docker: USER_UID/GID, backup path, healthcheck, rootless (confidence: high)
|
||||
- [#5131 — v0.90.4 docker does not read USER_UID and USER_GID from environment](https://github.com/TriliumNext/Trilium/issues/5131)
|
||||
- [#3045 — Docker: Can't run by using user 1000:1000](https://github.com/TriliumNext/Trilium/issues/3045)
|
||||
- [#3697 — Docker: Set USER_GID to 100](https://github.com/TriliumNext/Trilium/issues/3697)
|
||||
- [#3868 — docker log show chown operation not permitted](https://github.com/TriliumNext/Trilium/issues/3868)
|
||||
- [#4008 — Permissions issue: Can not set UID and GID to '0'](https://github.com/TriliumNext/Trilium/issues/4008)
|
||||
- [#8261 — fix docker backup path](https://github.com/TriliumNext/Trilium/issues/8261)
|
||||
- [#4576 — Avoid CPU Usage Spikes by improving the healthcheck script](https://github.com/TriliumNext/Trilium/issues/4576)
|
||||
- [#7884 — Remove `docker-compose.rootless.yaml`, as it deprecated](https://github.com/TriliumNext/Trilium/issues/7884)
|
||||
- [#5790 — Can't pull rootless](https://github.com/TriliumNext/Trilium/issues/5790)
|
||||
- [#6390 — The `arm64` docker image does include `wget`](https://github.com/TriliumNext/Trilium/issues/6390)
|
||||
- [#2239 — Docker Compose file needs to be updated](https://github.com/TriliumNext/Trilium/issues/2239)
|
||||
- [#9311 — Official RISC-V (riscv64) Docker image support](https://github.com/TriliumNext/Trilium/issues/9311)
|
||||
|
||||
## Cluster 41: Packaging: Chocolatey / Flathub / Snap / Homebrew / winget (confidence: medium)
|
||||
- [#8122 — continue updating on chocolatey repository](https://github.com/TriliumNext/Trilium/issues/8122)
|
||||
- [#6406 — Packaging for Chocolatey](https://github.com/TriliumNext/Trilium/issues/6406)
|
||||
- [#5086 — Investigate Windows additional package managers (winget/chocolatey/scoop)](https://github.com/TriliumNext/Trilium/issues/5086)
|
||||
- [#5108 — Deploy to Flathub](https://github.com/TriliumNext/Trilium/issues/5108)
|
||||
- [#4732 — Flathub Verification](https://github.com/TriliumNext/Trilium/issues/4732)
|
||||
- [#4194 — "open externally" doesn't work in Trilium Flatpak](https://github.com/TriliumNext/Trilium/issues/4194)
|
||||
- [#5725 — Add TriliumNext to TrueNAS apps](https://github.com/TriliumNext/Trilium/issues/5725)
|
||||
- [#6708 — Packaging RPMs fails with RPM 4.20+](https://github.com/TriliumNext/Trilium/issues/6708)
|
||||
- [#6825 — NixOS server installation port can't be configured](https://github.com/TriliumNext/Trilium/issues/6825)
|
||||
- [#4871 — Adding Elestio as deployment option](https://github.com/TriliumNext/Trilium/issues/4871)
|
||||
- [#2391 — One-click installation on CapRover](https://github.com/TriliumNext/Trilium/issues/2391)
|
||||
|
||||
## Cluster 42: Electron / desktop app: crash, tray, auto-update, minimize (confidence: medium)
|
||||
- [#4439 — Update mechanism (in-app)](https://github.com/TriliumNext/Trilium/issues/4439)
|
||||
- [#393 — Upgrade option (in-app)](https://github.com/TriliumNext/Trilium/issues/393)
|
||||
- [#3743 — Minimize/close to tray icon](https://github.com/TriliumNext/Trilium/issues/3743)
|
||||
- [#5401 — Confusing behaviour when the application is minimized in system tray](https://github.com/TriliumNext/Trilium/issues/5401)
|
||||
- [#6805 — Adaptive Tray icon](https://github.com/TriliumNext/Trilium/issues/6805)
|
||||
- [#9083 — Using alt + F4 when there are multiple windows will close all windows](https://github.com/TriliumNext/Trilium/issues/9083)
|
||||
- [#8882 — Desktop (macOS ARM64): window shows {"message":"Not Found"} on startup](https://github.com/TriliumNext/Trilium/issues/8882)
|
||||
- [#8912 — macOS dynamic traffic light offset based on zoom factor](https://github.com/TriliumNext/Trilium/issues/8912)
|
||||
- [#5333 — The SUID sandbox helper binary was found, but is not configured correctly](https://github.com/TriliumNext/Trilium/issues/5333)
|
||||
- [#5525 — Unable to launch desktop client - Permission denied](https://github.com/TriliumNext/Trilium/issues/5525)
|
||||
- [#5526 — Investigate Creating/Shipping AppArmor Profile](https://github.com/TriliumNext/Trilium/issues/5526)
|
||||
- [#7468 — display issue with app folders on the macOS Launchpad](https://github.com/TriliumNext/Trilium/issues/7468)
|
||||
- [#3500 — Trillium notes does not start if the firewall has blocked it](https://github.com/TriliumNext/Trilium/issues/3500)
|
||||
- [#5729 — Firewall warning on corporate network](https://github.com/TriliumNext/Trilium/issues/5729)
|
||||
- [#6919 — Version 0.98.1 on Windows 11, the client startup reports an OOM error and crashes](https://github.com/TriliumNext/Trilium/issues/6919)
|
||||
- [#6570 — The Win client crashed](https://github.com/TriliumNext/Trilium/issues/6570)
|
||||
|
||||
## Cluster 43: Mobile web/PWA UX (confidence: high)
|
||||
- [#7447 — Milestone: Official mobile application](https://github.com/TriliumNext/Trilium/issues/7447)
|
||||
- [#7517 — Wrong notification bar color in PWA](https://github.com/TriliumNext/Trilium/issues/7517)
|
||||
- [#8974 — Table of Content visibility toggle for smartphone/mobile screens](https://github.com/TriliumNext/Trilium/issues/8974)
|
||||
- [#5713 — When using a custom theme, the #launcher-container is not scrollable on mobile devices](https://github.com/TriliumNext/Trilium/issues/5713)
|
||||
- [#4150 — Mobile interface, add 'move note' to note menu](https://github.com/TriliumNext/Trilium/issues/4150)
|
||||
- [#4468 — Add toggle button for promoted attribute on mobile version](https://github.com/TriliumNext/Trilium/issues/4468)
|
||||
- [#4392 — (mobile ux) toggling checkboxes opens the keyboard](https://github.com/TriliumNext/Trilium/issues/4392)
|
||||
- [#4394 — (mobile ux) editing notes offline covers the screen in errors](https://github.com/TriliumNext/Trilium/issues/4394)
|
||||
- [#5706 — Modals/dialogues being presented too high/low which inhibits input (especially on iPad-safari/edge)](https://github.com/TriliumNext/Trilium/issues/5706)
|
||||
- [#6999 — Editing a Relation (from template) in mobile view, don't work](https://github.com/TriliumNext/Trilium/issues/6999)
|
||||
- [#7116 — Mobile Webapp: Text Notes Bullet List Issue](https://github.com/TriliumNext/Trilium/issues/7116)
|
||||
- [#1813 — Note title input on mobile](https://github.com/TriliumNext/Trilium/issues/1813)
|
||||
- [#2833 — Cannot select relation note to edit on mobile](https://github.com/TriliumNext/Trilium/issues/2833)
|
||||
- [#1170 — How to disable note editing in mobile front end?](https://github.com/TriliumNext/Trilium/issues/1170)
|
||||
- [#3389 — Images upload sequence on mobile](https://github.com/TriliumNext/Trilium/issues/3389)
|
||||
- [#8225 — Offline mode for the PWA](https://github.com/TriliumNext/Trilium/issues/8225)
|
||||
- [#8372 — Support "share_target" in PWA to share files into Trilium notes](https://github.com/TriliumNext/Trilium/issues/8372)
|
||||
|
||||
## Cluster 44: Tree focus / cursor navigation / keyboard tree nav (confidence: medium)
|
||||
- [#9259 — Notes no longer receive focus when navigating via the left tree](https://github.com/TriliumNext/Trilium/issues/9259)
|
||||
- [#1715 — Page up/down in note selection dialogs (Jump to note, ..)](https://github.com/TriliumNext/Trilium/issues/1715)
|
||||
- [#1166 — Context menu is not usable with keyboard](https://github.com/TriliumNext/Trilium/issues/1166)
|
||||
- [#7942 — "Open Command Palette" shortcut opens with the '>' symbol highlighted](https://github.com/TriliumNext/Trilium/issues/7942)
|
||||
|
||||
## Cluster 45: Images: drag-drop, compression, inline, gallery, paste (confidence: medium)
|
||||
- [#5795 — Allow dropping image attachments in without shrinking them](https://github.com/TriliumNext/Trilium/issues/5795)
|
||||
- [#5361 — UX: image options clarification](https://github.com/TriliumNext/Trilium/issues/5361)
|
||||
- [#5126 — AVIF image compression support](https://github.com/TriliumNext/Trilium/issues/5126)
|
||||
- [#5670 — Option to define default image alignment when pasting document](https://github.com/TriliumNext/Trilium/issues/5670)
|
||||
- [#3724 — Paste picture default Settings](https://github.com/TriliumNext/Trilium/issues/3724)
|
||||
- [#7895 — Image Gallery/Collection](https://github.com/TriliumNext/Trilium/issues/7895)
|
||||
- [#5697 — Take photo from camera](https://github.com/TriliumNext/Trilium/issues/5697)
|
||||
- [#5825 — annotate image](https://github.com/TriliumNext/Trilium/issues/5825)
|
||||
- [#3794 — Tiling images without resorting to tables](https://github.com/TriliumNext/Trilium/issues/3794)
|
||||
- [#9120 — Images as links](https://github.com/TriliumNext/Trilium/issues/9120)
|
||||
- [#4898 — Link in images](https://github.com/TriliumNext/Trilium/issues/4898)
|
||||
- [#1544 — embedding image with url](https://github.com/TriliumNext/Trilium/issues/1544)
|
||||
- [#8150 — Note header image](https://github.com/TriliumNext/Trilium/issues/8150)
|
||||
- [#3593 — Ability to disable to jump to an image when an image is attached](https://github.com/TriliumNext/Trilium/issues/3593)
|
||||
- [#5233 — Copy and Paste not working, only Text is pasted not Images](https://github.com/TriliumNext/Trilium/issues/5233)
|
||||
- [#2818 — problems with copying and pasting pictures across software](https://github.com/TriliumNext/Trilium/issues/2818)
|
||||
- [#2621 — Inconsistency import pictures with Trilium Web Clipper Addon](https://github.com/TriliumNext/Trilium/issues/2621)
|
||||
- [#9134 — Images opened in new tabs do not show up](https://github.com/TriliumNext/Trilium/issues/9134)
|
||||
- [#4221 — SVG zooming in 0.61](https://github.com/TriliumNext/Trilium/issues/4221)
|
||||
|
||||
## Cluster 46: Attachments: rendering, opening, converting, linking (confidence: high)
|
||||
- [#5818 — Converting an attachment to a note breaks links](https://github.com/TriliumNext/Trilium/issues/5818)
|
||||
- [#4562 — Attachment Links not working as expected](https://github.com/TriliumNext/Trilium/issues/4562)
|
||||
- [#5118 — Copying attachment link to clipboard fails](https://github.com/TriliumNext/Trilium/issues/5118)
|
||||
- [#7670 — Attachment link customization](https://github.com/TriliumNext/Trilium/issues/7670)
|
||||
- [#5363 — Option to open HTML attachment in browser instead of download](https://github.com/TriliumNext/Trilium/issues/5363)
|
||||
- [#4384 — Display attachments directly inside notes](https://github.com/TriliumNext/Trilium/issues/4384)
|
||||
- [#4885 — reload read position after "go back" from attachment view](https://github.com/TriliumNext/Trilium/issues/4885)
|
||||
- [#7466 — When returning from the attachment, the text editing bar appears blank](https://github.com/TriliumNext/Trilium/issues/7466)
|
||||
- [#5528 — Editing a note causes its attachments opened on separate splits/windows to be re-rendered on each keystroke](https://github.com/TriliumNext/Trilium/issues/5528)
|
||||
- [#4498 — Bulk convert to attachment](https://github.com/TriliumNext/Trilium/issues/4498)
|
||||
- [#212 — Tooltip for an attachment can display basic info and download/open buttons](https://github.com/TriliumNext/Trilium/issues/212)
|
||||
- [#8314 — Scissor "Cut & Paste Selection to Sub-note" does not transfer image attachments](https://github.com/TriliumNext/Trilium/issues/8314)
|
||||
|
||||
## Cluster 47: Attributes: label autocomplete / relations / bulk / suggestions (confidence: medium)
|
||||
- [#39 — Implement attribute autocomplete in search input](https://github.com/TriliumNext/Trilium/issues/39)
|
||||
- [#75 — add standard attribute value autocomplete](https://github.com/TriliumNext/Trilium/issues/75)
|
||||
- [#139 — Label listing can be clickable and lead to search of given label](https://github.com/TriliumNext/Trilium/issues/139)
|
||||
- [#1668 — Search autocompletion for labels](https://github.com/TriliumNext/Trilium/issues/1668)
|
||||
- [#1284 — Picky details of new Attributes field](https://github.com/TriliumNext/Trilium/issues/1284)
|
||||
- [#4124 — Labels with predefined lists](https://github.com/TriliumNext/Trilium/issues/4124)
|
||||
- [#1877 — No distinction between `undefined` and `false` in a boolean promoted attribute](https://github.com/TriliumNext/Trilium/issues/1877)
|
||||
- [#6349 — Promoted, single date label produces multiple entries](https://github.com/TriliumNext/Trilium/issues/6349)
|
||||
- [#4058 — API removeLabel() results in duplicated labels upon refreshing](https://github.com/TriliumNext/Trilium/issues/4058)
|
||||
- [#8187 — Search for new relation in promoted attributes does not suggest to create it](https://github.com/TriliumNext/Trilium/issues/8187)
|
||||
- [#5443 — Include attributes in revisions](https://github.com/TriliumNext/Trilium/issues/5443)
|
||||
- [#4305 — Encrypted / Protected attributes](https://github.com/TriliumNext/Trilium/issues/4305)
|
||||
- [#6421 — [wip] Attributes V2](https://github.com/TriliumNext/Trilium/issues/6421) — umbrella
|
||||
- [#6853 — Aliases for Label/Relation definitions should either forbid `,` or escape it](https://github.com/TriliumNext/Trilium/issues/6853)
|
||||
- [#5546 — `#readOnly` should be applied to title and labels (attributes) too](https://github.com/TriliumNext/Trilium/issues/5546)
|
||||
- [#6162 — Global Tag View for Enhanced Usability](https://github.com/TriliumNext/Trilium/issues/6162)
|
||||
- [#5849 — label system](https://github.com/TriliumNext/Trilium/issues/5849)
|
||||
- [#760 — tag system suggest](https://github.com/TriliumNext/Trilium/issues/760)
|
||||
- [#3415 — Unify the attribute_detail and builtin_attributes definitions](https://github.com/TriliumNext/Trilium/issues/3415)
|
||||
|
||||
## Cluster 48: Clone terminology / cloning UX (confidence: medium)
|
||||
- [#4099 — An idea for (perhaps) a better naming of note clones](https://github.com/TriliumNext/Trilium/issues/4099)
|
||||
- [#5281 — Change `clone` terminology](https://github.com/TriliumNext/Trilium/issues/5281)
|
||||
- [#7024 — where is my clone note? An easy way to find clone note](https://github.com/TriliumNext/Trilium/issues/7024)
|
||||
- [#1572 — Could locations of cloned notes appear in global search?](https://github.com/TriliumNext/Trilium/issues/1572)
|
||||
- [#4668 — Create clone location when it doesn't exist](https://github.com/TriliumNext/Trilium/issues/4668)
|
||||
- [#6226 — Adding "Clone to" to search bulk actions](https://github.com/TriliumNext/Trilium/issues/6226)
|
||||
- [#2362 — "Delete all clones" checkbox should have a different message if there are no clones](https://github.com/TriliumNext/Trilium/issues/2362)
|
||||
- [#7396 — Duplicate a note without cloning it](https://github.com/TriliumNext/Trilium/issues/7396)
|
||||
|
||||
## Cluster 49: Hoisting / workspaces (confidence: medium)
|
||||
- [#3540 — Unhoist temporarily (unhoist and hoist back the original hoisted note)](https://github.com/TriliumNext/Trilium/issues/3540)
|
||||
- [#4080 — Workspace Specific Launchers](https://github.com/TriliumNext/Trilium/issues/4080)
|
||||
- [#5671 — Option to search entire database when a note is hoisted](https://github.com/TriliumNext/Trilium/issues/5671)
|
||||
|
||||
## Cluster 50: Deletion / undelete / bulk actions / undo subtree (confidence: high)
|
||||
- [#7293 — failed to delete notes when permanently deleting multi notes with children notes](https://github.com/TriliumNext/Trilium/issues/7293)
|
||||
- [#7288 — Ghost note remains when moving multiple notes into a newly created note](https://github.com/TriliumNext/Trilium/issues/7288)
|
||||
- [#5497 — Undo, permanent delete: add as action for note tree](https://github.com/TriliumNext/Trilium/issues/5497)
|
||||
- [#6257 — "Erase notes permanently" Option When Deleting Notes](https://github.com/TriliumNext/Trilium/issues/6257)
|
||||
- [#5536 — Recent Changes not correct. Undelete doc is confusing](https://github.com/TriliumNext/Trilium/issues/5536)
|
||||
- [#616 — Undo for Subtree Operations](https://github.com/TriliumNext/Trilium/issues/616)
|
||||
- [#1266 — Suggestion for Recent Changes (divide into sections)](https://github.com/TriliumNext/Trilium/issues/1266)
|
||||
|
||||
## Cluster 51: Similar notes / right panel / attribute window performance (confidence: medium)
|
||||
- [#8900 — Uncaught TypeError thrown when switching notes with bottom-right attribute window open](https://github.com/TriliumNext/Trilium/issues/8900)
|
||||
- [#1654 — Contextual `Similar notes` algorithm based on search string](https://github.com/TriliumNext/Trilium/issues/1654)
|
||||
|
||||
## Cluster 52: Geo-map features and undo (confidence: high)
|
||||
- [#6259 — support ctrl+z/undo when mistakingly moving a pin](https://github.com/TriliumNext/Trilium/issues/6259)
|
||||
- [#8565 — Colors in map do not match colors of notes](https://github.com/TriliumNext/Trilium/issues/8565)
|
||||
- [#5451 — Request to add polylines or polygons on the geomap note type](https://github.com/TriliumNext/Trilium/issues/5451)
|
||||
@@ -1,435 +0,0 @@
|
||||
# Easy-Fix Candidates — Trilium Issue Review
|
||||
|
||||
Consolidated from per-batch analysis of all 859 open issues (as of 2026-04-09).
|
||||
Total easy-fix candidates identified: **61**
|
||||
|
||||
Each item below was classified by a subagent reviewing issue bodies individually. Effort and confidence are the subagent's estimate. Before picking one up, re-read the original issue and verify the proposed solution against current `main`.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 01
|
||||
|
||||
### [#9330 — Web clipper setup fails with trailing / in server setup](https://github.com/TriliumNext/Trilium/issues/9330)
|
||||
- **Problem**: Entering `https://server/` (trailing slash) in the web clipper options form produces malformed requests (`//api/...`) because the URL isn't normalized.
|
||||
- **Proposed solution**: In `apps/web-clipper/entrypoints/options/index.ts`, strip any trailing slash from `$triliumServerUrl.val()` before storing it (lines 32, 63). Also defensively trim it again when read in `apps/web-clipper/entrypoints/background/trilium_server_facade.ts` (line 121) before concatenating with the API path.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8882 — Desktop (macOS ARM64): window shows `{"message":"Not Found"}` on startup](https://github.com/TriliumNext/Trilium/issues/8882)
|
||||
- **Problem**: In Electron, `res.sendFile(path.join(publicDir, "index.html"))` fails because `send`/streaming cannot read from inside the `app.asar` archive; reporter identified the root cause and the fix.
|
||||
- **Proposed solution**: In `apps/server/src/routes/assets.ts` line 72 (non-dev branch), replace `res.sendFile(path.join(publicDir, "index.html"), STATIC_OPTIONS)` with a `readFile` + `res.send()` (Electron patches `fs.readFile` to work inside asar, but not `send`'s streaming pipeline). Set `Content-Type: text/html; charset=utf-8`.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8916 — Note Map view of `Hidden Notes` freezes Trilium](https://github.com/TriliumNext/Trilium/issues/8916)
|
||||
- **Problem**: Invoking Note Map on the `_hidden` root attempts to render thousands of system nodes and hangs the renderer irrecoverably (edge case).
|
||||
- **Proposed solution**: In the note-map widget (`apps/client/src/widgets/type_widgets/note_map.tsx` or similar — search `noteMap`), short-circuit the render when `note.noteId === "_hidden"` or when the aggregate number of descendants exceeds a threshold; show a warning instead of computing the graph. Alternatively hide the "Note map" entry from the `...` menu when the current note is `_hidden` (or any note ancestored by it) via a simple guard in the menu population code.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — the guard is trivial to add, but the exact file path depends on where the note-map command is currently wired after the React port.
|
||||
|
||||
### [#8850 — Search does not work for `#clipType=note`](https://github.com/TriliumNext/Trilium/issues/8850)
|
||||
- **Problem**: Searching `#clipType=note` returns all notes in 0.101.3 and throws an error in nightly. The literal value `note` likely collides with the search DSL keyword `note` (note title predicate).
|
||||
- **Proposed solution**: In `apps/server/src/services/search/` token parsing, quote/escape attribute values when they match reserved keywords, or force attribute-expression RHS parsing to treat the RHS as a literal until whitespace. Simplest targeted fix: ensure the attribute-value tokenizer does not re-interpret `note` as a type keyword when it appears after `=`. Reporter-visible workaround is `#clipType="note"` (confirm this works before closing).
|
||||
- **Effort**: small
|
||||
- **Confidence**: low — the symptom points at the search tokenizer but the root cause needs a quick repro against current code.
|
||||
|
||||
### [#8900 — Uncaught TypeError thrown when switching notes with bottom-right attribute window open](https://github.com/TriliumNext/Trilium/issues/8900)
|
||||
- **Problem**: Switching notes while the attribute detail popup is open throws a console TypeError (no visible break). Classic missing null-check on teardown.
|
||||
- **Proposed solution**: Find the attribute detail widget (`apps/client/src/widgets/ribbon/attributes/*` or `widgets/attribute_widgets`) and guard the cleanup handler to check whether the widget/element still exists before calling into it. The user screenshot would pinpoint the exact line; a defensive `if (!$elem?.length) return;` at the top of the refresh/hide handler is typical.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium — confidence hinges on identifying the exact handler from the screenshot; the fix itself is one line.
|
||||
|
||||
### [#9174 — Right navigation (TOC) font doesn't match editor until you keep typing](https://github.com/TriliumNext/Trilium/issues/9174)
|
||||
- **Problem**: When you change a heading's style in the editor, the TOC side panel doesn't re-render using the new style until more content is added.
|
||||
- **Proposed solution**: The TOC widget subscribes to content changes but likely ignores "attribute-only" (style) changes. In the TOC widget (`apps/client/src/widgets/right_panel/*toc*` or `table_of_contents*.tsx`) ensure the listener refreshes on model changes that alter heading attributes too — typically replacing a content-only comparison with a re-render on every editor `change` event, or listening to CKEditor's `change:data` broadly.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
---
|
||||
|
||||
## From Batch 02
|
||||
|
||||
### [#8561 — documentation - word count widget](https://github.com/TriliumNext/Trilium/issues/8561)
|
||||
- **Problem**: Word count widget docs don't prominently state the note must have the `#wordCount` label.
|
||||
- **Proposed solution**: Edit `apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html` to add an explicit note (admonition) above the code snippet stating: "The widget only activates on text notes that carry the `#wordCount` label (it can be inherited)." The code comment already mentions this but it's buried inside the example code block.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8401 — router not found for request GET /api/search](https://github.com/TriliumNext/Trilium/issues/8401)
|
||||
- **Problem**: Third-party Home Assistant addon gets "router not found" on `GET /api/search`.
|
||||
- **Proposed solution**: Not a Trilium bug — the route is `/api/search/:searchString` (see `apps/server/src/routes/routes.ts:255`). The addon is calling the route without the required path parameter. Close as invalid with a pointer to the addon author.
|
||||
- **Effort**: trivial (close with explanation)
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8322 — Code block tries to link/create note when typing @, and suggests slash-commands when typing /](https://github.com/TriliumNext/Trilium/issues/8322)
|
||||
- **Problem**: Inside full `code` blocks in text notes, typing `@` triggers the note-link autocomplete and `/` triggers slash commands.
|
||||
- **Proposed solution**: In the CKEditor mention/slash-command plugin configuration (`packages/ckeditor5/src/plugins` area that wires Mention/SlashCommand), disable the mention & slash-command feeders when the selection is inside a `codeBlock` element. Typically a single predicate check. Worth verifying but should be small.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
- **Note**: the issue body contains an image with a prompt-injection attempt in its `alt` attribute which I ignored.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 03
|
||||
|
||||
### [#8230 — Demo spacing and formatting issues](https://github.com/TriliumNext/Trilium/issues/8230)
|
||||
- **Problem**: `apps/edit-docs/demo/root/Trilium Demo.html` line 78 has "code blocks</a>and" (missing space before "and"), a comma trapped inside the `<a>` for "checkbox lists,", and could use a serial comma.
|
||||
- **Proposed solution**: Edit `apps/edit-docs/demo/root/Trilium Demo.html` around line 78: move the `,` out of the `checkbox lists` anchor, add a space before `and`, and optionally add a serial comma before the final list item. Note: this file is authored via `pnpm run edit-docs` and the demo/demo.zip artifact may also need regeneration.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8045 — Mac Client setup doesn't support trailing slash](https://github.com/TriliumNext/Trilium/issues/8045)
|
||||
- **Problem**: The sync-from-server setup form passes `syncServerHost` verbatim, so a trailing slash produces `http://host:port//api/...` URLs.
|
||||
- **Proposed solution**: In `apps/client/src/setup.ts` around line 102, strip trailing slashes: `const syncServerHost = this.syncServerHostInput.value.trim().replace(/\/+$/, "");`. The setup modal is small enough that this single change covers it.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#8188 — Displaying note icon when creating an inline note link, using @](https://github.com/TriliumNext/Trilium/issues/8188)
|
||||
- **Problem**: The `@`-mention feed in CKEditor renders only the highlighted title, no icon, while other autocomplete surfaces show icons. The backend (`apps/server/src/routes/api/autocomplete.ts:70`) already returns `icon`, but it is dropped before reaching the itemRenderer.
|
||||
- **Proposed solution**:
|
||||
1. In `apps/client/src/services/note_autocomplete.ts` `autocompleteSourceForCKEditor` (around lines 63–72), include `icon: row.icon` in the mapped object.
|
||||
2. In `apps/client/src/widgets/type_widgets/text/config.ts` around lines 184–190, prepend an `<span class="bx ...">` using the item's icon inside the generated button.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7884 — Remove `docker-compose.rootless.yaml`, as it is deprecated](https://github.com/TriliumNext/Trilium/issues/7884)
|
||||
- **Problem**: The reporter wants the now-deprecated `docker-compose.rootless.yml` file removed. A `Glob` for `docker-compose.rootless*` at repo root returns nothing, so the file is already gone, but the issue remains open and references to it in docs (if any) should be scrubbed.
|
||||
- **Proposed solution**: Verify no docs still link to `docker-compose.rootless.yml` (quick Grep), then close the issue as already addressed. If any lingering references exist, remove them.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7942 — "Open Command Palette" shortcut opens with the '>' symbol highlighted](https://github.com/TriliumNext/Trilium/issues/7942)
|
||||
- **Problem**: `apps/client/src/widgets/dialogs/jump_to_note.tsx` unconditionally calls `.trigger("select")` in `onShown` (line 85), which highlights the entire input — including the `>` prefix — so the first keystroke wipes out the command-mode marker.
|
||||
- **Proposed solution**: When `mode === "commands"`, instead of selecting all text, place the caret at the end. For example, grab the underlying input and call `setSelectionRange(len, len)` on it; keep `.trigger("select")` for the other modes. Single-file change in `jump_to_note.tsx`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium (needs quick confirm that the autocomplete input is a normal `<input>`)
|
||||
|
||||
---
|
||||
|
||||
## From Batch 04
|
||||
|
||||
### [#7085 — [regression] Archived notes are listed in note search/quick search](https://github.com/TriliumNext/Trilium/issues/7085)
|
||||
- **Problem**: Autocomplete/quick-search returns `#archived` notes after the fuzzy-search rewrite, breaking the previous behaviour.
|
||||
- **Proposed solution**: `searchNotesForAutocomplete` in `apps/server/src/services/search/services/search.ts:671` already passes `includeArchivedNotes: false`, and `parse.ts:472` wraps the expression with `PropertyComparisonExp("isarchived", "=", "false")`. However, `NoteFlatTextExp` in `apps/server/src/services/search/expressions/note_flat_text.ts` is invoked via `getFulltext` and walks `candidateNotes` without consulting `searchContext.includeArchivedNotes`; an archived candidate still produces hits because the `AndExp` short-circuit only filters *final* results through the comparison exp after paths are collected. Add an early `note.hasInheritedLabel('archived')` short-circuit at the top of the `for (const note of candidateNotes)` loop (line 102) gated on `!searchContext.includeArchivedNotes`. A matching test already exists at `search.spec.ts:696` — extend it to cover the autocomplete (flat-text) path.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
### [#7396 — Duplicate a note without cloning it](https://github.com/TriliumNext/Trilium/issues/7396)
|
||||
- **Problem**: User cannot find the already-existing "Duplicate subtree" action and assumes cut/paste is the only way (which clones).
|
||||
- **Proposed solution**: This is a discoverability issue only — `duplicateSubtree` is already wired in `apps/client/src/menus/tree_context_menu.ts`, `apps/client/src/services/note_create.ts`, and has a keyboard shortcut. Close with a comment pointing at the existing context menu item, or (tiny improvement) ensure the label `Duplicate subtree` is in `apps/client/src/translations/en/translation.json` so it's discoverable. No code change needed.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7564 — Change the default sorting of grades to alphabetical order in Trilium](https://github.com/TriliumNext/Trilium/issues/7564)
|
||||
- **Problem**: User question about how to configure multi-key sort (`#sorted=color` plus creation date), not a bug.
|
||||
- **Proposed solution**: No code change — the user describes how to use existing `#sorted` attribute. Close with a pointer to `apps/server/src/assets/doc_notes/en/User Guide/.../Sorting.html`. This belongs in Discussions.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7606 — Preview of markdown](https://github.com/TriliumNext/Trilium/issues/7606)
|
||||
- **Problem**: User asks where the side-by-side markdown preview is.
|
||||
- **Proposed solution**: Trilium is a WYSIWYG editor — "Text" notes render rich text directly, not markdown, so there is no preview pane by design. Close with explanation or redirect to the Markdown import/export docs. No code change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7274 — Insert internal links to notes in the canvas and mind map](https://github.com/TriliumNext/Trilium/issues/7274)
|
||||
- **Problem**: User question about whether internal links can be inserted inside canvas/mind-map objects.
|
||||
- **Proposed solution**: This overlaps with the long-standing limitation of Excalidraw/mind-map link handling. Likely duplicate of a canvas-link feature request. Close as duplicate / redirect to Discussions. No code change here (real implementation work lives under #7182 and related).
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#7072 — How to obtain recent_notes to achieve the system menu bar effect](https://github.com/TriliumNext/Trilium/issues/7072)
|
||||
- **Problem**: User asks how to build a custom widget reading from `recent_notes`.
|
||||
- **Proposed solution**: Support question. The `recent_notes` table is exposed via the autocomplete endpoint in `apps/server/src/routes/api/autocomplete.ts:40` and via `api.runOnBackend` scripting. Redirect to Discussions / scripting docs. No code change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
---
|
||||
|
||||
## From Batch 05
|
||||
|
||||
### [#6387 — Current OpenID Connect Implementation is not compatible with Authelia](https://github.com/TriliumNext/Trilium/issues/6387)
|
||||
- **Problem**: `afterCallback` in `open_id.ts` blindly calls `req.oidc.user.name.toString()` / `.email.toString()`, crashing with `Cannot read properties of undefined (reading 'toString')` when the IdP (Authelia) does not return `name`/`email` in `req.oidc.user`.
|
||||
- **Proposed solution**: In `apps/server/src/services/open_id.ts` lines 125–137, guard the `.toString()` calls (e.g. `req.oidc.user.name?.toString() ?? ""`) and/or call `await req.oidc.fetchUserInfo()` to populate user claims before saving. `sub` is the only reliably-present field; `name`/`email` should fall back gracefully.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high — verified source still matches the line referenced in the issue and the null-deref still exists.
|
||||
|
||||
### [#6390 — `arm64` docker image does not include `wget`](https://github.com/TriliumNext/Trilium/issues/6390)
|
||||
- **Problem**: Third-party tooling (Coolify) depends on `wget` being present in the docker image for healthchecks.
|
||||
- **Proposed solution**: Either (a) document that Trilium healthchecks now use the bundled `docker_healthcheck.cjs` (no `wget` required at all — both `apps/server/Dockerfile` and `Dockerfile.alpine` only install `gosu`/`su-exec`), or (b) add `wget` to the apt/apk install line in `apps/server/Dockerfile` and `Dockerfile.alpine` for backwards-compat with external tooling. Option (a) is the right call; Coolify should be updated. Either way this is a 1–2 line change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium — the fix itself is trivial but whether to actually add wget is a policy call for maintainers.
|
||||
|
||||
### [#5790 — Can't pull `rootless` docker tag](https://github.com/TriliumNext/Trilium/issues/5790)
|
||||
- **Problem**: `docker pull triliumnext/notes:rootless` returns "manifest unknown"; the docs reference a tag that does not exist on Docker Hub (the image is now published as `triliumnext/trilium`, not `triliumnext/notes`).
|
||||
- **Proposed solution**: Update the docs at `apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.html` (and the `Using Docker.md` referenced in the issue) to use `triliumnext/trilium:rootless` (the repo was renamed from `Notes` to `Trilium` and there are now `Dockerfile.rootless` / `Dockerfile.alpine.rootless` files in `apps/server/`). Also confirm the rootless tag is actually published in the CI workflow under `.github/workflows/`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — docs fix is trivial but it may also require fixing the publish workflow if the tag is not pushed.
|
||||
|
||||
### [#6730 — Clear or disable search history](https://github.com/TriliumNext/Trilium/issues/6730)
|
||||
- **Problem**: Jump-to-note results are cluttered with Search History entries; no way to hide/clear them.
|
||||
- **Proposed solution**: The command-palette already has a "show-search-history" entry (`apps/client/src/services/command_registry.ts` line 83). The jump-to dialog at `apps/client/src/widgets/dialogs/jump_to_note.tsx` likely surfaces history as part of its result list — either add an option to filter them out or add a "Clear history" action. A quick win: add a user-option-backed toggle (e.g. `jumpToShowSearchHistory` default true) and skip search-history notes when false. New key under `apps/client/src/translations/en/translation.json`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — depends on whether jump-to currently blends history entries via a single query; needs a quick read of `jump_to_note.tsx` to confirm.
|
||||
|
||||
### [#6134 — The checkbox and cursor in the to-do list are too close](https://github.com/TriliumNext/Trilium/issues/6134)
|
||||
- **Problem**: In todo lists, the checkbox and the caret/text sit with no visual spacing.
|
||||
- **Proposed solution**: Adjust the padding/margin of `.ck-content .todo-list .todo-list__label > input` (or `.todo-list__label__description`) in `apps/client/src/stylesheets/style.css` around line 1184 — add a small `margin-inline-end` / `gap` on the label. One-line CSS tweak.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium — CSS adjust is trivial but exact value needs design call.
|
||||
|
||||
### [#6468 — Table function area blocks the text function area](https://github.com/TriliumNext/Trilium/issues/6468)
|
||||
- **Problem**: When a CKEditor table is tall, the sticky table toolbar floats over the main text toolbar.
|
||||
- **Proposed solution**: CSS tweak to give the main CKEditor toolbar a higher `z-index` than the inline table toolbar, or add a top-offset on the table toolbar so it doesn't overlap. Candidate file `apps/client/src/stylesheets/ckeditor-theme.css` (or `style.css`). Target `.ck-toolbar_floating` / `.ck.ck-balloon-panel`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — CSS z-index/offset fix is cheap but the root cause may involve CKEditor's own balloon/toolbar stacking context.
|
||||
|
||||
### [#6555 — Unable to set column value to zero in table view](https://github.com/TriliumNext/Trilium/issues/6555)
|
||||
- **Problem**: Entering `0` in a Number column in Table view clears the label instead of saving "0".
|
||||
- **Proposed solution**: In `apps/client/src/widgets/collections/table/row_editing.ts` around line 42, `newValue = cell.getValue()` returns a number. The boolean branch already stringifies, but the plain-label branch passes a number through to `setLabel`. Add `if (typeof newValue === "number") newValue = String(newValue);` before the `setLabel` call. Also verify the server-side `set-attribute` endpoint doesn't coerce `0` to empty (`apps/server/src/routes/routes.ts` handler).
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — client fix is 1 line, server may also need a touch.
|
||||
|
||||
### [#6204 — Presence of #workspaceCalendarRoot affects how notes are displayed](https://github.com/TriliumNext/Trilium/issues/6204)
|
||||
- **Problem**: When a note has both `#viewType=calendar` and `#workspaceCalendarRoot`, events are forced to all-day (only `#dateNote` notes shown) and `#startTime`/`#endTime` are ignored.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/collections/calendar/index.tsx` (verified existing file), `isCalendarRoot = (calendarRoot || workspaceCalendarRoot)` collapses both flags into a single "date-note only" mode. The bug is the OR — workspaceCalendarRoot should NOT enable the date-note-only event builder unless the user also set `calendarRoot`. Suggest decoupling: only force date-note mode when `calendarRoot` is set, and let `workspaceCalendarRoot` simply mark the note as a workspace root without changing the event source. Single-file change.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — behavioral fix clearly localized, but intent of `workspaceCalendarRoot` needs maintainer confirmation.
|
||||
|
||||
### [#6518 — Open child note from table view by clicking note name](https://github.com/TriliumNext/Trilium/issues/6518)
|
||||
- **Problem**: Clicking a note title in the Table view starts renaming instead of opening the note.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/collections/table/columns.tsx` / `row_editing.ts`, change the title column so that a single click opens the note (via `appContext.tabManager.getActiveContext()?.setNote()`) and double-click (or a dedicated pencil area) starts editing. Tabulator supports this through `cellClick` + `editable` on double-click.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — clearly confined to the table view module.
|
||||
|
||||
### [#6817 — Jump To…: Create new notes in Inbox (not as child notes)](https://github.com/TriliumNext/Trilium/issues/6817)
|
||||
- **Problem**: When the Jump-to dialog creates a new note, it uses the current parent, but users expect it to land in the Inbox.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/dialogs/jump_to_note.tsx`, when creating a new note, resolve the inbox note (`dateNotesService.getInboxNote()` equivalent in the client — there's already an `inboxNote` helper via `#inbox` attribute lookup). Simple target-parent swap. Optionally add a setting toggle.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — small code change; might want a user-setting to keep it opt-in.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 06
|
||||
|
||||
### [#5712 — Tooltip z-index is too low?](https://github.com/TriliumNext/Trilium/issues/5712)
|
||||
- **Problem**: Tooltips in context menus appear behind Bootstrap modals because tooltip z-index is `calc(var(--ck-z-panel) - 1)` (~998), while Bootstrap modal z-index is 1055.
|
||||
- **Proposed solution**: In `apps/client/src/stylesheets/style.css` around line 733, raise `.tooltip` z-index above modal (e.g. `z-index: 1060 !important;` to match the Bootstrap default of 1080, or set it with `calc(var(--bs-modal-zindex, 1055) + 5)`). Confirmed the file at `apps/client/src/stylesheets/style.css:731-734` still has the old value and `bootstrap.rtl.css:5454` sets `--bs-modal-zindex: 1055`.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5617 — Clean up the code formatting](https://github.com/TriliumNext/Trilium/issues/5617)
|
||||
- **Problem**: Maintenance task — enable format-on-save, apply formatting to repo, enable import sort/unused-import cleanup.
|
||||
- **Proposed solution**: Flip `editor.formatOnSave` to `true` in `.vscode/settings.json` (currently line 2: `"editor.formatOnSave": false`), add import ordering ESLint rule, then run `pnpm prettier --write`/eslint autofix on the codebase. The repo already has `eslint-config-prettier` and `@stylistic` rules wired up.
|
||||
- **Effort**: small (mechanical, but touches many files)
|
||||
- **Confidence**: medium — task scope is clear but apply-all-fix is large enough to risk conflicts with open PRs (as the issue itself warns).
|
||||
|
||||
---
|
||||
|
||||
## From Batch 07
|
||||
|
||||
### [#5494 — Context Menu click on Submenu parent should not trigger event/close the context menu](https://github.com/TriliumNext/Trilium/issues/5494)
|
||||
- **Problem**: Left-clicking a submenu parent (e.g. "Insert note after") still fires its own `handler` / `selectMenuItemHandler`, creating a new note without the user actually picking a subitem.
|
||||
- **Proposed solution**: In `apps/client/src/menus/context_menu.ts` (createMenuItem mousedown handler, around lines 319–323), gate the `item.handler(...)` and `selectMenuItemHandler(...)` calls behind `if (!("items" in item && item.items))`. The non-mobile branch already short-circuits `this.hide()` for submenu parents (line 315), so only the handler invocation needs the same guard.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5371 — Titles of Settings/Options are renamable](https://github.com/TriliumNext/Trilium/issues/5371)
|
||||
- **Problem**: The title input in Options pages is editable, letting users rename hidden system notes like `_optionsAppearance`.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/note_title.tsx` (lines 24–32), extend the `isReadOnly` check to also return `true` when `note.noteId.startsWith("_options")` (alongside the existing `_help_` and `isLaunchBarConfig` clauses).
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5375 — `replaceMathTextWithKatax` method is duplicated in `highlight_list.ts` and `toc.js`](https://github.com/TriliumNext/Trilium/issues/5375)
|
||||
- **Problem**: Same helper exists in both `highlights_list.ts` and `toc.ts` (verified via Grep — `toc.ts:240` and `highlights_list.ts`).
|
||||
- **Proposed solution**: Extract the function into a small shared module under `apps/client/src/services/` (e.g. `math_renderer.ts`) and import it from both widgets. Pure refactor, no behavior change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5311 — New API method: isMobile()](https://github.com/TriliumNext/Trilium/issues/5311)
|
||||
- **Problem**: Scripts have no way to detect if they are running on the mobile/desktop/web client.
|
||||
- **Proposed solution**: `utils.isMobile()` already exists in `apps/client/src/services/utils.ts:226`. Just expose it on the frontend script API — add `isMobile: utils.isMobile` to the API constructor in `apps/client/src/services/frontend_script_api.ts` (and the Preact variant) alongside the other utility re-exports. No backend work needed.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5513 — UX: friendly numbers in settings: Sync timeout](https://github.com/TriliumNext/Trilium/issues/5513)
|
||||
- **Problem**: Sync timeout is shown in milliseconds with no human-friendly unit (sub-task of #5336).
|
||||
- **Proposed solution**: In `apps/client/src/widgets/type_widgets/options/sync.tsx` (around line 59–65), either change the unit to seconds (divide/multiply by 1000 on read/write) or reuse a "time value + unit" composite, plus update the `sync_2.timeout_unit` key in `apps/client/src/translations/en/translation.json` (currently "milliseconds").
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium (straightforward but touches save/load conversion)
|
||||
|
||||
### [#5444 — UX: friendly numbers in settings: Zoom factor (percent better than decimal factor)](https://github.com/TriliumNext/Trilium/issues/5444)
|
||||
- **Problem**: Zoom factor in Appearance options is shown as a 0.3–2.0 decimal (verified at `appearance.tsx:342–347`), while the global menu already uses percent.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/type_widgets/options/appearance.tsx` `ElectronIntegration`, switch the `FormTextBox` to a percent input (min 30, max 200, step 10) and multiply/divide by 100 when reading/writing the `zoomFactor` option. The ideal refactor (extracting `zoom-container` from `global_menu.tsx`) is nice-to-have but not required for a first fix.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5414 — Localization: add support to follow the system language](https://github.com/TriliumNext/Trilium/issues/5414)
|
||||
- **Problem**: No "System default" option in the locale dropdown.
|
||||
- **Proposed solution**: Add a sentinel value (e.g. `"auto"`) to the locale combo in `apps/client/src/widgets/type_widgets/options/i18n.tsx` and make it the default for new installs. When selected, resolve the effective locale by matching `navigator.language` against the list of supported locales (`apps/client/src/services/i18n.ts` exposes them), falling back to English. No server changes required because language is a client option.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
### [#5376 — Add "Open Note" to list of search actions](https://github.com/TriliumNext/Trilium/issues/5376)
|
||||
- **Problem**: Search actions lack an "Open Note" entry to open all matching notes.
|
||||
- **Proposed solution**: Search actions are registered in `apps/server/src/services/search/actions/` (e.g. `set_attribute.ts`, etc.) and the UI picker in `apps/client/src/widgets/search_actions/`. Add a new action class that emits an `openNote`/`openNoteInNewTab` command per result, plus a corresponding UI entry. Modest scope because existing actions already provide a clear template.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
---
|
||||
|
||||
## From Batch 08
|
||||
|
||||
### [#5250 — (Feature request) Prevent options note title changes](https://github.com/TriliumNext/Trilium/issues/5250)
|
||||
- **Problem**: Titles of hidden options notes (e.g. `_optionsAppearance`) are editable by the user, which is inconsistent since their titles come from translations.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/note_title.tsx` (the `isReadOnly` computation around lines 25-31), add a condition for hidden/system notes. Simplest: `note.noteId.startsWith("_options")` (or more broadly, `note.noteId.startsWith("_") && !isLaunchBarConfig(...)` — but that's riskier). The existing pattern already handles `_help_` and launch bar config, so extending it with options IDs is a one-line change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5201 — (Feature request) Disable text selection in mermaid diagrams?](https://github.com/TriliumNext/Trilium/issues/5201)
|
||||
- **Problem**: Dragging to pan a mermaid diagram also selects text, which interferes with pan gesture.
|
||||
- **Proposed solution**: Add the CSS rule (`user-select: none; -webkit-user-select: none;`) to `.mermaid-render` in the mermaid type widget's CSS. Issue author provides the exact CSS. Locate the mermaid type widget under `apps/client/src/widgets/type_widgets/` and append to its stylesheet — no need for a settings toggle as a first pass.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#5220 — (Feature request) Add the `#appJs` attribute to load a custom script](https://github.com/TriliumNext/Trilium/issues/5220)
|
||||
- **Problem**: `#appCss` exists for globally loading CSS from a note; an analogous `#appJs` would let users ship a JS library once instead of cloning it into every render note.
|
||||
- **Proposed solution**: Mirror the existing `#appCss` handling — grep for `appCss` in `apps/server/src/` and `apps/client/src/` and add a parallel path that injects a `<script>` tag. The mechanism is well-established; mostly copy/paste. Document the obvious security caveats in the attribute docs (labels.html).
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium (easy code-wise; security framing may prompt more review)
|
||||
|
||||
---
|
||||
|
||||
## From Batch 09
|
||||
|
||||
### [#4584 — (Feature Request) Hide hidden notes from `similar notes` view](https://github.com/TriliumNext/Trilium/issues/4584)
|
||||
- **Problem**: Similar-notes results include notes living inside the `_hidden` subtree (templates, system notes, launchers), polluting the list.
|
||||
- **Proposed solution**: In `apps/server/src/becca/similarity.ts` around line 411 (`for (const candidateNote of Object.values(becca.notes))`), skip candidates where `candidateNote.isHiddenCompletely()` is true. The helper already exists on `BNote` (`apps/server/src/becca/entities/bnote.ts:1203`), so this is a one-liner guard.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#4780 — (Feature request) Change Icon for Jump to Note](https://github.com/TriliumNext/Trilium/issues/4780)
|
||||
- **Problem**: The Jump-to-Note launcher icon is `bx bx-send` (a paper-airplane/send icon), which suggests sending instead of navigating.
|
||||
- **Proposed solution**: Change `icon: "bx bx-send"` to a navigation-style icon (e.g. `"bx bx-navigation"`, `"bx bx-log-in"`, `"bx bx-crosshair"`) in `apps/server/src/services/hidden_subtree_launcherbar.ts` at lines 105 and the second occurrence near line 194. Existing installations should pick up the change because launcher bar items are created via `HiddenSubtreeItem`; since the icon is stored as an attribute, add `enforceAttributes: true` to that entry if the icon should override user customisations.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high (trivial to change; needs confirmation of the enforcement behaviour)
|
||||
|
||||
### [#4543 — (Bug report) Orphaned keyboardShortcuts* options after upgrade](https://github.com/TriliumNext/Trilium/issues/4543)
|
||||
- **Problem**: Users upgraded from 0.59.x have stale `keyboardShortcutsShowNoteRevisions` and `keyboardShortcutsForceSaveNoteRevision` option rows that produce “Keyboard action … found in database, but not in action definition.” warnings on every startup. The active action names are `showRevisions` / `forceSaveRevision` (`apps/server/src/services/keyboard_actions.ts:449,825`).
|
||||
- **Proposed solution**: Add a small migration under `apps/server/src/migrations/` that deletes the two orphaned options: `DELETE FROM options WHERE name IN ('keyboardShortcutsShowNoteRevisions','keyboardShortcutsForceSaveNoteRevision')`. Follow the pattern of existing migrations and register it in `apps/server/src/migrations/migrations.ts`.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
---
|
||||
|
||||
## From Batch 10
|
||||
|
||||
### [#4051 — (Bug report) Protected notes visible in Edited Notes](https://github.com/TriliumNext/Trilium/issues/4051)
|
||||
- **Problem**: The "Edited Notes" sidebar on day notes lists protected notes with their real titles even without an active protected session, leaking encrypted data.
|
||||
- **Proposed solution**: In `apps/server/src/routes/api/revisions.ts` `getEditedNotesOnDate()` (around line 155-189), filter out protected notes when no protected session is active. After `let notes = becca.getNotes(...)`, add a filter using `protectedSessionService.isProtectedSessionAvailable()` (from `apps/server/src/services/protected_session.ts`) to either skip `note.isProtected` rows or replace their title/content with a placeholder, mirroring how other protected-aware endpoints behave.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#4150 — Mobile interface, add 'move note' to note menu](https://github.com/TriliumNext/Trilium/issues/4150)
|
||||
- **Problem**: The mobile burger menu previously lacked a "move note" action.
|
||||
- **Proposed solution**: Likely already resolved: `apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx` now composes the shared `NoteContextMenu` (`widgets/ribbon/NoteActions.tsx`) which already exposes move commands. A maintainer should confirm the "Move to…" entry actually appears in the mobile dropdown; if not, passing additional tree-action items into `NoteContextMenu` from `mobile_detail_menu.tsx` is a one-file change.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium
|
||||
|
||||
### [#3751 — (Bug report) Logging api.startNote in backend JS script crashes app](https://github.com/TriliumNext/Trilium/issues/3751)
|
||||
- **Problem**: `api.log(api.startNote)` crashes the server because `ws.js` does `JSON.stringify` on an object graph containing circular refs.
|
||||
- **Proposed solution**: In the log sender (grep for `JSON.stringify` in `apps/server/src/services/ws.ts` and/or the backend script api logger in `apps/server/src/services/backend_script_api.ts`), wrap `JSON.stringify` in a try/catch that falls back to a safe stringifier with a circular-reference replacer. Reporter already linked the MDN example.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high
|
||||
|
||||
### [#4178 — api.$container is null error for statistics js script](https://github.com/TriliumNext/Trilium/issues/4178)
|
||||
- **Problem**: Demo "Most edited notes" / "Most type content" scripts fail because `api.$container` is null when the script runs outside a render-widget context.
|
||||
- **Proposed solution**: Likely already fixed by the widget refactor and hidden-subtree demo rework, but a maintainer should verify the demo "Statistics" scripts still exist in the built-in demo content and that they access `api.$container` only when rendered as a render note. If the demo still ships, a null-guard (`if (!api.$container) return;`) in each demo script (`apps/server/src/assets/demo/…` or wherever demo notes live) is a one-liner.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: low
|
||||
|
||||
### [#3746 — (Feature request) add "include title" option in the "include note" windows](https://github.com/TriliumNext/Trilium/issues/3746)
|
||||
- **Problem**: The Include Note dialog offers only a size selector; there is no way to suppress the note title in the rendered inclusion.
|
||||
- **Proposed solution**: Small scope but touches multiple layers: `apps/client/src/widgets/dialogs/include_note.tsx` to add a checkbox, `packages/ckeditor5/src/plugins/includenote.ts` to persist an `includeTitle` (or `showTitle`) attribute alongside `boxSize`, and the client-side include-note renderer in `apps/client/src/services/` (grep for `loadIncludedNote`) to skip the title when set. Still contained to a well-understood area.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium
|
||||
|
||||
---
|
||||
|
||||
## From Batch 11
|
||||
|
||||
### [#3697 — Docker : Set USER_GID to 100 (Feature request)](https://github.com/TriliumNext/Trilium/issues/3697)
|
||||
- **Problem**: `start-docker.sh` runs `groupmod -g ${USER_GID} node`, which fails when GID 100 already exists (e.g. Unraid's default `users` group).
|
||||
- **Proposed solution**: `apps/server/start-docker.sh` line 4 currently uses `groupmod -og ${USER_GID} node` (the `-o` flag allows a non-unique GID). This is likely already the fix — verify the published Docker image ships this and close. If `rootless-entrypoint.sh` still lacks `-o`, add it there too.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high (code already uses `-og`, just needs image-release verification)
|
||||
|
||||
---
|
||||
|
||||
## From Batch 12
|
||||
|
||||
### [#3151 — (Bug report) Import from HTML does not restore indentation](https://github.com/TriliumNext/Trilium/issues/3151)
|
||||
- **Problem**: Exported HTML has `style="margin-left:40px"` on `<p>` but importing strips that style, losing indentation.
|
||||
- **Proposed solution**: In `/home/elian/Projects/Trilium/apps/server/src/services/html_sanitizer.ts` (line ~49 `allowedStyles`), add `margin-left` (and likely `padding-left`, `text-align`) to the allowed styles for `p` (or `*`). Currently only `color`/`background-color` are globally allowed; the entire `style` attribute is preserved but sanitize-html strips unknown properties.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high
|
||||
|
||||
### [#2817 — open internal link in OSX apps](https://github.com/TriliumNext/Trilium/issues/2817)
|
||||
- **Problem**: `bookends:` URLs don't open externally from notes because the protocol isn't in the allow-list.
|
||||
- **Proposed solution**: Add `bookends` (and any other commonly requested scheme) to `ALLOWED_PROTOCOLS` in `/home/elian/Projects/Trilium/packages/commons/src/lib/shared_constants.ts`. The CKEditor/link handler already calls `electron.shell.openExternal` for allowed protocols (see `apps/client/src/services/link.ts:338`).
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: medium (fix is trivial; user may also need CKEditor to permit `bookends:` hrefs in the schema)
|
||||
|
||||
---
|
||||
|
||||
## From Batch 13
|
||||
|
||||
### [#2362 — "Delete all clones" checkbox should have a different message if there are no clones](https://github.com/TriliumNext/Trilium/issues/2362)
|
||||
- **Problem**: The "Delete all clones" checkbox is always rendered in the delete dialog even when the note has no clones, confusing users who don't know whether to tick it.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/dialogs/delete_notes.tsx`, compute the clone count from `noteIdsToBeDeleted` vs the branch count (or use a server-returned count). When `cloneCount <= 1`, render an info alert like "This note has no clones" instead of the `FormCheckbox`. When clones exist, append the count to the label (`delete_notes.delete_all_clones_description_n`). Add the new translation keys to `apps/client/src/translations/en/translation.json`.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — may need to thread a clone count through `delete-notes-preview` response if not already available.
|
||||
|
||||
### [#2455 — Various feature requests (new-tab autocomplete focus portion only)](https://github.com/TriliumNext/Trilium/issues/2455)
|
||||
- **Problem**: When opening a new tab, the caret is no longer inside the "search for a note by its name" autocomplete field; user has to manually click it.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/type_widgets/Empty.tsx`, add `autocompleteRef.current?.focus()` inside the existing `useEffect` that calls `note_autocomplete.showRecentNotes`. Only the focus subpart of this meta-issue is easy; the other sub-items (Tab navigation in search results, shortcut collisions inside search field, scroll shortcuts) are not in scope.
|
||||
- **Effort**: trivial
|
||||
- **Confidence**: high for the focus part only.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 14
|
||||
|
||||
### [#1712 — [UI/Low priority] Disable "Internal trilium link (Ctrl+L)" on code-block text selection](https://github.com/TriliumNext/Trilium/issues/1712)
|
||||
- **Problem**: The "Internal Trilium link" toolbar button remains enabled when text inside a code block is selected even though all other formatting buttons are disabled.
|
||||
- **Proposed solution**: In the CKEditor plugin that registers the `internallink` command (search `packages/ckeditor5*` for the command), override `refresh()` to also disable the command when the selection is inside a `codeBlock` element (use `isAllowedInSelection` / `schema.checkChild` against the selection's parent). Similar pattern is used by the built-in `link` command.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — requires locating the custom plugin but the fix is a one-line schema check
|
||||
|
||||
### [#1643 — [FEATURE] note revision preview for `Saved search` notes](https://github.com/TriliumNext/Trilium/issues/1643)
|
||||
- **Problem**: Saved search notes don't have a revision preview in the revisions dialog despite being simple JSON content.
|
||||
- **Proposed solution**: In `apps/client/src/widgets/dialogs/revisions.*` (or wherever revision content is rendered), add a branch that renders saved-search revision content as plain JSON/text like code notes. Likely a missing `else if (type === "search")` path.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — needs code inspection to confirm the exact switch
|
||||
|
||||
---
|
||||
|
||||
## From Batch 15
|
||||
|
||||
### [#762 — [UX] Print paths with colored '/' separators](https://github.com/TriliumNext/Trilium/issues/762)
|
||||
- **Problem**: When a note title contains `/`, the note-path breadcrumbs become ambiguous; a visually distinct separator would disambiguate.
|
||||
- **Proposed solution**: In the path-rendering code (search `apps/client/src/services/tree.ts` / `apps/client/src/widgets/note_tree.ts` for `getNotePath` / `/` concatenation, and `apps/client/src/widgets/note_path_list_widget.*`), wrap the separator in `<span class="note-path-separator">/</span>` and add a subtle color/bold rule in the corresponding CSS. Purely a rendering tweak.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — straightforward once the exact render site is located.
|
||||
|
||||
### [#342 — Warn if user is trying to run the script in a wrong environment](https://github.com/TriliumNext/Trilium/issues/342)
|
||||
- **Problem**: When a frontend script is invoked on the backend (or vice versa) it silently fails; the user gets no helpful message.
|
||||
- **Proposed solution**: In `apps/server/src/services/script.ts` (backend execution) check `note.mime` / `note.getLabelValue("runOnBackend")` against the caller context and throw a descriptive error; mirror in `apps/client/src/services/script_context.ts` for frontend. Single `if` with a clear error message per side.
|
||||
- **Effort**: small
|
||||
- **Confidence**: medium — the two script runners exist, just need a type guard + thrown error.
|
||||
|
||||
### [#21 — Script execution should error out on usage of protected notes outside of protected session](https://github.com/TriliumNext/Trilium/issues/21)
|
||||
- **Problem**: Scripts silently fail in unpredictable ways when they access protected notes without a protected session.
|
||||
- **Proposed solution**: In `apps/server/src/services/script.ts` (and `script_context.ts`), before invoking the script check `note.isProtected && !protectedSessionService.isProtectedSessionAvailable()` and throw a clear error (e.g. "Cannot run protected script without a protected session"). No such guard currently exists per `grep` on the script services.
|
||||
- **Effort**: small
|
||||
- **Confidence**: high — isolated pre-check in one place.
|
||||
@@ -1,616 +0,0 @@
|
||||
# Feature Request Fit Analysis — Trilium
|
||||
|
||||
Every one of the **423 open feature requests** in TriliumNext/Trilium was individually classified by a subagent against Trilium's product identity. The question asked for each issue was: **"Can this reasonably be integrated into Trilium, or is it too specific / out of scope?"**
|
||||
|
||||
## Headline numbers
|
||||
|
||||
| Category | Count | % | Recommendation |
|
||||
|---|---:|---:|---|
|
||||
| **Strong fit** | 108 | 25.5% | Clear alignment with core subsystems — accept and prioritize |
|
||||
| **Reasonable fit** | 181 | 42.8% | QoL improvements to existing subsystems — accept contributions |
|
||||
| **Niche / scripting territory** | 77 | 18.2% | Better as user scripts or custom note types — redirect |
|
||||
| **Out of scope** | 55 | 13.0% | Doesn't fit Trilium's identity — close with rationale |
|
||||
| **Unclear** | 2 | 0.5% | Needs clarification from reporter |
|
||||
| **Total** | 423 | 100% | |
|
||||
|
||||
**Net read:** about **68%** of feature requests (Strong + Reasonable) align with Trilium's direction and could be accepted if someone writes the code. About **18%** would be better served by user scripts or custom note types than core changes. Roughly **13%** don't fit and could be closed with a clear rationale.
|
||||
|
||||
## Interpretation guide
|
||||
|
||||
- **Strong fit** = the feature maps directly onto an existing subsystem (search, sync, share, templates, attributes, tree, etc.) and would obviously be welcome. The only thing missing is an implementation.
|
||||
- **Reasonable fit** = nice-to-have polish or extension, fits the subsystem, would be accepted if someone contributed it. Not an architectural stretch.
|
||||
- **Niche / scripting territory** = probably serves a small audience or very specific workflow. Trilium already has a scripting API and custom note types — these requests could live there instead of core. The rationale includes a suggested alternative (script, template, plugin, backend API call).
|
||||
- **Out of scope** = would fundamentally change what Trilium is. Common rejection reasons: real-time collaboration, multi-tenant/CMS publishing, IDE features, block-level transclusion beyond the note model, replacing the sync/crypto protocol, hosting provider lock-in, vendor promos, full-blown kanban/calendar-first alternatives to the note tree.
|
||||
- **Unclear** = the issue body didn't give the reviewer enough to judge. Not a rejection — the reporter should clarify.
|
||||
|
||||
## Per-batch counts
|
||||
|
||||
| Batch | Strong | Reasonable | Niche | Out-of-scope | Unclear | Total |
|
||||
|---:|---:|---:|---:|---:|---:|---:|
|
||||
| [01](_features/batch-01-fit.md) | 5 | 13 | 5 | 0 | 0 | 23 |
|
||||
| [02](_features/batch-02-fit.md) | 4 | 12 | 5 | 2 | 0 | 23 |
|
||||
| [03](_features/batch-03-fit.md) | 6 | 11 | 5 | 1 | 1 | 24 |
|
||||
| [04](_features/batch-04-fit.md) | 6 | 12 | 5 | 1 | 0 | 24 |
|
||||
| [05](_features/batch-05-fit.md) | 4 | 11 | 6 | 3 | 0 | 24 |
|
||||
| [06](_features/batch-06-fit.md) | 12 | 13 | 2 | 4 | 0 | 31 |
|
||||
| [07](_features/batch-07-fit.md) | 6 | 9 | 4 | 2 | 0 | 21 |
|
||||
| [08](_features/batch-08-fit.md) | 6 | 12 | 2 | 4 | 1 | 25 |
|
||||
| [09](_features/batch-09-fit.md) | 7 | 14 | 8 | 5 | 0 | 34 |
|
||||
| [10](_features/batch-10-fit.md) | 9 | 15 | 6 | 5 | 0 | 35 |
|
||||
| [11](_features/batch-11-fit.md) | 11 | 14 | 5 | 4 | 0 | 34 |
|
||||
| [12](_features/batch-12-fit.md) | 11 | 14 | 4 | 5 | 0 | 34 |
|
||||
| [13](_features/batch-13-fit.md) | 8 | 12 | 9 | 8 | 0 | 37 |
|
||||
| [14](_features/batch-14-fit.md) | 8 | 11 | 7 | 9 | 0 | 35 |
|
||||
| [15](_features/batch-15-fit.md) | 5 | 8 | 4 | 2 | 0 | 19 |
|
||||
|
||||
---
|
||||
|
||||
## Strong Fit (108)
|
||||
|
||||
These features plug directly into existing Trilium subsystems and would be obviously welcome additions. Use this list as an "accept if PR comes in" queue.
|
||||
|
||||
### From Batch 15
|
||||
|
||||
- [#1046 — Global shortcut](https://github.com/TriliumNext/Trilium/issues/1046) — A global hotkey for quick note capture/search is a standard feature for desktop PKM apps and fits the Electron desktop layer.
|
||||
- [#139 — Label listing can be clickable and lead to search of given label](https://github.com/TriliumNext/Trilium/issues/139) — Clickable labels that trigger a search are a natural extension of the existing attribute and search subsystems.
|
||||
- [#728 — FR: Export search results](https://github.com/TriliumNext/Trilium/issues/728) — Export already exists for subtrees, and extending it to search results is a clean power-user improvement that reuses existing export infrastructure.
|
||||
- [#814 — Ability to add a tag to a page when clipping](https://github.com/TriliumNext/Trilium/issues/814) — Adding user-specified tags at clip time fits squarely with the web clipper and Trilium's attribute-driven organization model.
|
||||
- [#926 — Option to not to expand parent note when note is made it's child](https://github.com/TriliumNext/Trilium/issues/926) — A small tree-view UX fix directly targeting the core note tree widget.
|
||||
### From Batch 14
|
||||
|
||||
- [#1170 — How to disable note editing in mobile front end?](https://github.com/TriliumNext/Trilium/issues/1170) — A global read-only default for mobile is a sensible UX toggle for the existing mobile web client.
|
||||
- [#1181 — Make tabs keep the scroll on the tree left panel](https://github.com/TriliumNext/Trilium/issues/1181) — Preserving tree scroll state per tab is a core navigation fix for the existing tab/tree subsystem.
|
||||
- [#1193 — Sort results in Jump to note by frequency of use?](https://github.com/TriliumNext/Trilium/issues/1193) — Ranking Jump-to-note by recency/frequency is a direct and commonly expected improvement to an existing core widget.
|
||||
- [#1266 — Suggestion for Recent Changes](https://github.com/TriliumNext/Trilium/issues/1266) — Splitting Recent Changes into modified vs deleted sections is a minor, concrete improvement to an existing dialog.
|
||||
- [#1267 — Is it possible to make INSERT NOTE optional?](https://github.com/TriliumNext/Trilium/issues/1267) — Per-parent default child note type aligns with Trilium's attribute-driven configuration model.
|
||||
- [#1426 — request: unlinked references](https://github.com/TriliumNext/Trilium/issues/1426) — Unlinked references (title mentions not yet linked) is a standard PKM feature that fits naturally with Trilium's backlinks system.
|
||||
- [#1668 — Search autocompletion for labels](https://github.com/TriliumNext/Trilium/issues/1668) — Reusing the existing attribute autocomplete in quick/saved search is a clear UX parity improvement.
|
||||
- [#1715 — Page up/down in note selection dialogs](https://github.com/TriliumNext/Trilium/issues/1715) — Trivial accessibility/keyboard improvement to existing dialogs.
|
||||
### From Batch 13
|
||||
|
||||
- [#1763 — custom title for saved search results](https://github.com/TriliumNext/Trilium/issues/1763) — Showing note path/context in search results is a core usability improvement for a hierarchical note tree where duplicate titles are common.
|
||||
- [#1921 — UI improvement for dangling links](https://github.com/TriliumNext/Trilium/issues/1921) — Distinguishing links to missing/empty notes is a standard wiki-style PKM feature that fits Trilium's linking model.
|
||||
- [#1967 — Manually save note revision and add comment](https://github.com/TriliumNext/Trilium/issues/1967) — Named/annotated manual revisions are a natural extension of the existing BRevision system and requested by power users.
|
||||
- [#2053 — Search for dates in different formats](https://github.com/TriliumNext/Trilium/issues/2053) — Flexible date parsing in search directly improves the existing date-note/search subsystem.
|
||||
- [#2203 — Option to not expand subtree when opening subnote](https://github.com/TriliumNext/Trilium/issues/2203) — Legitimate tree navigation option fitting the existing expansion/archived visibility controls.
|
||||
- [#2281 — Switch to existing tab if note already open](https://github.com/TriliumNext/Trilium/issues/2281) — Sensible tab-management behavior aligned with how the multi-tab UI already works.
|
||||
- [#2473 — Show branch prefix in quick search](https://github.com/TriliumNext/Trilium/issues/2473) — Small bug-adjacent fix to make quick search respect the existing branch-prefix feature.
|
||||
- [#2477 — Automatically delete/unhide unsaved search notes](https://github.com/TriliumNext/Trilium/issues/2477) — Cleanup of ephemeral hidden-subtree search notes is a clear hygiene improvement for existing infrastructure.
|
||||
### From Batch 12
|
||||
|
||||
- [#2488 — Show attributes on shared notes](https://github.com/TriliumNext/Trilium/issues/2488) — Shared notes subsystem already surfaces note metadata and exposing attributes (e.g., source URL from web clipper) is a natural extension.
|
||||
- [#2491 — Add improvements to internal links](https://github.com/TriliumNext/Trilium/issues/2491) — Disambiguating same-titled notes in the internal link autocomplete is a clear UX gap in an existing core feature.
|
||||
- [#2547 — Automatically import the page title from url](https://github.com/TriliumNext/Trilium/issues/2547) — Fetching link titles fits the existing rich text editor and web clipper infrastructure and is a common expectation.
|
||||
- [#2664 — Allow unsharing of notes in a shared subtree](https://github.com/TriliumNext/Trilium/issues/2664) — Granular share control is a fundamental capability gap in the existing sharing subsystem.
|
||||
- [#2710 — Open new tabs next to the current one](https://github.com/TriliumNext/Trilium/issues/2710) — Standard tab behavior expected from any tabbed app with an existing tab manager.
|
||||
- [#2989 — Find and Replace allow Regular Expression](https://github.com/TriliumNext/Trilium/issues/2989) — Regex in find/replace is a basic power-user expectation and fits the existing editor.
|
||||
- [#3053 — Restore previous windows and tabs open on startup](https://github.com/TriliumNext/Trilium/issues/3053) — Multi-window session restore is a core expectation for a desktop app with existing tab/window state management.
|
||||
- [#3082 — Option to open notes in new tab by default](https://github.com/TriliumNext/Trilium/issues/3082) — Simple preference toggle over existing tab/navigation behavior.
|
||||
- [#3112 — Annotate/insert comments on note contents](https://github.com/TriliumNext/Trilium/issues/3112) — Inline annotations/comments fit a rich text PKM tool and CKEditor supports comment/annotation plugins.
|
||||
- [#3130 — Latex in titles](https://github.com/TriliumNext/Trilium/issues/3130) — KaTeX is already a dependency and rendering math in titles is consistent with the text note subsystem.
|
||||
- [#3148 — Detect database failure and offer to load backup](https://github.com/TriliumNext/Trilium/issues/3148) — Automated recovery from the existing backup system is a high-value robustness improvement.
|
||||
### From Batch 11
|
||||
|
||||
- [#3266 — Automatic layout on relation maps](https://github.com/TriliumNext/Trilium/issues/3266) — Auto-layout is a standard, long-expected feature for the existing relation map subsystem.
|
||||
- [#3267 — Multiple note drag-and-drop into relation map](https://github.com/TriliumNext/Trilium/issues/3267) — Obvious UX improvement to an existing feature that already supports single-note drag.
|
||||
- [#3268 — Accept drag-and-dropping note links into relation map](https://github.com/TriliumNext/Trilium/issues/3268) — Consistent drag source handling fits the relation map/split view subsystems.
|
||||
- [#3358 — Table of contents on the left side](https://github.com/TriliumNext/Trilium/issues/3358) — Trilium already has a TOC widget; allowing left-panel placement is a natural extension.
|
||||
- [#3385 — Searching through note revisions](https://github.com/TriliumNext/Trilium/issues/3385) — Revisions are a core subsystem and searching them is a natural extension of the search engine.
|
||||
- [#3400 — Setting to disable smart/typographic quotes](https://github.com/TriliumNext/Trilium/issues/3400) — CKEditor autoformat toggle is a common editor setting and directly addresses a code-in-text pain point.
|
||||
- [#3426 — Search and replace](https://github.com/TriliumNext/Trilium/issues/3426) — Core editor/search feature users routinely expect in a note-taking app.
|
||||
- [#3430 — Basic fulltext search on share](https://github.com/TriliumNext/Trilium/issues/3430) — Shaca/share subsystem would meaningfully benefit from basic fulltext lookup.
|
||||
- [#3494 — Value replace in bulk action](https://github.com/TriliumNext/Trilium/issues/3494) — Clear gap in the existing bulk actions subsystem for attribute maintenance.
|
||||
- [#3540 — Temporary unhoist shortcut / cross-workspace jump-to-note](https://github.com/TriliumNext/Trilium/issues/3540) — Hoisting is core workflow and this is a concrete, well-scoped UX fix.
|
||||
- [#3556 — Auto-set code note language from filename extension](https://github.com/TriliumNext/Trilium/issues/3556) — Lightweight QoL tying the existing code-note type to title parsing.
|
||||
### From Batch 10
|
||||
|
||||
- [#3720 — Clone to today](https://github.com/TriliumNext/Trilium/issues/3720) — Cloning to the day note is a natural interaction on top of the existing calendar/day-note and clone subsystems.
|
||||
- [#3721 — ETAPI: Append to existing note content](https://github.com/TriliumNext/Trilium/issues/3721) — Appending is a common ETAPI use case (logging, clippers) and a minor extension to the existing content endpoint.
|
||||
- [#3761 — Template mixins: grouped inherited promoted attributes](https://github.com/TriliumNext/Trilium/issues/3761) — Directly improves the promoted-attribute/template subsystem that power users rely on for structured notes.
|
||||
- [#3885 — Fully adhere to XDG Base Directory Specification](https://github.com/TriliumNext/Trilium/issues/3885) — Proper cache/config separation is a legitimate Linux desktop hygiene improvement for the Electron build.
|
||||
- [#3958 — Allow hiding/blocking inherited attributes on template users](https://github.com/TriliumNext/Trilium/issues/3958) — Fills a real gap in the template/inheritance model that affects how `#archived` and similar labels propagate.
|
||||
- [#4005 — ETAPI interface to get note content hash](https://github.com/TriliumNext/Trilium/issues/4005) — The hash is already computed internally; exposing it via ETAPI is a small change that enables efficient external sync tooling.
|
||||
- [#4080 — Workspace-specific launchers](https://github.com/TriliumNext/Trilium/issues/4080) — Fits naturally with the existing workspace concept and launcher bar, reducing clutter for multi-context users.
|
||||
- [#4124 — Labels with predefined lists](https://github.com/TriliumNext/Trilium/issues/4124) — A natural enhancement to promoted attributes, consistent with how structured PKM tools handle controlled vocabularies.
|
||||
- [#4134 — Add 'Expandable' option to Include Note](https://github.com/TriliumNext/Trilium/issues/4134) — Small, coherent addition to the existing include-note modes that mirrors the book/list view behavior.
|
||||
### From Batch 09
|
||||
|
||||
- [#4199 — Modify note creation and modification time through api](https://github.com/TriliumNext/Trilium/issues/4199) — Essential for note import tooling; ETAPI already exposes note fields and preserving original timestamps is a standard import requirement.
|
||||
- [#4242 — Subscript & Superscript Shortcuts](https://github.com/TriliumNext/Trilium/issues/4242) — Trivial CKEditor keybinding addition that aligns with existing rich text shortcut infrastructure.
|
||||
- [#4299 — Expose protectedSessionService to frontend script api](https://github.com/TriliumNext/Trilium/issues/4299) — Clear gap in the frontend script API that fits the existing scripting surface.
|
||||
- [#4305 — Encrypted / Protected attributes](https://github.com/TriliumNext/Trilium/issues/4305) — Natural extension of the protected-notes subsystem to attributes, a core Trilium entity.
|
||||
- [#4606 — Full-Text Search Using SQLite FTS](https://github.com/TriliumNext/Trilium/issues/4606) — Search is a core subsystem and BM25 relevance ranking is a well-understood improvement for a SQLite-backed app.
|
||||
- [#4612 — Authorization for synchronization endpoint](https://github.com/TriliumNext/Trilium/issues/4612) — Reasonable self-hosting security improvement for the sync subsystem behind reverse proxies.
|
||||
- [#4691 — Context-Menu Option: Add backlink to](https://github.com/TriliumNext/Trilium/issues/4691) — Fits existing relation/backlink infrastructure and tree context menu, a clean UX improvement.
|
||||
### From Batch 08
|
||||
|
||||
- [#4989 — (Keyboard) shortcuts for more actions](https://github.com/TriliumNext/Trilium/issues/4989) — Expanding keyboard shortcut coverage is core power-user PKM functionality and fits the existing shortcut subsystem.
|
||||
- [#5044 — Calendar overview of Note activity](https://github.com/TriliumNext/Trilium/issues/5044) — An activity calendar complements the existing calendar/journal note types and revision system for PKM.
|
||||
- [#5089 — template-Typed Attributes/Relationships](https://github.com/TriliumNext/Trilium/issues/5089) — Constraining promoted relations by template fits directly into the attributes/templates subsystem power users rely on.
|
||||
- [#5183 — Inline reference to labels](https://github.com/TriliumNext/Trilium/issues/5183) — Inline label/relation references extend Trilium's attribute system and fit the existing include-note/reference mechanics.
|
||||
- [#5195 — internal links to notes in Mermaid Diagrams](https://github.com/TriliumNext/Trilium/issues/5195) — Linking mermaid nodes to notes is a natural extension of the mermaid note type and internal link system.
|
||||
- [#5199 — Export of HTML with [missing note] could have retained names](https://github.com/TriliumNext/Trilium/issues/5199) — A clear export fidelity improvement for the existing import/export subsystem.
|
||||
### From Batch 07
|
||||
|
||||
- [#5332 — Improve search result highlighting](https://github.com/TriliumNext/Trilium/issues/5332) — Search is a core subsystem and highlighting matches for advanced queries is a straightforward consistency improvement.
|
||||
- [#5344 — Importing html images as attached instead of external reference](https://github.com/TriliumNext/Trilium/issues/5344) — Fits directly into the existing HTML import pipeline and aligns with how interactive note creation already handles images.
|
||||
- [#5362 — Unify/hide duplicate find dialogs/widgets](https://github.com/TriliumNext/Trilium/issues/5362) — Consolidating the find/find-and-replace widgets is a clear UX cleanup of existing functionality.
|
||||
- [#5401 — Confusing behaviour when the application is minimized in system tray](https://github.com/TriliumNext/Trilium/issues/5401) — Standard Electron single-instance behavior that belongs in the desktop app.
|
||||
- [#5475 — Add keyboard shortcuts for managing splits](https://github.com/TriliumNext/Trilium/issues/5475) — Splits exist as a first-class feature and keyboard bindings fit Trilium's power-user identity.
|
||||
- [#5497 — Undo, permanent delete: add as action for note tree](https://github.com/TriliumNext/Trilium/issues/5497) — Tree-level undo and permanent-delete shortcuts directly extend existing tree actions.
|
||||
### From Batch 06
|
||||
|
||||
- [#5553 — Launcher: add keyboard navigation for Calendar](https://github.com/TriliumNext/Trilium/issues/5553) — Basic accessibility/keyboard navigation for an existing first-party widget; clearly within scope.
|
||||
- [#5609 — Add "open in new split" option to JumpTo menu](https://github.com/TriliumNext/Trilium/issues/5609) — JumpTo and splits are both core navigation features, and this is a natural power-user integration between them.
|
||||
- [#5615 — Clicking below note should focus editor](https://github.com/TriliumNext/Trilium/issues/5615) — Fundamental editor UX expectation matching every other word processor; clear bug-like QoL fix.
|
||||
- [#5626 — Include all available templates, even in hoisted notes](https://github.com/TriliumNext/Trilium/issues/5626) — Removes a real limitation in the existing template + hoisting subsystems.
|
||||
- [#5656 — Show full note titles in Link Map view](https://github.com/TriliumNext/Trilium/issues/5656) — Straightforward display improvement to a first-party visualization.
|
||||
- [#5658 — Saved Search Auto Search on Note Open](https://github.com/TriliumNext/Trilium/issues/5658) — Matches user expectations for saved searches and aligns with existing behavior in the sidebar.
|
||||
- [#5667 — Better search with search excerpts](https://github.com/TriliumNext/Trilium/issues/5667) — Search result excerpts are table-stakes for a knowledge management app and directly improve a core subsystem.
|
||||
- [#5671 — Option to search entire database when a note is hoisted](https://github.com/TriliumNext/Trilium/issues/5671) — Small, explicit toggle for an existing search + hoisting constraint.
|
||||
- [#5685 — Search within Help User Guide](https://github.com/TriliumNext/Trilium/issues/5685) — In-app help discoverability is a clear UX gap and leverages existing search infrastructure.
|
||||
- [#5697 — Take photo from camera](https://github.com/TriliumNext/Trilium/issues/5697) — Important capture mechanism for a PKM tool, especially on mobile web; uses standard HTML capture.
|
||||
- [#5728 — Copy link to note](https://github.com/TriliumNext/Trilium/issues/5728) — Core PKM interaction (copying a shareable link); desktop currently lags behind web.
|
||||
- [#5751 — Linking to subtitles](https://github.com/TriliumNext/Trilium/issues/5751) — Heading anchors / intra-note links are standard in any serious notes/wiki tool.
|
||||
### From Batch 05
|
||||
|
||||
- [#6225 — Settings for displaying search results](https://github.com/TriliumNext/Trilium/issues/6225) — Direct, small UX improvement to the core search results widget (show totals, configurable page size).
|
||||
- [#6226 — Adding "Clone to" to search bulk actions](https://github.com/TriliumNext/Trilium/issues/6226) — Clone is a first-class Trilium concept and already exists as a tree action; exposing it in search bulk actions is a natural gap to close.
|
||||
- [#6421 — [wip] Attributes V2](https://github.com/TriliumNext/Trilium/issues/6421) — Attributes are Trilium's defining power-user feature; typed attributes, validation, and conflict resolution are clearly core roadmap material.
|
||||
- [#6829 — Allow sorting notes by multiple attributes](https://github.com/TriliumNext/Trilium/issues/6829) — Extends the existing `#sorted` / `#sortDirection` attribute semantics in a clean, backwards-compatible way.
|
||||
### From Batch 04
|
||||
|
||||
- [#6962 — Prioritize Running Sync When Coming Back Online (Like laptop wakeup)](https://github.com/TriliumNext/Trilium/issues/6962) — Sync reliability is core to Trilium's identity; detecting wake/network-regain and retrying with backoff is a clear improvement to an existing subsystem.
|
||||
- [#6991 — Search: Add Search Ranking Customizability](https://github.com/TriliumNext/Trilium/issues/6991) — Search is a first-class feature and moving to BM25/weighted scoring directly improves a known pain point in large knowledge bases.
|
||||
- [#7001 — Logout Feature in the Desktop Version of Trilium Next](https://github.com/TriliumNext/Trilium/issues/7001) — Desktop parity for a basic auth/session action that already exists on the server side is an obvious gap to close.
|
||||
- [#7127 — OpenID auto redirect](https://github.com/TriliumNext/Trilium/issues/7127) — Small config flag on an existing OpenID flow; trivial addition to an already-supported auth subsystem.
|
||||
- [#7313 — Option to remove demo data when creating new instance](https://github.com/TriliumNext/Trilium/issues/7313) — Clean-install option is a common onboarding request and maps cleanly onto the existing initial-setup flow.
|
||||
- [#7447 — Milestone: Official mobile application](https://github.com/TriliumNext/Trilium/issues/7447) — Already an accepted roadmap milestone authored by the maintainer and addresses the single largest gap in platform coverage.
|
||||
### From Batch 03
|
||||
|
||||
- [#7895 — (feat) Image Gallery/Collection](https://github.com/TriliumNext/Trilium/issues/7895) — Fits the existing Collections subsystem (geomap precedent) and fills an obvious gap for visual note browsing.
|
||||
- [#7927 — Kanban: (Option to) Display the first ~line of note content for each item](https://github.com/TriliumNext/Trilium/issues/7927) — Directly improves the Kanban collection view, a core note-type feature, with a low-scope attribute-driven option.
|
||||
- [#7931 — Inline Mermaid Diagram Display](https://github.com/TriliumNext/Trilium/issues/7931) — Persisting the view mode of the built-in Mermaid widget is a clear UX bug/polish for an existing note type.
|
||||
- [#8098 — Make clicking a month name in Year view open that month's view](https://github.com/TriliumNext/Trilium/issues/8098) — Trivial navigation improvement to the existing calendar collection view.
|
||||
- [#8187 — Search for new relation in promoted attributes does not suggest to create it](https://github.com/TriliumNext/Trilium/issues/8187) — Regression in a core attribute/note-creation path; clearly in scope.
|
||||
- [#8260 — Improve Note Drag & Drop Functionality](https://github.com/TriliumNext/Trilium/issues/8260) — Tree and Kanban DnD are core UX surfaces and deserve the polish.
|
||||
### From Batch 02
|
||||
|
||||
- [#8452 — Export note attributes as Markdown metadata](https://github.com/TriliumNext/Trilium/issues/8452) — Markdown export is a core interop feature and YAML front-matter for attributes is the standard lossless way to round-trip metadata, addressing real lock-in concerns.
|
||||
- [#8481 — Add filtering in Table view](https://github.com/TriliumNext/Trilium/issues/8481) — Filtering is a basic expectation of any table/collection view and is already explicitly called out as a limitation in the docs.
|
||||
- [#8635 — Allow internal links to open PDF notes at a specific page](https://github.com/TriliumNext/Trilium/issues/8635) — Trilium already ships a customized PDF.js viewer that supports these fragment parameters; wiring them through internal link resolution is a small, high-value fix.
|
||||
- [#8664 — List view in shared collection notes](https://github.com/TriliumNext/Trilium/issues/8664) — Shared/published notes are a first-class subsystem (Shaca) and parity of collection views between app and share is expected behavior.
|
||||
### From Batch 01
|
||||
|
||||
- [#8927 — Add "Copy to Clipboard" Button for Code Blocks in Shared Pages](https://github.com/TriliumNext/Trilium/issues/8927) — Shared notes are a core Trilium subsystem and copy buttons on code blocks are table-stakes for documentation sharing.
|
||||
- [#8967 — PDF Sharing - Download Option](https://github.com/TriliumNext/Trilium/issues/8967) — Restores a regression from the native PDF viewer change in a core subsystem (shared notes), clear bugfix-adjacent request.
|
||||
- [#8974 — Table of Content visibility toggle for smartphone/mobile screens](https://github.com/TriliumNext/Trilium/issues/8974) — TOC is an existing first-class widget and the mobile client is a supported target that currently has no way to access it.
|
||||
- [#8996 — Hide expand/collapse button when all children are hidden archived notes](https://github.com/TriliumNext/Trilium/issues/8996) — Straightforward polish fix to the existing "hide archived notes" behavior in the tree widget.
|
||||
- [#9010 — ETAPI: No way to access protected (encrypted) notes](https://github.com/TriliumNext/Trilium/issues/9010) — Protected notes and ETAPI are both core subsystems and the gap forces external clients into insecure workarounds.
|
||||
|
||||
## Reasonable Fit (181)
|
||||
|
||||
Useful quality-of-life improvements that fit the product but are not essential. Would be accepted if someone contributed them. Good second-tier queue for contributors.
|
||||
|
||||
### From Batch 15
|
||||
|
||||
- [#212 — Tooltip for an attachment can display basic info and download/open buttons](https://github.com/TriliumNext/Trilium/issues/212) — A quality-of-life improvement to the existing attachment UI subsystem.
|
||||
- [#352 — Restore Demo Content](https://github.com/TriliumNext/Trilium/issues/352) — Re-importing the bundled demo into an existing database is a small onboarding improvement that fits existing import mechanisms.
|
||||
- [#409 — AppImage for Linux](https://github.com/TriliumNext/Trilium/issues/409) — A reasonable packaging option for the Electron desktop build, complementing existing Linux distributions.
|
||||
- [#672 — Error Tracking for scripts](https://github.com/TriliumNext/Trilium/issues/672) — Better error visibility for the scripting subsystem is a reasonable power-user improvement given how central scripting is.
|
||||
- [#802 — Clip url with description](https://github.com/TriliumNext/Trilium/issues/802) — A modest enhancement to the web clipper's existing clip modes.
|
||||
- [#970 — Use double click to get to the child note](https://github.com/TriliumNext/Trilium/issues/970) — A minor navigation UX tweak in the book/note-list widget.
|
||||
- [#983 — Custom Local Save location and Hide Child Notes for Attachments](https://github.com/TriliumNext/Trilium/issues/983) — Both parts (DB location config and hiding attachment child notes) touch existing subsystems and are reasonable polish items.
|
||||
- [#991 — Link to a blank note](https://github.com/TriliumNext/Trilium/issues/991) — Creating an empty note inline from an `@` link is a small authoring-flow improvement that fits the text editor and autocomplete subsystems.
|
||||
### From Batch 14
|
||||
|
||||
- [#1144 — Option to auto expand book nodes](https://github.com/TriliumNext/Trilium/issues/1144) — An attribute or setting to auto-expand book children fits existing book note configuration patterns.
|
||||
- [#1148 — include relation maps content in search results](https://github.com/TriliumNext/Trilium/issues/1148) — Indexing relation-map note membership into search would deepen an existing subsystem, though implementation is non-trivial.
|
||||
- [#1206 — Feature request: jump back to last edit](https://github.com/TriliumNext/Trilium/issues/1206) — A "jump to last edit" shortcut is a useful editor navigation feature that can build on existing history tracking.
|
||||
- [#1269 — Customize note title shown in tree](https://github.com/TriliumNext/Trilium/issues/1269) — Attribute-driven tree title templating is a natural extension of Trilium's label/template system.
|
||||
- [#1514 — Get the link to the note from the desktop apps](https://github.com/TriliumNext/Trilium/issues/1514) — Exposing a "copy server URL" action in desktop is a small, self-contained improvement.
|
||||
- [#1526 — Shortcut to open the link in a new window](https://github.com/TriliumNext/Trilium/issues/1526) — Modifier-click to open a note in a new window fits the existing multi-window Electron support.
|
||||
- [#1554 — image alt text in markdown export](https://github.com/TriliumNext/Trilium/issues/1554) — Fixing markdown export to emit alt text properly is a small but valuable correctness improvement.
|
||||
- [#1585 — Default import options for drag and drop](https://github.com/TriliumNext/Trilium/issues/1585) — Persisting import option defaults (e.g. shrink images) is a minor configuration enhancement to the importer.
|
||||
- [#1623 — Remember default box size for included notes](https://github.com/TriliumNext/Trilium/issues/1623) — Remembering last-used size for included notes is a trivial UX polish.
|
||||
- [#1652 — saved search preview with number of results](https://github.com/TriliumNext/Trilium/issues/1652) — Showing result counts next to saved search links is a useful, bounded dashboard-style feature.
|
||||
- [#1693 — Copy/Paste Table As/From CSV](https://github.com/TriliumNext/Trilium/issues/1693) — CSV paste/copy for tables is a pragmatic way to unblock many table feature requests with modest scope.
|
||||
### From Batch 13
|
||||
|
||||
- [#1772 — Disable CKEditor automatic text transformations](https://github.com/TriliumNext/Trilium/issues/1772) — Exposing a CKEditor option, especially suppressing transforms in inline code, is a reasonable editor config improvement.
|
||||
- [#1826 — insertDateTimeToText shortcut for labels](https://github.com/TriliumNext/Trilium/issues/1826) — Extending an existing shortcut to also work in label inputs is a small consistency fix.
|
||||
- [#1946 — Show attributes (relations) on link map](https://github.com/TriliumNext/Trilium/issues/1946) — Labeling edges by relation name on the link/note map is a reasonable visualization enhancement.
|
||||
- [#1991 — Relation constraints](https://github.com/TriliumNext/Trilium/issues/1991) — Type constraints on relation targets fit the promoted-attribute/template system as a power-user feature.
|
||||
- [#2051 — Embedding YouTube/Vimeo videos](https://github.com/TriliumNext/Trilium/issues/2051) — Media embed support in the rich text editor is a common expectation for a note app.
|
||||
- [#2064 — Improve default link map layout](https://github.com/TriliumNext/Trilium/issues/2064) — Better graph layout algorithm is a reasonable polish task for the existing note/link map.
|
||||
- [#2181 — Different icon for folder note with content vs without](https://github.com/TriliumNext/Trilium/issues/2181) — Small visual tweak to clarify the existing folder-note concept in the tree.
|
||||
- [#2185 — Alt+T should link day portion to day note](https://github.com/TriliumNext/Trilium/issues/2185) — Natural enhancement of the existing Alt+T shortcut given Trilium's day-note subsystem.
|
||||
- [#2293 — Include note section by markdown header](https://github.com/TriliumNext/Trilium/issues/2293) — Header-based section inclusion is a reasonable upgrade to the existing Include Note feature.
|
||||
- [#2303 — Note map live update](https://github.com/TriliumNext/Trilium/issues/2303) — Live refresh of the note map when links change is a reasonable QoL over the current static view.
|
||||
- [#2363 — Better linking from Mermaid diagrams](https://github.com/TriliumNext/Trilium/issues/2363) — A UI helper for inserting note links into Mermaid fits the existing Mermaid note type.
|
||||
- [#2420 — Link date-valued labels to day notes](https://github.com/TriliumNext/Trilium/issues/2420) — Surfacing date-label backlinks on day notes naturally extends date-note and attribute subsystems.
|
||||
### From Batch 12
|
||||
|
||||
- [#2524 — Custom shortcuts on the note toolbar](https://github.com/TriliumNext/Trilium/issues/2524) — Extending the scripting API's `addButtonToToolbar()` to target note-level tabs is a modest API addition.
|
||||
- [#2622 — Disable sync for certain notes](https://github.com/TriliumNext/Trilium/issues/2622) — Device-local notes via a label is a useful power-user knob that fits the existing sync/attribute systems.
|
||||
- [#2631 — Add service worker for caching large assets](https://github.com/TriliumNext/Trilium/issues/2631) — Performance improvement aligned with the web client architecture, though not core identity.
|
||||
- [#2636 — Tabbing off dropdown field should select](https://github.com/TriliumNext/Trilium/issues/2636) — Clear UX polish bug in the attribute editor.
|
||||
- [#2683 — Trigger asking whether to delete empty note more aggressively](https://github.com/TriliumNext/Trilium/issues/2683) — Small QoL refinement of existing delete-empty-note behavior.
|
||||
- [#2741 — Publish checksum of published assets](https://github.com/TriliumNext/Trilium/issues/2741) — Standard release hygiene improvement for the build/release pipeline.
|
||||
- [#2797 — Quicker way to create notes from a template](https://github.com/TriliumNext/Trilium/issues/2797) — Workflow improvement for the existing template subsystem that's central to power-user PKM.
|
||||
- [#2870 — Import folder and generate note tree](https://github.com/TriliumNext/Trilium/issues/2870) — Folder import already partly exists; making it create a matching tree is a reasonable importer enhancement.
|
||||
- [#2923 — Ignore spellcheck in context menu](https://github.com/TriliumNext/Trilium/issues/2923) — Small editor context menu addition aligned with existing spellcheck integration.
|
||||
- [#2960 — Internal links in Canvas](https://github.com/TriliumNext/Trilium/issues/2960) — Cross-note-type linking would improve Canvas integration with the PKM core.
|
||||
- [#2972 — Make Relation Map lines straight](https://github.com/TriliumNext/Trilium/issues/2972) — Minor rendering option in an existing note type.
|
||||
- [#3098 — Focus on the searched word](https://github.com/TriliumNext/Trilium/issues/3098) — Auto-scrolling search results to match position is a natural search UX improvement.
|
||||
- [#3138 — Template organization via template groups with drop-down menus](https://github.com/TriliumNext/Trilium/issues/3138) — Nested template menus are a reasonable QoL for the existing template system.
|
||||
- [#3184 — Auto-setup links when creating a template](https://github.com/TriliumNext/Trilium/issues/3184) — A `templateClone` relation is a sensible extension to the existing template/clone mechanics.
|
||||
### From Batch 11
|
||||
|
||||
- [#3244 — Prompt before exit option](https://github.com/TriliumNext/Trilium/issues/3244) — Simple preference in the existing settings system; reasonable safety QoL.
|
||||
- [#3304 — Shortcut to format selection as inline code](https://github.com/TriliumNext/Trilium/issues/3304) — Fits the existing keyboard shortcut/CKEditor integration, with real value for CJK input users.
|
||||
- [#3335 — Mouse wheel scroll instead of zoom in Mermaid notes](https://github.com/TriliumNext/Trilium/issues/3335) — Reasonable behavior tweak for the Mermaid note type.
|
||||
- [#3353 — Support NODE_EXTRA_CA_CERTS in Electron](https://github.com/TriliumNext/Trilium/issues/3353) — Legitimate self-hosting concern with a concrete Electron-level fix.
|
||||
- [#3356 — Collapsed child-note link toggles expansion on first click](https://github.com/TriliumNext/Trilium/issues/3356) — Small UX polish to the included note/child navigation behavior.
|
||||
- [#3389 — Preserve mobile image upload order](https://github.com/TriliumNext/Trilium/issues/3389) — Straightforward mobile upload bug/QoL fix.
|
||||
- [#3433 — Ship demo charts in hidden subtree](https://github.com/TriliumNext/Trilium/issues/3433) — Fits the hidden subtree templating system and keeps samples upgradable.
|
||||
- [#3458 — Show special characters (nbsp etc.) in editor](https://github.com/TriliumNext/Trilium/issues/3458) — Reasonable editor option for power users working with code.
|
||||
- [#3462 — Named color palette for highlight/font color](https://github.com/TriliumNext/Trilium/issues/3462) — Enables dark-mode-friendly colors via CKEditor's supported inline color definitions.
|
||||
- [#3484 — Slash/shortcut menu for format selection](https://github.com/TriliumNext/Trilium/issues/3484) — Common CKEditor-style command palette that fits the rich-text subsystem.
|
||||
- [#3541 — Configurable font color set](https://github.com/TriliumNext/Trilium/issues/3541) — Related editor-palette config concern, reasonable as an option.
|
||||
- [#3563 — Left panel fixed width, toggle shortcut, focus handling](https://github.com/TriliumNext/Trilium/issues/3563) — Concrete layout/keyboard QoL improvements to existing panel behavior.
|
||||
- [#3566 — Copy/clone as a search bulk action](https://github.com/TriliumNext/Trilium/issues/3566) — Fills an obvious gap alongside the existing move bulk action.
|
||||
- [#3593 — Disable auto-jump when dropping an image as child note](https://github.com/TriliumNext/Trilium/issues/3593) — Small behavior toggle that addresses a clear workflow annoyance.
|
||||
### From Batch 10
|
||||
|
||||
- [#3724 — Paste picture default settings (inline)](https://github.com/TriliumNext/Trilium/issues/3724) — Configurable default alignment for pasted images is a sensible editor preference.
|
||||
- [#3729 — Keep sidebar width more consistent](https://github.com/TriliumNext/Trilium/issues/3729) — UX polish for window-resize behavior, fits the existing layout system.
|
||||
- [#3743 — Minimize/close to tray icon](https://github.com/TriliumNext/Trilium/issues/3743) — Standard Electron desktop behavior that complements the existing tray integration.
|
||||
- [#3767 — Turn off Autoformat completely](https://github.com/TriliumNext/Trilium/issues/3767) — Adding an editor toggle to disable markdown autoformat is a reasonable CKEditor configuration option.
|
||||
- [#3785 — Standard label for opening default note](https://github.com/TriliumNext/Trilium/issues/3785) — A built-in "open on startup" note is a common PKM convenience, already approximated via fragile scripts.
|
||||
- [#3794 — Tiling images without resorting to tables](https://github.com/TriliumNext/Trilium/issues/3794) — Native side-by-side image layout is a reasonable rich-text editor improvement.
|
||||
- [#3878 — Sort Lines](https://github.com/TriliumNext/Trilium/issues/3878) — Standard code-editor action that fits the CodeMirror note type.
|
||||
- [#3899 — Preserve selected delete/import dialog options](https://github.com/TriliumNext/Trilium/issues/3899) — Small UX improvement to make dialogs remember recent choices.
|
||||
- [#3913 — Allow no timeout for protected notes](https://github.com/TriliumNext/Trilium/issues/3913) — Fixing the blank-field exception and allowing an explicit "never timeout" option is a legitimate settings fix.
|
||||
- [#3964 — API method to get all notes](https://github.com/TriliumNext/Trilium/issues/3964) — Exposing a bulk list/iterator endpoint (or documenting one) fits the ETAPI surface.
|
||||
- [#3983 — API function to refresh search note](https://github.com/TriliumNext/Trilium/issues/3983) — A small, well-scoped addition that improves scripting and external integration with search notes.
|
||||
- [#4002 — Internal link inside mermaid diagram](https://github.com/TriliumNext/Trilium/issues/4002) — Supporting internal note references in mermaid click handlers is consistent with Trilium's cross-note linking story.
|
||||
- [#4023 — Allow launchers to pass arguments to script notes](https://github.com/TriliumNext/Trilium/issues/4023) — Modest scripting-API extension that makes the launcher system dramatically more reusable.
|
||||
- [#4026 — Time attribute field](https://github.com/TriliumNext/Trilium/issues/4026) — Adding a time/duration type to promoted attributes rounds out the existing date/decimal/currency types.
|
||||
- [#4179 — Identify the current outline location](https://github.com/TriliumNext/Trilium/issues/4179) — Highlighting the current heading in the outline widget is a reasonable navigation improvement.
|
||||
### From Batch 09
|
||||
|
||||
- [#4296 — Remember position in file](https://github.com/TriliumNext/Trilium/issues/4296) — Useful QoL for long notes; scroll position persistence fits existing note context state.
|
||||
- [#4353 — Prevent correcting characters to symbols](https://github.com/TriliumNext/Trilium/issues/4353) — Reasonable toggle for CKEditor's autoformat/typography plugin.
|
||||
- [#4366 — Static log file name for trilium server](https://github.com/TriliumNext/Trilium/issues/4366) — Legitimate ops request to support standard logrotate workflows on self-hosted servers.
|
||||
- [#4375 — Data location - allow user to select](https://github.com/TriliumNext/Trilium/issues/4375) — Custom data directory is a standard desktop app feature; env var exists but a GUI/config option is reasonable.
|
||||
- [#4395 — Autocomplete dialog support via scripting API](https://github.com/TriliumNext/Trilium/issues/4395) — Exposing the existing noteAutocomplete service to scripts is a small, well-scoped API addition.
|
||||
- [#4396 — Ordering of templates](https://github.com/TriliumNext/Trilium/issues/4396) — Minor UX tweak to the "Add Child Note" menu that benefits template-heavy users.
|
||||
- [#4405 — Vim keybindings - yank/paste to system clipboard](https://github.com/TriliumNext/Trilium/issues/4405) — Standard CodeMirror vim-mode configuration that fits the existing code note editor.
|
||||
- [#4439 — In-app update mechanism](https://github.com/TriliumNext/Trilium/issues/4439) — Auto-update via electron-updater is a well-understood and expected desktop app feature.
|
||||
- [#4468 — Toggle button for promoted attribute on mobile](https://github.com/TriliumNext/Trilium/issues/4468) — Reasonable mobile UX improvement within existing promoted attributes widget.
|
||||
- [#4498 — Bulk convert to attachment](https://github.com/TriliumNext/Trilium/issues/4498) — Sensible migration helper for the existing image-to-attachment conversion flow.
|
||||
- [#4669 — Printed font size configuration](https://github.com/TriliumNext/Trilium/issues/4669) — Modest print CSS configuration improvement for the existing print feature.
|
||||
- [#4732 — Flathub Verification](https://github.com/TriliumNext/Trilium/issues/4732) — Simple distribution/packaging task that improves discoverability of the official Flatpak.
|
||||
- [#4813 — Horizontal scroll bar visible when not at bottom of Note](https://github.com/TriliumNext/Trilium/issues/4813) — Reasonable fix/UX improvement for large tables in the text editor viewport.
|
||||
- [#4818 — Set options for api import](https://github.com/TriliumNext/Trilium/issues/4818) — Small ETAPI gap; exposing existing import options as API parameters fits the external API.
|
||||
### From Batch 08
|
||||
|
||||
- [#4854 — Add a visual diff to split window](https://github.com/TriliumNext/Trilium/issues/4854) — A diff view between notes or revisions is a natural QoL extension of revisions and split view.
|
||||
- [#4870 — Synchronized Devices Dashboard](https://github.com/TriliumNext/Trilium/issues/4870) — Managing sync clients is a reasonable admin feature for the existing sync subsystem.
|
||||
- [#4885 — reload read position after "go back" from attachment view](https://github.com/TriliumNext/Trilium/issues/4885) — Simple navigation UX fix for the attachment viewer.
|
||||
- [#5049 — Appearance Settings Optional Sync](https://github.com/TriliumNext/Trilium/issues/5049) — Per-device appearance overrides is a legitimate options/sync QoL improvement for multi-device users.
|
||||
- [#5086 — Investigate Windows additional package managers](https://github.com/TriliumNext/Trilium/issues/5086) — Broader Windows package distribution is a reasonable release/distribution improvement.
|
||||
- [#5108 — Deploy to Flathub](https://github.com/TriliumNext/Trilium/issues/5108) — Expanding Linux packaging reach is a reasonable distribution improvement.
|
||||
- [#5122 — (Try to) sync app on shutdown](https://github.com/TriliumNext/Trilium/issues/5122) — A shutdown sync hook is a sensible reliability improvement for the sync subsystem.
|
||||
- [#5126 — AVIF image compression support](https://github.com/TriliumNext/Trilium/issues/5126) — Adding a modern image format option fits the existing image handling pipeline.
|
||||
- [#5190 — Drag and drop note icon to insert link in note](https://github.com/TriliumNext/Trilium/issues/5190) — Minor drag-and-drop UX enhancement that fits existing link-drag interactions.
|
||||
- [#5205 — Image zoom / gallery view for shared notes](https://github.com/TriliumNext/Trilium/issues/5205) — A useful viewer enhancement for the share subsystem.
|
||||
- [#5228 — SOCKS Proxy Support in Desktop App](https://github.com/TriliumNext/Trilium/issues/5228) — Reasonable networking option for self-hosted users behind restricted networks.
|
||||
- [#5281 — Change `clone` terminology](https://github.com/TriliumNext/Trilium/issues/5281) — Terminology cleanup that touches UI/i18n but is a legitimate usability consideration.
|
||||
### From Batch 07
|
||||
|
||||
- [#5303 — Creating human-readable URL aliases without sharing](https://github.com/TriliumNext/Trilium/issues/5303) — Extending the existing alias mechanism to internal navigation is a plausible quality-of-life improvement, though it touches routing in non-trivial ways.
|
||||
- [#5305 — Confirmation dialogue when dragging and dropping to move note](https://github.com/TriliumNext/Trilium/issues/5305) — An optional drag safeguard or toast undo is a reasonable enhancement to the tree widget.
|
||||
- [#5337 — Code blocks: sort mime type by most used](https://github.com/TriliumNext/Trilium/issues/5337) — Frequency-based sorting or type-ahead in the mime picker is a minor, sensible UX refinement.
|
||||
- [#5350 — Web-clipper prompt to add meta note](https://github.com/TriliumNext/Trilium/issues/5350) — A small, optional capture-time field fits naturally in the web-clipper flow.
|
||||
- [#5357 — Mind Map: Ability to add images as node](https://github.com/TriliumNext/Trilium/issues/5357) — Reasonable enhancement to the mind-map note type, depending on the upstream library's support.
|
||||
- [#5361 — UX: image options clarification](https://github.com/TriliumNext/Trilium/issues/5361) — Clarifying the compression settings and PNG handling is a straightforward settings/docs fix.
|
||||
- [#5363 — Option to open HTML attachment in browser instead of download](https://github.com/TriliumNext/Trilium/issues/5363) — Rendering HTML attachments inline is a reasonable extension to the attachments viewer with some security considerations.
|
||||
- [#5411 — Auto-hide the tab bar and toolbar in full-screen mode](https://github.com/TriliumNext/Trilium/issues/5411) — A focus/zen-mode refinement that fits existing layout controls.
|
||||
- [#5509 — Dynamic themes](https://github.com/TriliumNext/Trilium/issues/5509) — Allowing the desktop app to load a theme CSS from a local file or URL is a reasonable theming extension.
|
||||
### From Batch 06
|
||||
|
||||
- [#5562 — Pin tab](https://github.com/TriliumNext/Trilium/issues/5562) — Common tabbed-UI convenience that fits the existing tab system, though not mission-critical.
|
||||
- [#5579 — Allow Root note to be #shareRoot](https://github.com/TriliumNext/Trilium/issues/5579) — Reasonable sharing improvement; at minimum a clearer warning is a clean QoL fix to the share subsystem.
|
||||
- [#5583 — #rerunScriptsOnTemplateChange label](https://github.com/TriliumNext/Trilium/issues/5583) — Targeted enhancement to template/script lifecycle that fills a clear gap for power users.
|
||||
- [#5621 — Customize the format toolbar](https://github.com/TriliumNext/Trilium/issues/5621) — Editor customization is a common request and CKEditor5 supports configurable toolbars.
|
||||
- [#5638 — Ctrl+D Select Next Matching Occurrence](https://github.com/TriliumNext/Trilium/issues/5638) — Easy to do for code notes via CodeMirror's existing multi-cursor; text-note version is more speculative but the request is reasonable.
|
||||
- [#5640 — Support for importing ICS (iCalendar) file](https://github.com/TriliumNext/Trilium/issues/5640) — Natural companion to the new calendar view and fits the import/export subsystem.
|
||||
- [#5641 — Add showProtectedDialog() to frontend API](https://github.com/TriliumNext/Trilium/issues/5641) — Small, well-scoped addition to the frontend script API that unblocks protected-note workflows.
|
||||
- [#5686 — In-app Help links to public pages](https://github.com/TriliumNext/Trilium/issues/5686) — Small UX improvement with low implementation cost given docs are already mirrored.
|
||||
- [#5701 — Configurable tab width in code blocks](https://github.com/TriliumNext/Trilium/issues/5701) — CodeMirror supports this natively; straightforward configuration exposure.
|
||||
- [#5707 — OneNote import tool](https://github.com/TriliumNext/Trilium/issues/5707) — Import from major competing apps fits Trilium's migration story, though OneNote specifically is complex.
|
||||
- [#5725 — Add TriliumNext to TrueNAS apps](https://github.com/TriliumNext/Trilium/issues/5725) — Packaging/distribution task that expands self-hosted reach at low engineering cost.
|
||||
- [#5727 — Table borders](https://github.com/TriliumNext/Trilium/issues/5727) — Legitimate editor bug/QoL issue in the CKEditor5 table plugin.
|
||||
- [#5756 — Support Note Map Type as Shared Page](https://github.com/TriliumNext/Trilium/issues/5756) — Extending Shaca to render an existing note type is consistent with prior share improvements.
|
||||
### From Batch 05
|
||||
|
||||
- [#5795 — Drop image attachments without shrinking](https://github.com/TriliumNext/Trilium/issues/5795) — Sensible modifier-key / prompt enhancement to existing image drop handling in CKEditor.
|
||||
- [#5827 — Replace word/symbol with user-defined term](https://github.com/TriliumNext/Trilium/issues/5827) — Standard autocorrect/autoreplace in a rich text editor; fits CKEditor customization.
|
||||
- [#6144 — Custom styles for CKEditor](https://github.com/TriliumNext/Trilium/issues/6144) — Trilium already ships custom CKEditor plugins (admonitions, footnotes); exposing CKEditor5 Style feature is an incremental extension.
|
||||
- [#6162 — Global Tag View](https://github.com/TriliumNext/Trilium/issues/6162) — Labels are central and discoverability is a known gap; a browse-all-labels view fits the attribute subsystem.
|
||||
- [#6203 — Suppress messages on Frontend API scripts](https://github.com/TriliumNext/Trilium/issues/6203) — Small, well-scoped scripting API improvement (optional silent flag on `protectSubTree` and friends).
|
||||
- [#6259 — Geo-map undo on pin move](https://github.com/TriliumNext/Trilium/issues/6259) — Basic data-safety QoL for the geo-map type widget.
|
||||
- [#6296 — Auto hide sidebar](https://github.com/TriliumNext/Trilium/issues/6296) — A common layout preference that fits the existing layout/panel subsystem.
|
||||
- [#6410 — Display note count in folders](https://github.com/TriliumNext/Trilium/issues/6410) — Minor tree widget enhancement; aligns with existing child-counting logic.
|
||||
- [#6805 — Adaptive tray icon](https://github.com/TriliumNext/Trilium/issues/6805) — Standard Electron desktop polish for KDE/GNOME tray theming.
|
||||
- [#6836 — Handle HTTP redirects in sync configuration](https://github.com/TriliumNext/Trilium/issues/6836) — Small correctness fix in the sync HTTP client; supports realistic self-host reverse-proxy setups.
|
||||
- [#6841 — Drag note into split view](https://github.com/TriliumNext/Trilium/issues/6841) — Natural extension of the existing split view and drag-and-drop tab handling.
|
||||
### From Batch 04
|
||||
|
||||
- [#7113 — Use dateTime attribute for calendar child notes](https://github.com/TriliumNext/Trilium/issues/7113) — Consolidating date+time into a single datetime attribute simplifies sorting and fits the existing attribute/collection subsystem.
|
||||
- [#7198 — Code Editor Indent wrapping](https://github.com/TriliumNext/Trilium/issues/7198) — CodeMirror supports this natively; exposing the option in code/text notes is a small quality-of-life win.
|
||||
- [#7217 — Allow opening note directly instead of quick edit in collections](https://github.com/TriliumNext/Trilium/issues/7217) — Reasonable user-preference toggle for collection click behavior; minor change to existing view code.
|
||||
- [#7224 — Quick Notes from Everywhere using a Creation Window (Inbox-first approach)](https://github.com/TriliumNext/Trilium/issues/7224) — Inbox-first capture is a core PKM workflow and fits alongside the existing global shortcut and web clipper.
|
||||
- [#7279 — Implement Sticky tree view headers as a native feature](https://github.com/TriliumNext/Trilium/issues/7279) — Small tree UX improvement already prototyped by the community; natural fit for the note tree widget.
|
||||
- [#7403 — Option to disable fancy font ligatures](https://github.com/TriliumNext/Trilium/issues/7403) — Simple settings toggle affecting code/inline-code rendering; legitimate accessibility/readability preference.
|
||||
- [#7410 — Feature request: ability to reorder sections in the Table of Contents](https://github.com/TriliumNext/Trilium/issues/7410) — TOC already exists as a right-panel widget; adding drag-to-reorder sections fits the CKEditor-backed text note workflow.
|
||||
- [#7541 — Merging TOC and Highlights List](https://github.com/TriliumNext/Trilium/issues/7541) — Unifying two existing right-panel widgets is a reasonable UI consolidation.
|
||||
- [#7607 — Add API support to check and switch to an already opened note tab](https://github.com/TriliumNext/Trilium/issues/7607) — Small, well-scoped additions to the frontend script API that close a real gap for tab-aware scripts.
|
||||
- [#7636 — documents about scripting may need an update](https://github.com/TriliumNext/Trilium/issues/7636) — Scripting docs are core developer-facing material and keeping them current is legitimately needed maintenance work.
|
||||
- [#7646 — Add a setting to switch to 24-hours clock](https://github.com/TriliumNext/Trilium/issues/7646) — Basic localization/preference that belongs in settings; trivial but correct to add.
|
||||
- [#7666 — Allow adjustable widths for the Content and TOC (Bookmarks) panes in the Share view](https://github.com/TriliumNext/Trilium/issues/7666) — Share view is a supported subsystem and configurable pane widths are a reasonable layout improvement.
|
||||
### From Batch 03
|
||||
|
||||
- [#7827 — Increase donation visibility by adding a "Donate" entry in the Options page](https://github.com/TriliumNext/Trilium/issues/7827) — Simple Options page addition; fits an OSS project's sustainability goals without touching product scope.
|
||||
- [#7876 — Implement site search with type ahead (OpenSearch)](https://github.com/TriliumNext/Trilium/issues/7876) — A small server-side OpenSearch description endpoint naturally complements the existing search URL and web interface.
|
||||
- [#7885 — [quick-edit] new controls for quick-edit window management](https://github.com/TriliumNext/Trilium/issues/7885) — Concrete UI polish for an existing quick-edit widget with a clear mock-up.
|
||||
- [#7886 — Allow inserting video previews in notes](https://github.com/TriliumNext/Trilium/issues/7886) — Inline video playback for mp4/webm attachments is a natural extension of the existing CKEditor media handling.
|
||||
- [#7940 — Input Box Optimization: Add a Clear Button](https://github.com/TriliumNext/Trilium/issues/7940) — Minor form-control UX improvement that can be applied globally to attribute inputs.
|
||||
- [#8121 — Checking for dead links](https://github.com/TriliumNext/Trilium/issues/8121) — Reasonable backend utility for a knowledge-base tool; fits as an optional maintenance action over Becca.
|
||||
- [#8158 — Split lines into paragraphs](https://github.com/TriliumNext/Trilium/issues/8158) — Paste-handling tweak in CKEditor that addresses a common text-entry friction point.
|
||||
- [#8174 — Add the "Distribute Columns" feature to the table](https://github.com/TriliumNext/Trilium/issues/8174) — Standard table editing affordance matching CKEditor's table feature set.
|
||||
- [#8219 — Custom Icon Support (Upload/Delete Beyond Default Icons)](https://github.com/TriliumNext/Trilium/issues/8219) — Fits the existing icon/attribute system and is a commonly requested personalization feature.
|
||||
- [#8228 — Make Github releases immutable](https://github.com/TriliumNext/Trilium/issues/8228) — A one-click repo setting improving supply-chain security for released binaries.
|
||||
- [#8281 — Search history](https://github.com/TriliumNext/Trilium/issues/8281) — Small quality-of-life addition to the existing search bar; bounded scope.
|
||||
### From Batch 02
|
||||
|
||||
- [#8319 — Improved Note-Maps](https://github.com/TriliumNext/Trilium/issues/8319) — Relation/note maps exist as a core visualization and filtering/coloring by label or link-depth is a natural extension of that widget.
|
||||
- [#8332 — Global custom color palette for text background](https://github.com/TriliumNext/Trilium/issues/8332) — CKEditor5 supports configuring color palettes and exposing this via Options fits the existing theming/settings surface.
|
||||
- [#8333 — Quick access UI for frequently used text background colors](https://github.com/TriliumNext/Trilium/issues/8333) — Last-used/recent-colors is a standard CKEditor5 toolbar pattern and a modest UX improvement to the existing editor.
|
||||
- [#8372 — Support share_target in PWA to share files into Trilium notes](https://github.com/TriliumNext/Trilium/issues/8372) — Trilium ships a PWA and web clippers; registering a Web Share Target manifest entry fits the existing mobile-web story.
|
||||
- [#8389 — Make it possible to add preact to Dialogs](https://github.com/TriliumNext/Trilium/issues/8389) — The frontend is migrating to Preact and exposing a typed Preact-component dialog API is a natural extension of the scripting surface.
|
||||
- [#8466 — Naming and locking some note revisions](https://github.com/TriliumNext/Trilium/issues/8466) — Revisions are a core BRevision entity and pinning/naming individual revisions is a modest schema/UX addition with clear value.
|
||||
- [#8526 — Ctrl+Click to multi-select in note tree](https://github.com/TriliumNext/Trilium/issues/8526) — Multi-select in the tree already exists for ranged selection; adding the standard non-adjacent modifier (configurable) is a straightforward tree-widget fix.
|
||||
- [#8588 — Import .ics Calendar Support](https://github.com/TriliumNext/Trilium/issues/8588) — Trilium has a calendar/day-note subsystem and `.ics` import (one-shot or subscription) fits that existing surface.
|
||||
- [#8606 — Implement Authorization on OpenID](https://github.com/TriliumNext/Trilium/issues/8606) — OIDC login already exists; gating it on a claim/subject allowlist is a small but important hardening for single-user self-hosters.
|
||||
- [#8658 — OIDC groups claims for access control](https://github.com/TriliumNext/Trilium/issues/8658) — Same OIDC subsystem; evaluating a `groups` claim against an allowlist is a natural companion to the existing auth code.
|
||||
- [#8699 — Backup enhancements (custom path, retention)](https://github.com/TriliumNext/Trilium/issues/8699) — The built-in backup service already runs on a schedule; making the path and retention configurable is a small extension of existing options.
|
||||
- [#8720 — Inline Code copy button](https://github.com/TriliumNext/Trilium/issues/8720) — Block code already has a copy affordance; mirroring it on inline code fits the existing CKEditor5 code plugin.
|
||||
### From Batch 01
|
||||
|
||||
- [#8912 — macOS dynamic traffic light offset based on zoom factor](https://github.com/TriliumNext/Trilium/issues/8912) — Small, self-contained Electron polish fix for a real visual bug on macOS with custom title bar.
|
||||
- [#8941 — Ability to Download Backups](https://github.com/TriliumNext/Trilium/issues/8941) — Backups are a built-in feature and letting users download them from Settings is a natural, low-effort extension.
|
||||
- [#8954 — Allow filtering by categories for custom icon packs](https://github.com/TriliumNext/Trilium/issues/8954) — Icon picker is an existing widget and 16k+ icons clearly need category filtering to remain usable.
|
||||
- [#8955 — Simpler UI mode for new / casual users](https://github.com/TriliumNext/Trilium/issues/8955) — Reorganizing the context menu into the existing Advanced submenu is a reasonable onboarding improvement without removing functionality.
|
||||
- [#9003 — Drag-and-drop files/folders to insert clickable file:// hyperlinks](https://github.com/TriliumNext/Trilium/issues/9003) — Fits the existing drag-and-drop import flow as an alternate modifier-key behavior, useful for local-knowledge-hub workflows.
|
||||
- [#9029 — Integrated Web-Clipper](https://github.com/TriliumNext/Trilium/issues/9029) — An "import from URL" action in the web UI reuses existing clipper/import machinery and covers users who can't install the extension.
|
||||
- [#9032 — Horizontal scroll bar for improved tab row navigation](https://github.com/TriliumNext/Trilium/issues/9032) — Tabs are a core UI element and scroll/overflow handling with many open tabs is a reasonable UX fix.
|
||||
- [#9059 — Link Notes in PDF To Internal Notes](https://github.com/TriliumNext/Trilium/issues/9059) — Builds naturally on the existing internal link system and the new PDF viewer, complementing #8635.
|
||||
- [#9120 — Images as links](https://github.com/TriliumNext/Trilium/issues/9120) — Basic CKEditor capability users reasonably expect from a rich-text editor; likely a small plugin/config tweak.
|
||||
- [#9164 — PDF Export feature and font size](https://github.com/TriliumNext/Trilium/issues/9164) — Export is core functionality and inconsistent font sizing plus an export options dialog are reasonable improvements.
|
||||
- [#9311 — Official RISC-V (riscv64) Docker image support](https://github.com/TriliumNext/Trilium/issues/9311) — Self-hosting on ARM/x86 is already supported and the reporter has a working PoC plus CI contribution offer, making it low-risk to add to the build matrix.
|
||||
- [#9337 — Renaming Bookmarks](https://github.com/TriliumNext/Trilium/issues/9337) — Rename-propagation is already expected behavior for note links and bookmarks should behave consistently.
|
||||
- [#9353 — Zoom with a pen tablet on canvas notes](https://github.com/TriliumNext/Trilium/issues/9353) — Canvas (Excalidraw) is a supported note type and keyboard-modifier zoom is a reasonable accessibility-style addition.
|
||||
|
||||
## Niche / Scripting Territory (77)
|
||||
|
||||
These serve specific workflows or small audiences. Trilium already has a scripting API + custom note types + templates — most of these could be built as user scripts or plugins without touching core. Each rationale includes the suggested alternative.
|
||||
|
||||
### From Batch 15
|
||||
|
||||
- [#641 — npm install additional libraries](https://github.com/TriliumNext/Trilium/issues/641) — Arbitrary npm module loading is an advanced scripting-environment concern best handled by users extending their own backend scripts.
|
||||
- [#673 — External Resource Notes (npm/git-backed)](https://github.com/TriliumNext/Trilium/issues/673) — A highly speculative note type that could be prototyped as a custom note type or script rather than a core feature.
|
||||
- [#825 — Link preview](https://github.com/TriliumNext/Trilium/issues/825) — Rich external link previews are better implemented as a custom widget/script since they involve third-party metadata fetching.
|
||||
- [#986 — Community Code Library / Plugin System](https://github.com/TriliumNext/Trilium/issues/986) — A community plugin/theme registry is adjacent to Trilium's scripting model but is an ecosystem/infrastructure effort rather than a core feature.
|
||||
### From Batch 14
|
||||
|
||||
- [#1142 — enhance link map](https://github.com/TriliumNext/Trilium/issues/1142) — TheBrain-style parent/child/jump visualization is a specialized visualization overhaul better explored as a custom view.
|
||||
- [#1288 — save picture of linkmap](https://github.com/TriliumNext/Trilium/issues/1288) — Exporting the link map to image is niche and achievable via browser/devtools or scripting.
|
||||
- [#1507 — save & reset link map arrangement & zoom level](https://github.com/TriliumNext/Trilium/issues/1507) — Persisted link-map layouts are niche polish for a legacy visualization feature.
|
||||
- [#1650 — Copy notes from tree and paste into relation map](https://github.com/TriliumNext/Trilium/issues/1650) — Cross-widget clipboard into the (legacy) relation map is a narrow power-user workflow.
|
||||
- [#1654 — Contextual Similar notes algorithm based on search string](https://github.com/TriliumNext/Trilium/issues/1654) — Threading search context into similar-notes ranking is a speculative tweak to an existing heuristic.
|
||||
- [#1697 — Populate a hyperlinked md file from table rows](https://github.com/TriliumNext/Trilium/issues/1697) — Table-to-templated-note generation is squarely a scripting/template use case.
|
||||
- [#1716 — Generating citation from note attributes](https://github.com/TriliumNext/Trilium/issues/1716) — BibTeX generation from promoted attributes is a classic backend-script use case.
|
||||
### From Batch 13
|
||||
|
||||
- [#1850 — Collapsable bullets](https://github.com/TriliumNext/Trilium/issues/1850) — Outliner-style collapsible bullets are a CKEditor-heavy feature better handled as a custom plugin/script.
|
||||
- [#1949 — Fine-grained inheritance control (depth, conditions)](https://github.com/TriliumNext/Trilium/issues/1949) — Complex conditional inheritance is better expressed via scripted attribute logic.
|
||||
- [#1950 — Transclusion of attributes/searches into note body](https://github.com/TriliumNext/Trilium/issues/1950) — Already achievable via render notes / scripts as the author acknowledges.
|
||||
- [#1958 — Bulk note creation from text list](https://github.com/TriliumNext/Trilium/issues/1958) — One-off import/scaffold operation well-suited to a backend script.
|
||||
- [#2115 — BibTeX citation support like Zettlr](https://github.com/TriliumNext/Trilium/issues/2115) — Academic citation workflow is niche and better as a custom CKEditor plugin/script.
|
||||
- [#2186 — today/yesterday search terms for day notes](https://github.com/TriliumNext/Trilium/issues/2186) — Relative date search aliases are easily handled in a small script as the author already plans.
|
||||
- [#2330 — Aggregate unfinished TODO items from notes](https://github.com/TriliumNext/Trilium/issues/2330) — Canonical use case for a backend search/render script.
|
||||
- [#2351 — Documentation for mobile frontend plugin buttons](https://github.com/TriliumNext/Trilium/issues/2351) — Docs request about the scripting/launcher extension surface, handled in the script API docs.
|
||||
- [#2354 — Group edited-notes list by shared path](https://github.com/TriliumNext/Trilium/issues/2354) — Specific cosmetic preference for the edited-notes widget, easily done via a custom render script.
|
||||
### From Batch 12
|
||||
|
||||
- [#2526 — Simple recurring todo](https://github.com/TriliumNext/Trilium/issues/2526) — Todo/recurrence is not a first-class concept in Trilium and is well-suited to a backend script via the existing API.
|
||||
- [#2544 — Forms/Fields in a template](https://github.com/TriliumNext/Trilium/issues/2544) — Structured form fields are largely achievable today via promoted attributes and templates; further custom forms are scripting territory.
|
||||
- [#2802 — Shared SQL between SQL code notes](https://github.com/TriliumNext/Trilium/issues/2802) — An `%INCLUDE%` mechanism for ad-hoc SQL notes is a niche power-user tweak better done via scripting.
|
||||
- [#3037 — Upgrade the Relation Map (dynamic scripting)](https://github.com/TriliumNext/Trilium/issues/3037) — Dynamic scripted styling/rendering inside Relation Maps is niche and overlaps with Render Notes/scripting.
|
||||
### From Batch 11
|
||||
|
||||
- [#3269 — "Repeated but unique" relation constraint](https://github.com/TriliumNext/Trilium/issues/3269) — Highly personal citation-graph requirement that a backend script attribute-validator can handle.
|
||||
- [#3493 — Attribute inheritance across arbitrary relations](https://github.com/TriliumNext/Trilium/issues/3493) — Powerful but complex semantics; best prototyped via scripting before touching core attribute engine.
|
||||
- [#3498 — More ranking signals / ML for search and autocomplete](https://github.com/TriliumNext/Trilium/issues/3498) — Ambitious ranking overhaul with ML ambitions more suited to experimentation/plugin rather than core search.
|
||||
- [#3551 — Custom context-menu widget API](https://github.com/TriliumNext/Trilium/issues/3551) — A plugin/scripting extension point rather than a built-in product feature.
|
||||
- [#3557 — Full-text search via command line](https://github.com/TriliumNext/Trilium/issues/3557) — Niche CLI integration that ETAPI plus a small user script already covers.
|
||||
### From Batch 10
|
||||
|
||||
- [#3798 — Reference page listing all link locations](https://github.com/TriliumNext/Trilium/issues/3798) — Easily built as a backend script walking a subtree; too specific to warrant a core feature.
|
||||
- [#3840 — Transclusion as a note map relation type](https://github.com/TriliumNext/Trilium/issues/3840) — A very specialized note-map view that fits custom visualization scripting rather than a core toggle.
|
||||
- [#3902 — View child notes inside canvas note](https://github.com/TriliumNext/Trilium/issues/3902) — Excalidraw-specific cross-note rendering is niche and partially overlaps relation map; better suited as a custom canvas integration.
|
||||
- [#3905 — Central Excalidraw library for all canvas notes](https://github.com/TriliumNext/Trilium/issues/3905) — Niche Excalidraw workflow that can be handled via cloned library notes or scripting.
|
||||
- [#4052 — File selecting items stored in notes](https://github.com/TriliumNext/Trilium/issues/4052) — Exposing note attachments to OS file pickers is an OS/browser sandboxing issue beyond Trilium's scope, and partially scriptable.
|
||||
- [#4061 — Unix Days as calendar](https://github.com/TriliumNext/Trilium/issues/4061) — Extremely niche alternative calendar format that is better suited to a user script or custom day-note structure.
|
||||
### From Batch 09
|
||||
|
||||
- [#4203 — Import/Export multilevel node as single MD file](https://github.com/TriliumNext/Trilium/issues/4203) — Non-standard export format (flatten subtree into headings) better handled via a custom export script.
|
||||
- [#4354 — Input cursor always positioned in the center of screen](https://github.com/TriliumNext/Trilium/issues/4354) — Typewriter-mode is a niche editor preference better implemented as a user script/CSS.
|
||||
- [#4384 — Display attachments directly inside notes](https://github.com/TriliumNext/Trilium/issues/4384) — Conflicts with the note/attachment model; inline video/PDF playback for arbitrary attachments is a niche rendering ask handled by custom widgets.
|
||||
- [#4651 — Include webviews into text notes as preview](https://github.com/TriliumNext/Trilium/issues/4651) — Niche preview-in-note rendering that's better handled by custom scripts or note-type-specific widgets.
|
||||
- [#4668 — Create clone location when it doesn't exist](https://github.com/TriliumNext/Trilium/issues/4668) — Edge-case workflow tweak to the clone dialog that's unlikely to benefit most users.
|
||||
- [#4755 — Enable trilium iframe compatibility](https://github.com/TriliumNext/Trilium/issues/4755) — Weakens security headers (X-Frame-Options/CSP) for a niche reverse-proxy embed use case; at most a config option.
|
||||
- [#4811 — Attribute to change document link behaviour](https://github.com/TriliumNext/Trilium/issues/4811) — Small link-target preference that is easily handled by custom CSS or a user script.
|
||||
- [#4832 — Tag-based note connections in Note Map](https://github.com/TriliumNext/Trilium/issues/4832) — Relation Map already supports custom attribute-driven connections; this is a niche visualization tweak.
|
||||
### From Batch 08
|
||||
|
||||
- [#5217 — Friendly share urls: turn title into shareAlias](https://github.com/TriliumNext/Trilium/issues/5217) — The request itself explicitly proposes this as a user script/button action.
|
||||
- [#5268 — Register icon pack in mermaid](https://github.com/TriliumNext/Trilium/issues/5268) — Custom mermaid icon pack registration is a niche configuration better handled via scripting or mermaid config.
|
||||
### From Batch 07
|
||||
|
||||
- [#5410 — Add the ability to create a shell link (shortcut) for a note](https://github.com/TriliumNext/Trilium/issues/5410) — OS-specific shortcut file generation is better served by user scripts or manual URL-based shortcuts.
|
||||
- [#5480 — Notification API for scripts](https://github.com/TriliumNext/Trilium/issues/5480) — A narrow scripting API addition that benefits a small set of script authors; reasonable but scoped to the scripting surface.
|
||||
- [#5481 — Selected Note API for scripts](https://github.com/TriliumNext/Trilium/issues/5481) — Another targeted scripting API extension useful primarily for custom script workflows.
|
||||
- [#5511 — Calculated content in templates via inline Javascript](https://github.com/TriliumNext/Trilium/issues/5511) — Templating with inline JS overlaps with existing `runOnNoteCreation` scripting and is better handled by improving that path rather than adding a new evaluator.
|
||||
### From Batch 06
|
||||
|
||||
- [#5572 — API Function to Raise Window](https://github.com/TriliumNext/Trilium/issues/5572) — Very specific Electron convenience; could be added as a small frontend API helper, but is otherwise a user-script concern.
|
||||
- [#5585 — Search Prefix (JS code block for result prefixes)](https://github.com/TriliumNext/Trilium/issues/5585) — Arbitrary code hook for search rendering is better expressed as a custom render script or a render-note feature rather than a core search option.
|
||||
### From Batch 05
|
||||
|
||||
- [#5825 — Annotate image](https://github.com/TriliumNext/Trilium/issues/5825) — Would require a dedicated image editor; better covered by pasting into the existing Canvas (Excalidraw) note type and annotating there.
|
||||
- [#5849 — macOS-style label/tag system](https://github.com/TriliumNext/Trilium/issues/5849) — Duplicates Trilium's attribute/label system; any macOS-flavored UI could be a user CSS/script theme.
|
||||
- [#6350 — Repeat last action shortcut (Word-style F4)](https://github.com/TriliumNext/Trilium/issues/6350) — CKEditor doesn't expose a generic "last command" model; realistically a custom CKEditor plugin experiment rather than a core feature.
|
||||
- [#6407 — Kanban Board enhancements (subtasks, progress, drag-drop)](https://github.com/TriliumNext/Trilium/issues/6407) — Kanban is not a core Trilium subsystem; these project-management flourishes are better as a community template/script package.
|
||||
- [#6409 — Checklist progress](https://github.com/TriliumNext/Trilium/issues/6409) — A nice-to-have text editor sugar achievable today with a frontend script counting `<input type=checkbox>` in note content.
|
||||
- [#6779 — Embedded playbook / runnable script steps](https://github.com/TriliumNext/Trilium/issues/6779) — Overlaps with Trilium's existing backend script note type; a richer multi-step runbook UI is a narrow power-user workflow better built as a custom note type or script.
|
||||
### From Batch 04
|
||||
|
||||
- [#7006 — hope to add protect single note frontApi](https://github.com/TriliumNext/Trilium/issues/7006) — Per-note lock-on-tab-switch is a specific privacy workflow; exposing a frontend API hook is fine but the feature itself is better implemented as a user script using existing protected-session primitives.
|
||||
- [#7024 — where is my clone note? An easy way to find clone note](https://github.com/TriliumNext/Trilium/issues/7024) — The underlying request (locate clones of a specific note) is reasonable but the proposed solution overlaps with existing note-path and note-map features; a small script or a note-map filter would address it without new core UI.
|
||||
- [#7291 — Calendar view adds support for Resource Timeline](https://github.com/TriliumNext/Trilium/issues/7291) — Resource timelines are a scheduling/project-management use case well outside typical PKM; better addressed by a custom FullCalendar-based script or a dedicated template.
|
||||
- [#7635 — Option to use background images in presentations](https://github.com/TriliumNext/Trilium/issues/7635) — Reveal.js presentation polish for a specific subset of users; better handled via per-slide attributes or a script that sets reveal.js background properties.
|
||||
- [#7670 — Attachment link customization](https://github.com/TriliumNext/Trilium/issues/7670) — Custom share URL routing to enable Google Docs preview is a specific integration workflow; better as a share-layer customization or reverse-proxy rewrite than a core feature.
|
||||
### From Batch 03
|
||||
|
||||
- [#7893 — Add Podman installation to documentation](https://github.com/TriliumNext/Trilium/issues/7893) — Docs-only request for an alternate container runtime; better handled as a community wiki/docs PR than core work.
|
||||
- [#7923 — Auto Import Folder Contents To Trilium](https://github.com/TriliumNext/Trilium/issues/7923) — Filesystem watcher inbox is a specific workflow; better as a backend script using the existing import API.
|
||||
- [#8107 — Support Markdown (mindmap extension) syntax](https://github.com/TriliumNext/Trilium/issues/8107) — Unclear/niche mind-map markdown dialect request; more appropriate as a custom importer or script than built-in syntax.
|
||||
- [#8140 — "shareExternalLink"-type label for PDF generation](https://github.com/TriliumNext/Trilium/issues/8140) — Specialized collaboration workaround for DNS-blocked colleagues; a backend script rewriting links pre-export would fit the workflow.
|
||||
- [#8150 — Note header image](https://github.com/TriliumNext/Trilium/issues/8150) — Cosmetic SiYuan/Craft-style feature; achievable today via custom CSS or a script-injected template.
|
||||
### From Batch 02
|
||||
|
||||
- [#8382 — Inline tabs in pages](https://github.com/TriliumNext/Trilium/issues/8382) — An admonition-style tab block is doable but better shipped as a custom CKEditor5 plugin (similar to the existing admonition/footnotes packages) rather than as a core content primitive.
|
||||
- [#8590 — Custom Font Selection with System Font Support](https://github.com/TriliumNext/Trilium/issues/8590) — Font family is already configurable via CSS/themes; a system-font enumerator is a niche cosmetic feature better served by a theme or user CSS snippet.
|
||||
- [#8600 — Microsoft Word style whole-word formatting commands](https://github.com/TriliumNext/Trilium/issues/8600) — Very small CKEditor5 behavioral tweak serving a narrow muscle-memory preference; fine as an upstream config or frontend script.
|
||||
- [#8663 — Web Clipper for ChatGPT](https://github.com/TriliumNext/Trilium/issues/8663) — ChatGPT's virtualized DOM breaks the generic clipper; a site-specific extractor is a fragile, single-site special case better handled by a user script or Readability tweak.
|
||||
- [#8700 — Add G-code formatting](https://github.com/TriliumNext/Trilium/issues/8700) — CodeMirror/highlight.js already cover mainstream languages; G-code is a niche CNC domain better shipped as a user-contributed syntax mode than bundled by default.
|
||||
### From Batch 01
|
||||
|
||||
- [#8766 — Checkbox tree](https://github.com/TriliumNext/Trilium/issues/8766) — Multi-select-with-checkboxes on the note tree is a niche workflow; could be achieved via a frontend script or custom tree widget rather than core.
|
||||
- [#8957 — Better Separation Between Notes and System Scripts](https://github.com/TriliumNext/Trilium/issues/8957) — Trilium already has the hidden subtree and `#template`/`#appCss` attributes; users can organize their own scripts into a dedicated branch or use the existing hidden subtree conventions.
|
||||
- [#8963 — Bookmark while viewing pdf](https://github.com/TriliumNext/Trilium/issues/8963) — Per-PDF bookmarking is specific to heavy PDF readers; better served by the native PDF.js viewer's own features or a custom widget than by first-class note metadata.
|
||||
- [#9006 — Switch Alt Enter with Enter](https://github.com/TriliumNext/Trilium/issues/9006) — Personal keybinding preference that conflicts with standard rich-text paragraph behavior; users can remap via the existing keyboard shortcut settings.
|
||||
- [#9336 — Global Bookmarks](https://github.com/TriliumNext/Trilium/issues/9336) — This reinvents cross-note anchors/named links; the existing internal-link and `#` reference system already addresses the underlying need without a new global namespace.
|
||||
|
||||
## Out of Scope (55)
|
||||
|
||||
These don't fit Trilium's identity as a personal hierarchical note-taking app with power-user features. Common rejection themes: real-time collaboration, CMS-style publishing, IDE-like features, fundamental architectural rewrites (sync protocol, encryption model), tool replacements, vendor promos. Each rationale names what Trilium would have to become to accept it.
|
||||
|
||||
### From Batch 15
|
||||
|
||||
- [#1026 — Show Trilium content related to my web searches](https://github.com/TriliumNext/Trilium/issues/1026) — A browser search-results injection feature is outside the clipper's scope and raises privacy/complexity concerns.
|
||||
- [#242 — CalDAV Support](https://github.com/TriliumNext/Trilium/issues/242) — Implementing CalDAV server/client protocol for calendar and task sync is well outside Trilium's PKM scope.
|
||||
### From Batch 14
|
||||
|
||||
- [#1209 — Clipper for PDF files?](https://github.com/TriliumNext/Trilium/issues/1209) — Bulk PDF ingestion and metadata scraping is beyond the web clipper's scope; PDFs are already importable as file notes.
|
||||
- [#1233 — Block Reference and transclude function](https://github.com/TriliumNext/Trilium/issues/1233) — Obsidian/Roam-style block transclusion conflicts with Trilium's note-level model and CKEditor architecture.
|
||||
- [#1280 — Enabling custom Ckeditor plugins](https://github.com/TriliumNext/Trilium/issues/1280) — User-installable CKEditor plugins is an Obsidian-plugin-style ecosystem Trilium explicitly does not pursue.
|
||||
- [#1386 — Zotero integration](https://github.com/TriliumNext/Trilium/issues/1386) — Deep reference-manager integration is outside PKM core and better implemented via scripts/ETAPI.
|
||||
- [#1479 — Apache proxy setup notes](https://github.com/TriliumNext/Trilium/issues/1479) — This is wiki/documentation feedback, not a product feature.
|
||||
- [#1567 — Proof import / sanitize filenames](https://github.com/TriliumNext/Trilium/issues/1567) — Mixes a bug-style concern with niche filename-rewriting that would likely break round-trip import/export semantics.
|
||||
- [#1589 — Setting to reduce logging only to errors](https://github.com/TriliumNext/Trilium/issues/1589) — Log verbosity tuning is a low-value config knob; standard syslog filtering handles this externally.
|
||||
- [#1625 — Add custom MIME types for code notes](https://github.com/TriliumNext/Trilium/issues/1625) — Referenced race-condition history and CodeMirror maintenance burden make this an unattractive extension point.
|
||||
- [#1704 — Content block reference and embedding](https://github.com/TriliumNext/Trilium/issues/1704) — Same as #1233: block transclusion is fundamentally incompatible with Trilium's editor architecture.
|
||||
### From Batch 13
|
||||
|
||||
- [#1853 — Zotero engines.json integration](https://github.com/TriliumNext/Trilium/issues/1853) — Zotero-side config for external lookup, not something Trilium itself should ship.
|
||||
- [#1909 — One-way asymmetric encryption of notes](https://github.com/TriliumNext/Trilium/issues/1909) — Introduces a whole new crypto model duplicating the existing protected-notes feature with uncertain security benefit.
|
||||
- [#1927 — Andy Matuschak-style stacked note navigation](https://github.com/TriliumNext/Trilium/issues/1927) — Fundamentally different navigation paradigm that doesn't match Trilium's tab/tree model.
|
||||
- [#2159 — jsPlumb node groups in relation map](https://github.com/TriliumNext/Trilium/issues/2159) — Highly specific to the legacy relation-map implementation and unlikely to be prioritized.
|
||||
- [#2259 — Embedded Neovim support](https://github.com/TriliumNext/Trilium/issues/2259) — Embedding nvim turns Trilium into an IDE host, far outside its scope (Vim keybindings in CodeMirror already exist).
|
||||
- [#2261 — Chrome "create shortcut" start URL](https://github.com/TriliumNext/Trilium/issues/2261) — Browser-specific PWA launcher workaround; user can configure URL manually.
|
||||
- [#2391 — One-click CapRover installation](https://github.com/TriliumNext/Trilium/issues/2391) — Belongs in CapRover's own one-click apps catalog, not Trilium's repo.
|
||||
- [#2404 — Google-style full-text search results](https://github.com/TriliumNext/Trilium/issues/2404) — Vague ask to reskin search results as a web search engine; doesn't match a hierarchical note UI.
|
||||
### From Batch 12
|
||||
|
||||
- [#2620 — Expiration date & max requests for shared notes](https://github.com/TriliumNext/Trilium/issues/2620) — Share lifecycle/rate limiting leans toward a publishing/CMS feature beyond Trilium's personal PKM sharing model.
|
||||
- [#2637 — Allow styling of mini date selector](https://github.com/TriliumNext/Trilium/issues/2637) — The native browser control cannot be styled without rewriting the widget, for marginal benefit.
|
||||
- [#2654 — Server to Server Sync](https://github.com/TriliumNext/Trilium/issues/2654) — Multi-master/HA clustering fundamentally conflicts with Trilium's single-authoritative-server sync design.
|
||||
- [#2726 — Block References like Obsidian/Logseq](https://github.com/TriliumNext/Trilium/issues/2726) — Block-level referencing is a core data-model shift that doesn't fit Trilium's note-as-unit model.
|
||||
- [#2869 — Bypass auth for specific IP/subnet](https://github.com/TriliumNext/Trilium/issues/2869) — IP-based auth bypass is better handled by a reverse proxy and introduces security risk Trilium shouldn't own.
|
||||
### From Batch 11
|
||||
|
||||
- [#3246 — Integrate PlantUML via CKEditor plugin](https://github.com/TriliumNext/Trilium/issues/3246) — Relies on an unmaintained third-party plugin and overlaps with the existing Mermaid support.
|
||||
- [#3263 — Generalize the tree to arbitrary transitive relations](https://github.com/TriliumNext/Trilium/issues/3263) — Fundamental rethink of Trilium's core tree model, incompatible with existing UI/data assumptions.
|
||||
- [#3399 — Export descendants plus linked notes](https://github.com/TriliumNext/Trilium/issues/3399) — Expanding export beyond the hierarchy would require complex closure/cycle handling not aligned with the export model.
|
||||
- [#3633 — Web page snapshotting / Scrapyard-like offline capture](https://github.com/TriliumNext/Trilium/issues/3633) — Large archiving feature belongs in the web clipper domain, not the core app.
|
||||
### From Batch 10
|
||||
|
||||
- [#3825 — Office document support](https://github.com/TriliumNext/Trilium/issues/3825) — Embedding/editing Office documents is outside Trilium's PKM scope and is adequately handled by file attachments.
|
||||
- [#3865 — MyScript Handwriting integration](https://github.com/TriliumNext/Trilium/issues/3865) — Bundling a third-party commercial handwriting API is out of scope for a local-first PKM tool.
|
||||
- [#3906 — Host Trilium demo instance](https://github.com/TriliumNext/Trilium/issues/3906) — This is a community/hosting request, not a product feature, and unsuitable for a self-hosted multi-user app.
|
||||
- [#3978 — Login page custom background](https://github.com/TriliumNext/Trilium/issues/3978) — Cosmetic tweak to the server login page, already achievable via custom CSS and not worth a built-in setting.
|
||||
- [#4099 — Rename "clones" to "instances"](https://github.com/TriliumNext/Trilium/issues/4099) — Terminology rename of a deeply embedded concept would cause documentation and API churn for marginal clarity gains.
|
||||
### From Batch 09
|
||||
|
||||
- [#4345 — Sync API support for ETAPI](https://github.com/TriliumNext/Trilium/issues/4345) — Exposing the internal sync/changelog protocol via ETAPI risks corrupting the sync state machine and is outside ETAPI's mandate.
|
||||
- [#4701 — LanguageTool integration](https://github.com/TriliumNext/Trilium/issues/4701) — Grammar checking is an external service integration better left to browser extensions or user scripts, not core Trilium.
|
||||
- [#4816 — Public Link with Advanced Search on shared tree](https://github.com/TriliumNext/Trilium/issues/4816) — Pushes Shaca/shared notes toward becoming a publishing CMS with guest accounts, contrary to core identity.
|
||||
- [#4834 — Import PDF files into Canvas notes](https://github.com/TriliumNext/Trilium/issues/4834) — PDF-to-image rasterization is a heavy external dependency for a niche Excalidraw workflow.
|
||||
- [#4837 — Cloud Deployment](https://github.com/TriliumNext/Trilium/issues/4837) — Trilium already ships Docker; packaging for a dozen third-party PaaS platforms is not core team work.
|
||||
### From Batch 08
|
||||
|
||||
- [#4871 — Adding Elestio as deployment option](https://github.com/TriliumNext/Trilium/issues/4871) — Vendor promotional/partnership request, not a product feature.
|
||||
- [#4956 — Milestone: Multi-user support](https://github.com/TriliumNext/Trilium/issues/4956) — Multi-user/collaboration contradicts Trilium's stated single-user PKM identity.
|
||||
- [#4957 — End-to-end encryption (database-level)](https://github.com/TriliumNext/Trilium/issues/4957) — Conflicts with server-side features like search and share; Trilium already has per-note protected encryption.
|
||||
- [#4969 — Note editors other than CKEditor](https://github.com/TriliumNext/Trilium/issues/4969) — Swapping out the core rich text editor is infeasible and conflicts with the CKEditor-centric architecture.
|
||||
### From Batch 07
|
||||
|
||||
- [#5355 — Import/Merge another Trilium database into current database](https://github.com/TriliumNext/Trilium/issues/5355) — Merging entire databases conflicts with Trilium's sync model and would introduce severe entity-ID and revision conflicts; users should use sync instead.
|
||||
- [#5451 — Add polylines or polygons on the geomap note type](https://github.com/TriliumNext/Trilium/issues/5451) — Turning the geomap into a GIS drawing tool goes well beyond its note-pinning purpose.
|
||||
### From Batch 06
|
||||
|
||||
- [#5561 — task management (Kanban + progress + timeline + repetition)](https://github.com/TriliumNext/Trilium/issues/5561) — Turns Trilium into a task/PM tool; Kanban-first workflows and scheduled recurring tasks are outside core PKM identity.
|
||||
- [#5598 — Run multiple client instances / connect to multiple servers](https://github.com/TriliumNext/Trilium/issues/5598) — Requires fundamentally rethinking the single-profile Electron architecture and multi-server sync model.
|
||||
- [#5690 — markdown editor](https://github.com/TriliumNext/Trilium/issues/5690) — Duplicates the existing rich text editor's role; Trilium's model is CKEditor5 with markdown import/export, not a parallel raw-markdown note type.
|
||||
- [#5692 — codesandbox Sandpack note or plugin](https://github.com/TriliumNext/Trilium/issues/5692) — Embedding a live code sandbox turns Trilium into a code playground/IDE, far outside PKM scope.
|
||||
### From Batch 05
|
||||
|
||||
- [#6351 — Mount part of note tree as writable filesystem folder](https://github.com/TriliumNext/Trilium/issues/6351) — Would require a FUSE/WebDAV layer with bidirectional sync semantics, conflicting with Trilium's database-first architecture.
|
||||
- [#6406 — Packaging for Chocolatey](https://github.com/TriliumNext/Trilium/issues/6406) — Third-party package repository work; should live with a community maintainer, not in the core project.
|
||||
- [#6546 — Store file notes on the filesystem instead of the database](https://github.com/TriliumNext/Trilium/issues/6546) — Fundamental storage model change that breaks the single-file portability, sync, and protected-note guarantees Trilium is built around.
|
||||
### From Batch 04
|
||||
|
||||
- [#7411 — Better encryption algorithms](https://github.com/TriliumNext/Trilium/issues/7411) — Trilium already uses AES-128 with a deliberate tradeoff; swapping to XChaCha20-Poly1305/Argon2id means a migration path, sync-protocol changes, and cross-client crypto rewrites with low practical security ROI for personal notes.
|
||||
### From Batch 03
|
||||
|
||||
- [#8225 — Offline mode for the PWA](https://github.com/TriliumNext/Trilium/issues/8225) — Would require reimplementing the full Becca stack and sync engine in the browser (IndexedDB, service worker), essentially a new client architecture with very low ROI given the Electron app already exists.
|
||||
### From Batch 02
|
||||
|
||||
- [#8477 — Folders, folders, folders (installer/data dir picker)](https://github.com/TriliumNext/Trilium/issues/8477) — This is a packaging/installer complaint, not a product feature; the data directory is already configurable via env vars and the Electron installer is standard — it would require replacing the installer/packaging stack with no product benefit.
|
||||
- [#8534 — Password reset makes protected notes unrecoverable](https://github.com/TriliumNext/Trilium/issues/8534) — The proposed "deterministic key from password" fix would break the entire protected-session threat model (it is *designed* so that losing the password loses the data); this is a docs/UX warning issue, not a feature the product should adopt.
|
||||
|
||||
## Unclear (2)
|
||||
|
||||
These couldn't be judged without clarification from the reporter. Not rejections — ping the reporter.
|
||||
|
||||
### From Batch 08
|
||||
|
||||
- [#4922 — restore backed up database files to notes](https://github.com/TriliumNext/Trilium/issues/4922) — The request mixes a sync failure bug report with an unclear restore workflow; intent is ambiguous.
|
||||
### From Batch 03
|
||||
|
||||
- [#8122 — Continue updating on chocolatey repository](https://github.com/TriliumNext/Trilium/issues/8122) — Needs clarification on whether this refers to the legacy zadam/Trilium Chocolatey package or a new TriliumNext publish, and who would own maintenance.
|
||||
@@ -1,298 +0,0 @@
|
||||
# Likely Already Fixed — Trilium Issue Review
|
||||
|
||||
Consolidated from per-batch analysis of all 859 open issues (as of 2026-04-09).
|
||||
Total likely-already-fixed candidates: **58**
|
||||
|
||||
These issues show signs of being resolved in current `main`: references to removed/renamed files, commits that clearly address the symptom, or reproduction steps that no longer work. **Do not close blindly** — each one should be verified and ideally asked about by the maintainer before closing.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 01
|
||||
|
||||
### [#9009 — Option to easily toggle the fuzzy search on/off](https://github.com/TriliumNext/Trilium/issues/9009)
|
||||
- **Evidence**: Commit `f23a7b4842 feat(settings): also allow for fuzzy searching to just be disabled` (Mar 18 2026) adds a disable toggle in `apps/client/src/widgets/type_widgets/options/other.tsx`, wires it to `search_context.ts`, and updates `options_init.ts` + `options_interface.ts`. This lands after the issue was filed.
|
||||
- **Verification needed**: A maintainer can confirm the new toggle exists in the Options UI (Other tab) in a current build and ask the reporter whether it satisfies their need; also verify the "quick jump" fuzzy concern mentioned in the issue is covered by the same toggle.
|
||||
|
||||
### [#8866 — Cursor jumps to note beginning periodically, tabs reset — LauncherContainer](https://github.com/TriliumNext/Trilium/issues/8866)
|
||||
- **Evidence**: The error messages reference `LauncherContainer.js:545` (0.101.3). The current repo has `apps/client/src/widgets/launch_bar/LauncherContainer.tsx` — the widget was rewritten as a React component. Reported actions (`hideLeftPane`, `searchNotes`, `enterProtectedSession`) still exist but the rAF-in-launcher-container reflow storm described in the log looks gone after the rewrite.
|
||||
- **Verification needed**: Maintainer should ask the reporter to retest on 0.102.2+ since the underlying file no longer exists in its 0.101.x form.
|
||||
|
||||
### [#8790 — Some assets not work in share notes when serving under a different path](https://github.com/TriliumNext/Trilium/issues/8790)
|
||||
- **Evidence**: Issue references the path `assets/v0.99.3/src/share.js`. The share rendering pipeline has been completely replaced — share assets are now served from `packages/share-theme/` and `apps/server/src/share/content_renderer.ts` uses `basePath`-based asset URLs. The old `/assets/vX.X.X/src/share.js` path no longer exists.
|
||||
- **Verification needed**: Maintainer should have the reporter retest with 0.102.x and the current reverse-proxy guide; the specific 404 URL from the bug cannot occur in the current codebase.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 02
|
||||
|
||||
### [#8407 — Why was the title selection for new notes cancelled](https://github.com/TriliumNext/Trilium/issues/8407)
|
||||
- **Evidence**: `apps/client/src/widgets/note_title.tsx` (lines 61–69) explicitly calls `textBoxRef.current.select()` on `focusAndSelectTitle` events, and `apps/client/src/services/note_create.ts:92` triggers that event with `isNewNote: true`. A relevant fix `06cea99b40 fix(react): note title not selecting text` (Aug 2025) pre-dates the issue, but recent churn in the title widget (e.g. `c09ef3af80`, Feb 2026) suggests the bug may have returned and then been addressed after the reporter filed on 0.101.3.
|
||||
- **Verification needed**: Ask the reporter to retest on nightly / current main.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 03
|
||||
|
||||
### [#8060 — fix(search): Canvas notes with empty or missing elements cause quick search to crash](https://github.com/TriliumNext/Trilium/issues/8060)
|
||||
- **Evidence**: `git log -S "Array.isArray(elements)"` shows commit `ecb972c71c fix(search): add null check for canvas elements in fulltext search`. The canvas handling has since moved to `apps/server/src/services/search/expressions/note_content_fulltext_preprocessor.ts` where `processCanvasContent` (lines 83–108) now guards with `if (Array.isArray(elements))` and returns `""` otherwise — exactly the fix proposed in the issue.
|
||||
- **Verification needed**: Confirm with the reporter on a current nightly and close.
|
||||
|
||||
### [#7884 — Remove `docker-compose.rootless.yaml`](https://github.com/TriliumNext/Trilium/issues/7884)
|
||||
- **Evidence**: `Glob "docker-compose.rootless*"` at repo root returns no files; the file has been removed.
|
||||
- **Verification needed**: Grep any docs for dangling mentions of `docker-compose.rootless` and close. (Also listed under easy-fix in case any lingering references need cleanup.)
|
||||
|
||||
---
|
||||
|
||||
## From Batch 04
|
||||
|
||||
### [#6989 — New client sync issues](https://github.com/TriliumNext/Trilium/issues/6989)
|
||||
- **Evidence**: Reporter is on **0.95.0** (released mid-2025) and describes websocket connection drops against a reverse proxy. The codebase has had several sync/websocket robustness fixes since 0.98. Current version is ~0.99.4.
|
||||
- **Verification needed**: Ask reporter to retry on the latest version. If still reproducing, collect a fresh sync/WS log.
|
||||
|
||||
### [#6999 — Editing a Relation (from template) in mobile view, don't work](https://github.com/TriliumNext/Trilium/issues/6999)
|
||||
- **Evidence**: Reporter is on **0.91.1**, which is extremely old relative to current mobile rework. The mobile attribute editor has been largely rewritten (`apps/client/src/widgets/attribute_widgets/*.tsx` is now React/TSX).
|
||||
- **Verification needed**: Ask reporter to retry on 0.99.x; close if no repro.
|
||||
|
||||
### [#7393 — Note content overwritten when changing title of snippets](https://github.com/TriliumNext/Trilium/issues/7393)
|
||||
- **Evidence**: Reporter is on **0.97.1**. Text snippet handling (`#textSnippet`) has been refactored since — see `apps/client/src/widgets/type_widgets/text/EditableText.tsx` and related CKEditor 5 integration. The described "flashing + content swap" while editing title suggests the old debounced save path that was rewritten around 0.99.
|
||||
- **Verification needed**: Ask reporter to retry on 0.99.4 with the specific snippet-switching STR.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 05
|
||||
|
||||
### [#6390 — `arm64` docker image does not include `wget`](https://github.com/TriliumNext/Trilium/issues/6390)
|
||||
- **Evidence**: I read `apps/server/Dockerfile` and `Dockerfile.alpine`. Both use `HEALTHCHECK ... node /usr/src/app/docker_healthcheck.cjs` (line 28 / 26) — there is no longer any `wget`-based healthcheck. The runtime stage installs only `gosu` (Debian) or `su-exec` (Alpine). Commit `614958f16c chore(docker): reintroduce healthchecks` (Apr 2025) switched healthchecks from `wget` to a node script before this issue was filed (Jul 2025), so there is no dependency on `wget` in the current image — the issue may actually be about Coolify's external healthcheck expectations, not Trilium's image.
|
||||
- **Verification needed**: Maintainer should confirm that Trilium's own image indeed no longer requires wget for healthchecks and respond to the Coolify maintainer on the upstream template; close as "not a Trilium bug" or as a docs-only fix.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 06
|
||||
|
||||
### [#5669 — Add link dialog fails to link if you press enter twice too quickly](https://github.com/TriliumNext/Trilium/issues/5669)
|
||||
- **Evidence**: `git log --grep "enter twice\|link.*enter"` finds commit `f6201d8581` "fix: add link dialog enter act correctly" (Mar 2026) which touches `apps/client/src/widgets/dialogs/add_link.tsx` (+76 lines) and adds a 160-line spec file. Directly addresses this bug.
|
||||
- **Verification needed**: Run the reproduction steps from the issue in the latest main build and confirm it is no longer possible to trigger the "Choose note type" dialog by fast double-enter in the add-link flow.
|
||||
|
||||
### [#5606 — OpenID Connect support](https://github.com/TriliumNext/Trilium/issues/5606)
|
||||
- **Evidence**: `apps/server/src/services/open_id.ts` exists; `express-openid-connect` is a direct dependency and has been continuously updated (git log shows `2.20.1`, `2.20.0`, `2.19.4`, etc.); OIDC docs have been improved (commit `963f4586f3`). The feature has clearly shipped.
|
||||
- **Verification needed**: Confirm documentation covers configuration with Authelia/Keycloak/Authentik so the original reporter's use cases are answered, then close.
|
||||
|
||||
### [#5545 — Fancytree assertion failed: only init supported](https://github.com/TriliumNext/Trilium/issues/5545)
|
||||
- **Evidence**: fancytree has since been updated to v2.38.5 (`5db8b59b51`) plus a "partial integrate jquery.fancytree" refactor (`23db7fe602`) and a "missing fancytree dependencies" fix (`901ab54e64`). The assertion error from an older version may no longer reproduce.
|
||||
- **Verification needed**: Load the server build on a clean profile and check the browser console for the `only init supported` error on startup.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 07
|
||||
|
||||
### [#5341 — Duplicate HTML ids for tabs of the same view](https://github.com/TriliumNext/Trilium/issues/5341)
|
||||
- **Evidence**: The options UI has been migrated to Preact (`apps/client/src/widgets/type_widgets/options/*.tsx`). `FormGroup` now generates IDs via `useUniqueName(name)` which returns `${name}-${randomString(10)}` (see `apps/client/src/widgets/react/FormGroup.tsx:19` and `hooks.tsx:372`). `FormCheckbox`, `FormRadioGroup`, `Collapsible`, and `Dropdown` all use the same hook. Every rendered instance therefore gets a fresh random ID.
|
||||
- **Verification needed**: Open two options tabs in the same window and inspect the DOM to confirm no duplicate IDs remain across the multi-tab view.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 08
|
||||
|
||||
### [#5134 — Upgrade autocomplete dependencies](https://github.com/TriliumNext/Trilium/issues/5134)
|
||||
- **Evidence**: Grepped the git log and found commits `d1fc4780b7 refactor: remove old autocomplete completely`, `3b35dc50c5 feat(core): integrate autocomplete route`, plus a series of `feat(autocomplete)` / `test(autocomplete)` commits. The old autocomplete has been fully removed and replaced in-house.
|
||||
- **Verification needed**: Maintainer should confirm the new autocomplete is considered the replacement the reporter was asking for, then close.
|
||||
|
||||
### [#5174 — '@' Context menu's auto-completion not showing most relevant but most recent](https://github.com/TriliumNext/Trilium/issues/5174)
|
||||
- **Evidence**: The autocomplete subsystem was fully rewritten (see #5134 evidence). Fuzzy matching has been added (`f23a7b4842 feat(settings): also allow for fuzzy searching to just be disabled`) and a new autocomplete route exists. The old "most recent" behaviour may be gone.
|
||||
- **Verification needed**: Repro on current main — create ancient notes matching the query, a few recent ones, then `@` and check ordering.
|
||||
|
||||
### [#5196 — (Feature request) Cursor automatically in text box when embedding note](https://github.com/TriliumNext/Trilium/issues/5196)
|
||||
- **Evidence**: Commit `35bd210062 fix(react/dialogs): recent notes not triggered in autocomplete` (Aug 2025) refactored `triggerRecentNotes` in `apps/client/src/services/note_autocomplete.ts` to call `$el.trigger("focus").trigger("select")`. `apps/client/src/widgets/dialogs/include_note.tsx` invokes `triggerRecentNotes(autoCompleteRef.current)` in `onShown`, so the input should now focus automatically when the Include Note dialog opens.
|
||||
- **Verification needed**: Repro on current main — open a text note, click Include Note, confirm focus is in the search box without clicking.
|
||||
|
||||
### [#5254 — User configurable whitelist of html tags stripped on import](https://github.com/TriliumNext/Trilium/issues/5254)
|
||||
- **Evidence**: The issue's interim request — extend the default allowlist with `acronym`, `article`, `big`, `button`, `cite`, `col`, `colgroup`, `data`, `dd`, `fieldset`, `form`, `legend`, `meter`, `noscript`, `option`, `progress`, `rp`, `samp`, `small`, `sub`, `sup`, `template`, `textarea`, `tt` — is now done in `packages/commons/src/lib/shared_constants.ts` (`SANITIZER_DEFAULT_ALLOWED_TAGS`, comment references this same issue). Additionally, `apps/server/src/services/html_sanitizer.ts` already reads an `allowedHtmlTags` option (user-configurable).
|
||||
- **Verification needed**: Confirm the user-configurable option has a UI surface; if only programmatic, close the issue with a docs pointer.
|
||||
|
||||
### [#5131 — (Bug report) v0.90.4 docker does not read USER_UID and USER_GID from environment](https://github.com/TriliumNext/Trilium/issues/5131)
|
||||
- **Evidence**: Reporter's logs show `./start-docker.sh: 3: [[: not found` — the script was using bash `[[ ]]` under `/bin/sh`. Current `apps/server/start-docker.sh` uses POSIX `[ ! -z "${USER_UID}" ]` / `[ ! -z "${USER_GID}" ]`, so the bug is gone.
|
||||
- **Verification needed**: Spin up the latest docker image with `USER_UID=1001 USER_GID=1001` and confirm the container starts and writes the log dir.
|
||||
|
||||
### [#5066 — Fix `spec/etapi` tests and port to vitest](https://github.com/TriliumNext/Trilium/issues/5066)
|
||||
- **Evidence**: `apps/server/spec/etapi/` now contains 30+ `.spec.ts` files (e.g. `app-info.spec.ts`, `search.spec.ts`, `mcp.spec.ts`). The migration has happened.
|
||||
- **Verification needed**: Confirm `pnpm test:sequential` actually runs them and they pass.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 09
|
||||
|
||||
### [#4649 — (Bug report) Importing large ZIP-Files via etapi throws error and request hangs](https://github.com/TriliumNext/Trilium/issues/4649)
|
||||
- **Evidence**: The reported root cause was that `req.body` was undefined/unparsed on the `/etapi/notes/:noteId/import` POST. `apps/server/src/app.ts:94` now registers `express.raw({ limit: "500mb" })` globally, and `apps/server/src/etapi/notes.ts:180-190` still passes `req.body` straight to `zipImportService.importZip` — the raw buffer path now exists. Issue predates the monorepo restructure.
|
||||
- **Verification needed**: Reproduce the original Python import with a large zip against current main; verify `Content-Type: application/zip` is handled (Express `raw()` defaults to `application/octet-stream`, so users may need the right Content-Type or an explicit type in the raw handler).
|
||||
|
||||
### [#4261 — (Feature request) Make apps logs saving optional](https://github.com/TriliumNext/Trilium/issues/4261)
|
||||
- **Evidence**: Log retention is now configurable via `config.Logging.retentionDays` (`apps/server/src/services/log.ts:36-42`) with `-1` keeping all logs and positive values deleting older files. While fully disabling file logging isn’t wired up, the disk-space concern is mitigated by retention config.
|
||||
- **Verification needed**: Maintainer to decide whether the feature is satisfied by retention config or still needs an explicit “disable file logs” switch.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 10
|
||||
|
||||
### [#4184 — (Bug report) Search in read-only note does not work](https://github.com/TriliumNext/Trilium/issues/4184)
|
||||
- **Evidence**: `apps/client/src/widgets/find.ts` now explicitly handles `readOnlyTemporarilyDisabled` and picks `htmlHandler` vs `textHandler` based on `noteContext?.isReadOnly()` (lines 245-259). The original 2023 bug was that only the editable text handler was wired up.
|
||||
- **Verification needed**: Maintainer should reproduce in a note with `#readOnly` on the latest build; if search now finds matches, close.
|
||||
|
||||
### [#4058 — (Bug report) API removeLabel() results in duplicated labels upon refreshing](https://github.com/TriliumNext/Trilium/issues/4058)
|
||||
- **Evidence**: This was reported against `zadam/trilium` master in 2023. Label/attribute persistence went through a major rewrite in the becca entity layer since then (see `apps/server/src/becca/entities/battribute.ts` and the `PUT /api/notes/:noteId/attributes` route). The described symptom (stale attributes being re-inserted on refresh) is a classic froca-cache bug that was addressed in the subsequent cache-coherence work.
|
||||
- **Verification needed**: Reproduce the exact script against current master — add/remove label via `note.removeLabel(...)` from `api.runOnBackend` and verify the label stays removed after reopening.
|
||||
|
||||
### [#3834 — (Bug report) chrome extension Trilium Web Clipper save whole page can not show in Trilium note](https://github.com/TriliumNext/Trilium/issues/3834)
|
||||
- **Evidence**: The error trace points at obfuscated CKEditor 5 upcast conversion code that no longer matches the current CKEditor 5 + Trilium plugin set (we're on a much newer CKEditor 5 with rewritten plugins in `packages/ckeditor5/`). Web Clipper code has also been moved into `apps/web-clipper/`.
|
||||
- **Verification needed**: Retest clipping the reporter's URL with current master web clipper + server.
|
||||
|
||||
### [#3868 — docker log show chown operation not permitted](https://github.com/TriliumNext/Trilium/issues/3868)
|
||||
- **Evidence**: Docker image and its entrypoint have been significantly rewritten (see `apps/server/Dockerfile*` and `apps/server/scripts/start-docker.sh`) — the `chown` loop the reporter hit has been replaced with a conditional that respects existing ownership. The `USER_UID`/`USER_GID` flow has been re-worked to avoid `usermod` collisions.
|
||||
- **Verification needed**: A maintainer should pull the latest image on an SMB/NFS share and verify it starts without chown errors.
|
||||
|
||||
### [#4008 — Permissions issue: Can not set UID and GID to '0'](https://github.com/TriliumNext/Trilium/issues/4008)
|
||||
- **Evidence**: Same root cause as #3868 and likely addressed by the same Docker entrypoint rewrite. The `usermod: UID '0' already exists` path was conditional and has since been guarded.
|
||||
- **Verification needed**: Maintainer should test `USER_UID=0 USER_GID=0` with the current Docker image.
|
||||
|
||||
### [#3705 — Changing the size of inclusions in a note](https://github.com/TriliumNext/Trilium/issues/3705)
|
||||
- **Evidence**: Possibly already fixed — `apps/client/src/widgets/dialogs/include_note.tsx` exists and the plugin in `packages/ckeditor5/src/plugins/includenote.ts` stores `boxSize` as a model attribute (so editing is theoretically possible). Grep for a double-click or toolbar action on the `includeNote` widget to confirm there is a "change size" affordance; if none exists, this should move to Notable.
|
||||
- **Verification needed**: Try inserting an Include Note, then right-click or double-click the widget in a current build to see if a size editor appears.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 11
|
||||
|
||||
### [#3516 — (Bug report) Hidden notes appear in search results](https://github.com/TriliumNext/Trilium/issues/3516)
|
||||
- **Evidence**: Search context has `includeHiddenNotes` option; `apps/server/src/services/search/services/parse.ts:503-510` wraps the query with `NotExp(new IsHiddenExp())` when `includeHiddenNotes` is false. `git log -S "IsHiddenExp"` shows commit `88bc7402a2` "hidden notes should not appear in the global search unless hoisted into it, #3516".
|
||||
- **Verification needed**: Reproducer on a fresh 0.9x build — confirm `_hidden` subtree notes no longer show in global search.
|
||||
|
||||
### [#3627 — Invalid timezone in search using docker container](https://github.com/TriliumNext/Trilium/issues/3627)
|
||||
- **Evidence**: Docker user guide (`apps/server/src/assets/doc_notes/.../Using Docker.html` around line 81) already has a "Note on timezones" section recommending setting the `TZ` env var. The reporter's suggestion was to document this.
|
||||
- **Verification needed**: Maintainer can close as already documented (or link the docs section from the issue).
|
||||
|
||||
### [#3191 — (Feature request) Add ability to set X-Frame-Options header](https://github.com/TriliumNext/Trilium/issues/3191)
|
||||
- **Evidence**: `apps/server/src/app.ts:82` uses helmet with only a few options overridden; Helmet's default frameguard is `SAMEORIGIN`, not `DENY`. The reporter's complaint was that DENY was being set — current defaults are already SAMEORIGIN.
|
||||
- **Verification needed**: `curl -I` against a running instance, confirm the header value, close if SAMEORIGIN.
|
||||
|
||||
### [#3524 — Error in custom widget leads to blank application / web frontend](https://github.com/TriliumNext/Trilium/issues/3524)
|
||||
- **Evidence**: `git log -S "custom widget"` shows `528d94a8fb` "accept custom widgets as classes instead of instances, #4274" and `7567903da3` "docs(user): improve documentation on custom widgets & Preact". The widget loading pipeline has been significantly restructured and now tolerates class-based widgets; unhandled doRender errors are caught higher in the widget tree in the new Preact-based rendering.
|
||||
- **Verification needed**: Create a broken custom widget (call missing method), confirm app still renders with error logged instead of blanking.
|
||||
|
||||
### [#3415 — Unify the attribute_detail and builtin_attributes definitions](https://github.com/TriliumNext/Trilium/issues/3415)
|
||||
- **Evidence**: `packages/commons/src/lib/builtin_attributes.ts` now exists as the shared source of truth (moved in commit `9b3396349e` "refactor(commons): add builtin_attributes to commons"). However, `apps/client/src/widgets/attribute_widgets/attribute_detail.ts:202-271` still maintains its own hardcoded `ATTR_HELP` map. Partial unification.
|
||||
- **Verification needed**: Decide whether to close (partial unification done) or keep open as a refactor to have `attribute_detail` consume `builtin_attributes` entries and attach help text there.
|
||||
|
||||
### [#3218 — Starting searches with "Combining Diacritical Marks" will freeze Trilium](https://github.com/TriliumNext/Trilium/issues/3218)
|
||||
- **Evidence**: `apps/server/src/services/utils.ts:108` normalizes input text before search, and commit `f705c432fd` "allow combining tokens in text and title/attributes, fixes #2820" rewrote combining-character handling.
|
||||
- **Verification needed**: Try entering `¨` in quick search on current build — confirm no freeze.
|
||||
|
||||
### [#3355 — Global search finds notes with 'whitespace' inside search term](https://github.com/TriliumNext/Trilium/issues/3355)
|
||||
- **Evidence**: The search tokenizer was rewritten alongside the sqlite FTS work (`git log --grep rice-searching-with-sqlite`), and text is normalized via `str.normalize("NFC")` in `apps/server/src/services/utils.ts:532`.
|
||||
- **Verification needed**: Attempt the whitespace-in-term reproduction against a recent build. Likely no longer reproduces.
|
||||
|
||||
### [#3626 — Sync from clients to server fails for a specific daily journal note](https://github.com/TriliumNext/Trilium/issues/3626)
|
||||
- **Evidence**: Reporter's error was "Can't find note 0LKt6C8L7y3s" in `resolveNotePathToSegments`. Sync engine and `froca.resolveNotePathToSegments` have been heavily refactored since 0.58; orphaned branches during sync are now tolerated rather than throwing fatal errors.
|
||||
- **Verification needed**: Nothing to reproduce from the stale db. Close as stale / cannot-reproduce.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 12
|
||||
|
||||
### [#3177 — (Bug report) ERR_SOCKET_BAD_PORT - port set to NaN on server start](https://github.com/TriliumNext/Trilium/issues/3177)
|
||||
- **Evidence**: `/home/elian/Projects/Trilium/apps/server/src/services/port.ts` now uses `parseAndValidate()` that explicitly checks `isNaN` and exits with a clear FATAL message; v0.55 parser issue appears rewritten.
|
||||
- **Verification needed**: Ask reporter to retry with current release and provide `config.ini` if still failing.
|
||||
|
||||
### [#3045 — Docker : Can't run by using user 1000:1000](https://github.com/TriliumNext/Trilium/issues/3045)
|
||||
- **Evidence**: `/home/elian/Projects/Trilium/apps/server/Dockerfile.rootless` now exists — runs as non-root user with configurable UID/GID via build args and does not rely on `su-exec`/`setgroups`. Multiple rootless-related fixes present in git log.
|
||||
- **Verification needed**: Confirm with reporter that the rootless image solves their scenario.
|
||||
|
||||
### [#2957 — (Bug report) JavaScript error when attempting to run when an instance is already running](https://github.com/TriliumNext/Trilium/issues/2957)
|
||||
- **Evidence**: `/home/elian/Projects/Trilium/apps/desktop/src/main.ts:87` uses `app.requestSingleInstanceLock()` and exits gracefully (`process.exit(0)`) with a translated info message instead of throwing an unhandled error. There's also a `second-instance` handler that focuses the existing window.
|
||||
- **Verification needed**: Run two instances on Windows to confirm no more JS error.
|
||||
|
||||
### [#2722 — (Feature request) Make interface auth timeout configurable](https://github.com/TriliumNext/Trilium/issues/2722)
|
||||
- **Evidence**: `Session.cookieMaxAge` is configurable in `apps/server/src/assets/config-sample.ini` (line 39) and documented in `apps/server/src/assets/doc_notes/en/User Guide/.../Authentication.html`. Used by `apps/server/src/routes/session_parser.ts:110`.
|
||||
- **Verification needed**: Close as implemented, link to Authentication docs.
|
||||
|
||||
### [#2784 — (Feature request) Add an example documentation for self-signed certs in TLS configuration wiki page](https://github.com/TriliumNext/Trilium/issues/2784)
|
||||
- **Evidence**: `docs/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).md` contains 3 matches for `self-signed`/`self sign`, so self-signed guidance is now present.
|
||||
- **Verification needed**: Maintainer confirms current doc covers the scenario the reporter wanted.
|
||||
|
||||
### [#2909 — webclipper show not correct](https://github.com/TriliumNext/Trilium/issues/2909)
|
||||
- **Evidence**: Web-clipper was completely rewritten — new implementation lives in `apps/web-clipper/` (WXT-based). The reporter's 0.52.2-era bug with the old zadam web-clipper is no longer reproducible against the new codebase.
|
||||
- **Verification needed**: Ask reporter to retry with the current web-clipper.
|
||||
|
||||
### [#2621 — (Bug report) Inconsistency import pictures with Trilium Web Clipper Addon](https://github.com/TriliumNext/Trilium/issues/2621)
|
||||
- **Evidence**: Same as #2909 — web-clipper rewritten under `apps/web-clipper/`; old image-import inconsistency from v0.50 won't reproduce.
|
||||
- **Verification needed**: Ask reporter to retry "Save whole page" against modern web-clipper.
|
||||
|
||||
### [#2596 — (Bug report) Failed Start Up (Gnome Arc Menu extension)](https://github.com/TriliumNext/Trilium/issues/2596)
|
||||
- **Evidence**: Likely dead — Electron stack, Gnome shell extensions, and everything else has been updated many times since v0.49.5 (Jan 2022). No code in Trilium controls this; it's a third-party shell extension conflict.
|
||||
- **Verification needed**: Ask reporter to retry current release with Arc Menu; close as stale if not reproducible.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 13
|
||||
|
||||
### [#2290 — ERROR: Failed to deserialize sync response: Option "documentSecret" doesn't exist](https://github.com/TriliumNext/Trilium/issues/2290)
|
||||
- **Evidence**: `apps/server/src/services/options_init.ts` lines 10–13 call `initDocumentOptions()` which unconditionally creates `documentId` and `documentSecret` with `randomSecureToken(16)`. The option is also referenced in `sync.ts`, `setup.ts`, and the commons `options_interface.ts`. Sync/setup flow was rewritten since v0.48.
|
||||
- **Verification needed**: Have a maintainer reproduce the "remote docker killed mid-sync" scenario against a current build; the missing option should now be seeded.
|
||||
|
||||
### [#2340 — Denial of Service (setup page spawning main windows)](https://github.com/TriliumNext/Trilium/issues/2340)
|
||||
- **Evidence**: `apps/server/src/routes/setup.ts` no longer calls `createMainWindow` directly on the unauthenticated setup endpoint. It renders a setup page and only calls `windowService.createMainWindow(app)` from `handleElectronRedirect()` after the DB is already initialized. Commit `a155b6e8d5` ("create separate window for setup and then main window") addressed this.
|
||||
- **Verification needed**: Confirm that an unauthenticated `/setup` request against the current desktop build no longer spawns windows.
|
||||
|
||||
### [#2239 — Docker Compose file needs to be updated](https://github.com/TriliumNext/Trilium/issues/2239)
|
||||
- **Evidence**: `git log` shows commit `78b6614eea` "fix docker-compose.yml #2239" and `883e71612c` "Use `triliumnext/notes` as image in `docker-compose.yml`". The new compose file uses the correct image name and a persisted volume.
|
||||
- **Verification needed**: Run the repo's current `docker-compose.yml` and confirm data persists in the named volume.
|
||||
|
||||
### [#2413 — Note map does not display inherited relations](https://github.com/TriliumNext/Trilium/issues/2413)
|
||||
- **Evidence**: `apps/server/src/routes/api/note_map.ts` line 61 uses `note.getRelations()`, and `apps/server/src/becca/entities/bnote.ts` line 657 defines `getRelations()` as `getAttributes(RELATION, name)` which explicitly includes inherited attributes (the doc comment says "including inherited ones"). Only `template`/`inherit` relation names are filtered out (line 57), not the inherited relations themselves.
|
||||
- **Verification needed**: Reproduce with Template + Instance, open note map on Instance, confirm the `testRelation` edge to Target now appears.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 14
|
||||
|
||||
### [#1157 — Split Screen And Unlinked References](https://github.com/TriliumNext/Trilium/issues/1157)
|
||||
- **Evidence**: Split view is fully implemented. `apps/client/src/widgets/containers/split_note_container.js` exists, `link_context_menu.ts` has `openNoteInNewSplit` / `openNoteInOtherSplit`, `tree_context_menu.ts` has `openNoteInSplit`, and split-pane layout is wired into `desktop_layout.tsx` and `mobile_layout.tsx`.
|
||||
- **Verification needed**: Part 1 (split view) is done. Part 2 (unlinked references) is still an open feature request — maintainer should close as partial/duplicate of other unlinked-references requests in batch.
|
||||
|
||||
### [#1460 — [Feature request] Make use of HTML5 as audio/video embedding provider. Relies on having partial-content supported by server.](https://github.com/TriliumNext/Trilium/issues/1460)
|
||||
- **Evidence**: `apps/server/src/routes/api/files.ts` implements partial-content streaming (`range`, `start/end`, comment "Partial content request"). Client-side video/audio players exist in `apps/client/src/widgets/type_widgets/file/Video.tsx` and `MediaPlayer.tsx`.
|
||||
- **Verification needed**: Confirm video/audio notes can be seeked in the browser; if yes, close.
|
||||
|
||||
### [#1512 — Fail to define shortcut like Meta+[ or Meta+Shift+Left](https://github.com/TriliumNext/Trilium/issues/1512)
|
||||
- **Evidence**: `apps/server/src/services/keyboard_actions.ts` lines 22-33 now set Mac defaults to `CommandOrControl+[` / `CommandOrControl+]` for back/forward navigation — directly the shortcut the reporter asked for. Mac-specific branch is driven by `isMac`.
|
||||
- **Verification needed**: Confirm on Mac that `Meta+[` now binds; if yes, close.
|
||||
|
||||
### [#1544 — embedding image with url](https://github.com/TriliumNext/Trilium/issues/1544)
|
||||
- **Evidence**: `packages/ckeditor5/src/plugins.ts` lines 113-119 register `Image`, `ImageUpload`, `ImageInsert` family. CKEditor's native image insert dialog accepts URLs.
|
||||
- **Verification needed**: Test Insert Image via URL in the toolbar and close if works.
|
||||
|
||||
---
|
||||
|
||||
## From Batch 15
|
||||
|
||||
### [#1102 — Spellchecker is overly sensitive](https://github.com/TriliumNext/Trilium/issues/1102)
|
||||
- **Evidence**: Items (1) and (2) were rejected upstream (Electron/Blink limitation). Item (3) (runtime toggle shortcut) is still not supported — `apps/server/src/services/window.ts` reads `spellCheckEnabled` only at window creation, and no `toggleSpellCheck` shortcut exists in `keyboard_actions.ts`. However the original items 1 & 2 are effectively closed as "won't fix".
|
||||
- **Verification needed**: Close items 1-2 as won't-fix (Electron limitation); split out item 3 as a separate feature request if still wanted.
|
||||
|
||||
### [#1080 — Cell properties panel invisible when table cell content too large](https://github.com/TriliumNext/Trilium/issues/1080)
|
||||
- **Evidence**: Filed against Trilium 0.42.6 with CKEditor from that era. CKEditor5 has been upgraded many major versions since; table cell properties panel positioning is handled by upstream CKEditor. No custom override exists in `packages/ckeditor5/`.
|
||||
- **Verification needed**: Reproduce with current build — paste a huge text block into a table cell and try to open cell properties; if panel is visible, close.
|
||||
|
||||
### [#924 — Text following innerlink becomes part of the link after switching pages](https://github.com/TriliumNext/Trilium/issues/924)
|
||||
- **Evidence**: Reported against 0.40.6 — a CKEditor link-range bug from that era. CKEditor has been upgraded many versions; no custom link-range fix exists in `packages/ckeditor5/`. No commits touching "innerlink" in `git log`.
|
||||
- **Verification needed**: Reproduce: insert a Ctrl+L link, type text after it, switch notes and back; if the trailing text is no longer absorbed into the link, close.
|
||||
|
||||
### [#936 — unable to clip some pages](https://github.com/TriliumNext/Trilium/issues/936)
|
||||
- **Evidence**: 0.40-era web clipper timeout on a large GitHub markdown page. Clipper and server code have been rewritten since (`apps/web-clipper/`, clipping endpoint in `apps/server/src/routes/api/clipper.ts`).
|
||||
- **Verification needed**: Re-try clipping `https://github.com/learnbyexample/learn_gnuawk/blob/master/gnu_awk.md` with current clipper; if successful, close.
|
||||
|
||||
### [#75 — add standard attribute value autocomplete](https://github.com/TriliumNext/Trilium/issues/75)
|
||||
- **Evidence**: `apps/client/src/services/attribute_autocomplete.ts` exports `initLabelValueAutocomplete`, which calls `attribute-values/<name>` server endpoint and populates autocomplete suggestions. Wired up in `attribute_detail.ts` and `PromotedAttributes.tsx`. Exactly what was asked for.
|
||||
- **Verification needed**: None — can be closed as done.
|
||||
|
||||
### [#649 — Open/focus a note from command line / desktop URL handler (Trilium URL protocol)](https://github.com/TriliumNext/Trilium/issues/649)
|
||||
- **Evidence**: PR #9248 ("Add URL protocol support for trilium://") is referenced as submitted for this IssueHunt. No `trilium://` handler or `setAsDefaultProtocolClient` currently in the codebase (so PR is still open).
|
||||
- **Verification needed**: Track PR #9248 — once merged, close this issue.
|
||||
14
package.json
14
package.json
@@ -64,7 +64,7 @@
|
||||
"eslint-config-preact": "2.0.0",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"eslint-plugin-playwright": "2.10.1",
|
||||
"eslint-plugin-simple-import-sort": "12.1.1",
|
||||
"eslint-plugin-simple-import-sort": "13.0.0",
|
||||
"happy-dom": "20.8.9",
|
||||
"http-server": "14.1.1",
|
||||
"jiti": "2.6.1",
|
||||
@@ -76,7 +76,6 @@
|
||||
"tsx": "4.21.0",
|
||||
"typescript": "6.0.2",
|
||||
"typescript-eslint": "8.58.0",
|
||||
"upath": "2.0.1",
|
||||
"vite": "8.0.5",
|
||||
"vite-plugin-dts": "4.5.4",
|
||||
"vitest": "4.1.2"
|
||||
@@ -158,9 +157,16 @@
|
||||
"handlebars@<4.7.9": ">=4.7.9",
|
||||
"qs@<6.14.2": ">=6.14.2",
|
||||
"minimatch@<3.1.4": "^3.1.4",
|
||||
"minimatch@3>brace-expansion": "^1.1.13",
|
||||
"minimatch@3>brace-expansion": "^5.0.0",
|
||||
"serialize-javascript@<7.0.5": ">=7.0.5",
|
||||
"webpack@<5.104.1": ">=5.104.1"
|
||||
"webpack@<5.104.1": ">=5.104.1",
|
||||
"file-type@>=13.0.0 <21.3.1": ">=21.3.1",
|
||||
"vite@>=7.0.0 <=7.3.1": ">=7.3.2",
|
||||
"vite@>=7.1.0 <=7.3.1": ">=7.3.2",
|
||||
"hono@<4.12.12": ">=4.12.12",
|
||||
"hono@>=4.0.0 <=4.12.11": ">=4.12.12",
|
||||
"@hono/node-server@<1.19.13": ">=1.19.13",
|
||||
"basic-ftp@=5.2.0": ">=5.2.1"
|
||||
},
|
||||
"ignoredBuiltDependencies": [
|
||||
"sqlite3"
|
||||
|
||||
@@ -31,6 +31,9 @@ import CodeBlockLanguageDropdown from "./plugins/code_block_language_dropdown.js
|
||||
import MoveBlockUpDownPlugin from "./plugins/move_block_updown.js";
|
||||
import ScrollOnUndoRedoPlugin from "./plugins/scroll_on_undo_redo.js"
|
||||
import InlineCodeNoSpellcheck from "./plugins/inline_code_no_spellcheck.js";
|
||||
import InlineCodeToolbar from "./plugins/inline_code_toolbar.js";
|
||||
import AdmonitionTypeDropdown from "./plugins/admonition_type_dropdown.js";
|
||||
import AdmonitionToolbar from "./plugins/admonition_toolbar.js";
|
||||
|
||||
/**
|
||||
* Plugins that are specific to Trilium and not part of the CKEditor 5 core, included in both text editors but not in the attribute editor.
|
||||
@@ -53,6 +56,9 @@ const TRILIUM_PLUGINS: typeof Plugin[] = [
|
||||
MoveBlockUpDownPlugin,
|
||||
ScrollOnUndoRedoPlugin,
|
||||
InlineCodeNoSpellcheck,
|
||||
InlineCodeToolbar,
|
||||
AdmonitionTypeDropdown,
|
||||
AdmonitionToolbar,
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
43
packages/ckeditor5/src/plugins/admonition_toolbar.ts
Normal file
43
packages/ckeditor5/src/plugins/admonition_toolbar.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { Plugin, ViewDocumentFragment, WidgetToolbarRepository, type ViewNode } from "ckeditor5";
|
||||
import { Admonition } from "@triliumnext/ckeditor5-admonition";
|
||||
import AdmonitionTypeDropdown from "./admonition_type_dropdown";
|
||||
|
||||
export default class AdmonitionToolbar extends Plugin {
|
||||
|
||||
static get requires() {
|
||||
return [WidgetToolbarRepository, Admonition, AdmonitionTypeDropdown] as const;
|
||||
}
|
||||
|
||||
afterInit() {
|
||||
const editor = this.editor;
|
||||
const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository);
|
||||
|
||||
widgetToolbarRepository.register("admonition", {
|
||||
items: [
|
||||
"admonitionTypeDropdown"
|
||||
],
|
||||
balloonClassName: "ck-toolbar-container admonition-type-list",
|
||||
getRelatedElement(selection) {
|
||||
const selectionPosition = selection.getFirstPosition();
|
||||
if (!selectionPosition) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let parent: ViewNode | ViewDocumentFragment | null = selectionPosition.parent;
|
||||
while (parent) {
|
||||
if (parent.is("element", "aside") || parent.is("element", "div")) {
|
||||
// Check if it's an admonition by looking for the admonition class
|
||||
const classes = (parent as any).getAttribute?.("class") || "";
|
||||
if (typeof classes === "string" && classes.includes("admonition")) {
|
||||
return parent;
|
||||
}
|
||||
}
|
||||
parent = parent.parent;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
71
packages/ckeditor5/src/plugins/admonition_type_dropdown.ts
Normal file
71
packages/ckeditor5/src/plugins/admonition_type_dropdown.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { Plugin, type ListDropdownButtonDefinition, Collection, ViewModel, createDropdown, addListToDropdown, DropdownButtonView } from "ckeditor5";
|
||||
import { Admonition, ADMONITION_TYPES, type AdmonitionCommand, type AdmonitionType } from "@triliumnext/ckeditor5-admonition";
|
||||
|
||||
/**
|
||||
* Toolbar item which displays the list of admonition types in a dropdown.
|
||||
* Uses the same styling as the main admonition toolbar button.
|
||||
*/
|
||||
export default class AdmonitionTypeDropdown extends Plugin {
|
||||
|
||||
static get requires() {
|
||||
return [Admonition] as const;
|
||||
}
|
||||
|
||||
public init() {
|
||||
const editor = this.editor;
|
||||
const componentFactory = editor.ui.componentFactory;
|
||||
|
||||
const itemDefinitions = this._getTypeListItemDefinitions();
|
||||
const command = editor.commands.get("admonition") as AdmonitionCommand;
|
||||
|
||||
componentFactory.add("admonitionTypeDropdown", _locale => {
|
||||
const dropdownView = createDropdown(editor.locale, DropdownButtonView);
|
||||
dropdownView.buttonView.set({
|
||||
withText: true
|
||||
});
|
||||
dropdownView.bind("isEnabled").to(command, "value", value => !!value);
|
||||
dropdownView.buttonView.bind("label").to(command, "value", (value) => {
|
||||
if (!value) return "";
|
||||
const typeDef = ADMONITION_TYPES[value as AdmonitionType];
|
||||
return typeDef?.title ?? value;
|
||||
});
|
||||
dropdownView.on("execute", evt => {
|
||||
const source = evt.source as any;
|
||||
editor.execute("admonition", {
|
||||
forceValue: source.commandParam
|
||||
});
|
||||
editor.editing.view.focus();
|
||||
});
|
||||
addListToDropdown(dropdownView, itemDefinitions);
|
||||
return dropdownView;
|
||||
});
|
||||
}
|
||||
|
||||
private _getTypeListItemDefinitions(): Collection<ListDropdownButtonDefinition> {
|
||||
const editor = this.editor;
|
||||
const command = editor.commands.get("admonition") as AdmonitionCommand;
|
||||
const itemDefinitions = new Collection<ListDropdownButtonDefinition>();
|
||||
|
||||
for (const [type, typeDef] of Object.entries(ADMONITION_TYPES)) {
|
||||
const definition: ListDropdownButtonDefinition = {
|
||||
type: "button",
|
||||
model: new ViewModel({
|
||||
commandParam: type,
|
||||
label: typeDef.title,
|
||||
class: `ck-tn-admonition-option ck-tn-admonition-${type}`,
|
||||
role: "menuitemradio",
|
||||
withText: true
|
||||
})
|
||||
};
|
||||
|
||||
definition.model.bind("isOn").to(command, "value", value => {
|
||||
return value === type;
|
||||
});
|
||||
|
||||
itemDefinitions.add(definition);
|
||||
}
|
||||
|
||||
return itemDefinitions;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -38,28 +38,43 @@ export class CopyToClipboardCommand extends Command {
|
||||
this.executeCallback = this.editor.config.get("clipboard")?.copy;
|
||||
}
|
||||
|
||||
// Try code block first
|
||||
const codeBlockEl = selection.getFirstPosition()?.findAncestor("codeBlock");
|
||||
if (!codeBlockEl) {
|
||||
console.warn("Unable to find code block element to copy from.");
|
||||
if (codeBlockEl) {
|
||||
const codeText = Array.from(codeBlockEl.getChildren())
|
||||
.map(child => "data" in child ? child.data : "\n")
|
||||
.join("");
|
||||
this.copyText(codeText, "code block");
|
||||
return;
|
||||
}
|
||||
|
||||
const codeText = Array.from(codeBlockEl.getChildren())
|
||||
.map(child => "data" in child ? child.data : "\n")
|
||||
.join("");
|
||||
|
||||
if (codeText) {
|
||||
if (!this.executeCallback) {
|
||||
navigator.clipboard.writeText(codeText).then(() => {
|
||||
console.log('Code block copied to clipboard');
|
||||
}).catch(err => {
|
||||
console.error('Failed to copy code block', err);
|
||||
});
|
||||
} else {
|
||||
this.executeCallback(codeText);
|
||||
// Try inline code (text with 'code' attribute)
|
||||
const position = selection.getFirstPosition();
|
||||
if (position) {
|
||||
const textNode = position.textNode || position.nodeBefore || position.nodeAfter;
|
||||
if (textNode && "data" in textNode && textNode.hasAttribute?.("code")) {
|
||||
this.copyText(textNode.data as string, "inline code");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
console.warn("No code block or inline code found to copy from.");
|
||||
}
|
||||
|
||||
private copyText(text: string, source: string) {
|
||||
if (!text) {
|
||||
console.warn(`No text found in ${source}.`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.executeCallback) {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
console.log(`${source} copied to clipboard`);
|
||||
}).catch(err => {
|
||||
console.error(`Failed to copy ${source}`, err);
|
||||
});
|
||||
} else {
|
||||
console.warn('No code block selected or found.');
|
||||
this.executeCallback(text);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
126
packages/ckeditor5/src/plugins/inline_code_toolbar.ts
Normal file
126
packages/ckeditor5/src/plugins/inline_code_toolbar.ts
Normal file
@@ -0,0 +1,126 @@
|
||||
import { BalloonPanelView, ButtonView, Plugin, ToolbarView } from "ckeditor5";
|
||||
import CopyToClipboardButton from "./copy_to_clipboard_button";
|
||||
import copyIcon from "../icons/copy.svg?raw";
|
||||
|
||||
/**
|
||||
* Shows a small toolbar with a copy button when the cursor is on inline code.
|
||||
*/
|
||||
export default class InlineCodeToolbar extends Plugin {
|
||||
|
||||
static get requires() {
|
||||
return [CopyToClipboardButton] as const;
|
||||
}
|
||||
|
||||
private balloon?: BalloonPanelView;
|
||||
private toolbar?: ToolbarView;
|
||||
|
||||
init() {
|
||||
const editor = this.editor;
|
||||
|
||||
// Create toolbar with copy button
|
||||
this.toolbar = new ToolbarView(editor.locale);
|
||||
const copyButton = new ButtonView(editor.locale);
|
||||
copyButton.set({
|
||||
icon: copyIcon,
|
||||
tooltip: "Copy to clipboard"
|
||||
});
|
||||
copyButton.on("execute", () => {
|
||||
editor.execute("copyToClipboard");
|
||||
this.hideToolbar();
|
||||
});
|
||||
this.toolbar.items.add(copyButton);
|
||||
|
||||
// Create balloon panel
|
||||
this.balloon = new BalloonPanelView(editor.locale);
|
||||
this.balloon.content.add(this.toolbar);
|
||||
this.balloon.class = "ck-toolbar-container";
|
||||
|
||||
editor.ui.view.body.add(this.balloon);
|
||||
|
||||
// Show/hide based on selection
|
||||
this.listenTo(editor.model.document.selection, "change:range", () => {
|
||||
this.updateToolbarVisibility();
|
||||
});
|
||||
|
||||
// Hide on editor blur
|
||||
this.listenTo(editor.ui.focusTracker, "change:isFocused", (_evt, _name, isFocused) => {
|
||||
if (!isFocused) {
|
||||
this.hideToolbar();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private updateToolbarVisibility() {
|
||||
const editor = this.editor;
|
||||
const selection = editor.model.document.selection;
|
||||
const position = selection.getFirstPosition();
|
||||
|
||||
// Don't show for code blocks (they have their own toolbar)
|
||||
if (position?.findAncestor("codeBlock")) {
|
||||
this.hideToolbar();
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if cursor is on inline code
|
||||
const textNode = position?.textNode;
|
||||
if (textNode?.hasAttribute("code")) {
|
||||
this.showToolbar(textNode);
|
||||
} else {
|
||||
this.hideToolbar();
|
||||
}
|
||||
}
|
||||
|
||||
private showToolbar(textNode: unknown) {
|
||||
if (!this.balloon) return;
|
||||
|
||||
const editor = this.editor;
|
||||
const view = editor.editing.view;
|
||||
const mapper = editor.editing.mapper;
|
||||
|
||||
// Map model text node to view element
|
||||
const viewRange = mapper.toViewRange(editor.model.createRangeOn(textNode as any));
|
||||
const viewElement = viewRange.getContainedElement();
|
||||
|
||||
if (!viewElement) {
|
||||
this.hideToolbar();
|
||||
return;
|
||||
}
|
||||
|
||||
const domElement = view.domConverter.mapViewToDom(viewElement);
|
||||
if (!domElement || !(domElement instanceof HTMLElement)) {
|
||||
this.hideToolbar();
|
||||
return;
|
||||
}
|
||||
|
||||
const rect = domElement.getBoundingClientRect();
|
||||
this.balloon.pin({
|
||||
target: {
|
||||
top: rect.top,
|
||||
bottom: rect.bottom,
|
||||
left: rect.left,
|
||||
right: rect.right,
|
||||
width: rect.width,
|
||||
height: rect.height
|
||||
}
|
||||
});
|
||||
this.balloon.isVisible = true;
|
||||
}
|
||||
|
||||
private hideToolbar() {
|
||||
if (this.balloon) {
|
||||
this.balloon.isVisible = false;
|
||||
this.balloon.unpin();
|
||||
}
|
||||
}
|
||||
|
||||
override destroy() {
|
||||
super.destroy();
|
||||
if (this.balloon) {
|
||||
this.balloon.destroy();
|
||||
}
|
||||
if (this.toolbar) {
|
||||
this.toolbar.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -20,34 +20,34 @@
|
||||
"@codemirror/state": "6.6.0",
|
||||
"@codemirror/view": "6.41.0",
|
||||
"@eslint/js": "10.0.1",
|
||||
"@fsegurai/codemirror-theme-abcdef": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-abyss": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-android-studio": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-andromeda": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-basic-dark": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-basic-light": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-cobalt2": "6.0.4",
|
||||
"@fsegurai/codemirror-theme-forest": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-github-dark": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-github-light": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-gruvbox-dark": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-gruvbox-light": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-abcdef": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-abyss": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-android-studio": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-andromeda": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-basic-dark": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-basic-light": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-cobalt2": "6.0.5",
|
||||
"@fsegurai/codemirror-theme-forest": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-github-dark": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-github-light": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-gruvbox-dark": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-gruvbox-light": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-high-contrast-dark": "6.0.2",
|
||||
"@fsegurai/codemirror-theme-high-contrast-light": "6.0.2",
|
||||
"@fsegurai/codemirror-theme-material-dark": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-material-light": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-material-dark": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-material-light": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-material-ocean": "6.0.1",
|
||||
"@fsegurai/codemirror-theme-monokai": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-nord": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-palenight": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-solarized-dark": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-solarized-light": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-monokai": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-nord": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-palenight": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-solarized-dark": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-solarized-light": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-synthwave-84": "6.0.2",
|
||||
"@fsegurai/codemirror-theme-tokyo-night-day": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-tokyo-night-storm": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-volcano": "6.2.4",
|
||||
"@fsegurai/codemirror-theme-vscode-dark": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-vscode-light": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-tokyo-night-day": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-tokyo-night-storm": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-volcano": "6.2.5",
|
||||
"@fsegurai/codemirror-theme-vscode-dark": "6.2.6",
|
||||
"@fsegurai/codemirror-theme-vscode-light": "6.2.6",
|
||||
"@replit/codemirror-indentation-markers": "6.5.3",
|
||||
"@replit/codemirror-lang-nix": "6.0.1",
|
||||
"@replit/codemirror-vim": "6.3.0",
|
||||
@@ -57,7 +57,7 @@
|
||||
"codemirror-lang-elixir": "4.0.1",
|
||||
"codemirror-lang-hcl": "0.1.0",
|
||||
"codemirror-lang-mermaid": "0.5.0",
|
||||
"eslint-linter-browserify": "10.1.0",
|
||||
"eslint-linter-browserify": "10.2.0",
|
||||
"globals": "17.4.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,6 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"dayjs": "1.11.20",
|
||||
"marked": "17.0.5"
|
||||
"marked": "17.0.6"
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions<KeyboardActi
|
||||
theme: string;
|
||||
syncServerHost: string;
|
||||
syncServerTimeout: string;
|
||||
syncServerTimeoutTimeScale: number;
|
||||
syncProxy: string;
|
||||
mainFontFamily: FontFamily;
|
||||
treeFontFamily: FontFamily;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"fuse.js": "7.2.0",
|
||||
"fuse.js": "7.3.0",
|
||||
"katex": "0.16.45",
|
||||
"mermaid": "11.14.0"
|
||||
},
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user