Skip to content

Release 2.75.0: folders in note search, links in table cells, new notes at once - #986

Merged
adibhanna merged 8 commits into
mainfrom
v2.75.0
Oct 23, 2026
Merged

adibhanna merged 8 commits into
mainfrom
v2.75.0

Conversation

@adibhanna

Copy link
Copy Markdown
Contributor

ZenNotes 2.75.0: desktop, server 2.75.0 with Docker, the boundary packages, the website release page, and both phones on core 2.75.0 (iPhone 1.31.0, Android 1.1.45, with their own #128 halves and Android's dotted-name fix).

Features

Fixes

  • A new note or task is there at once (zennotesandroid#128, 58615641): createAndOpen opens the note before re-listing the vault, and newTaskFile rescans only the new file when a task list is loaded. On an Android emulator with a 1,700-note picked folder, with the shell's half: New note 5.1 s to 0.3 s, Task added 13.4 s to 0.3 s.
  • Deep notes keep their title in the header (zennotesandroid#126, b0aef0e7): the folder crumbs give way before the title; the rename field is as wide as the name.

Also

  • dompurify 3.4.17 for the advisories that failed npm audit at high since 2.74.0's packaging commits (9250282b, only that package moves in the lockfile); What's New 2.75.0 (11f6386f); version bump (a0670148); the manual's table entry names the [[ picker (7e6506db).

Gates on 7e6506db, in a clean worktree with its own npm ci: typecheck 8/8 uncached; shared-domain 2,054, app-core 3,411, desktop 1,190 and quicklook 15 uncached; fresh build:prod green; npm run pack (signed) and the packaged launch check pass (page target, rendered, 1.6 s, 2.75.0); vim-editor, sidebar-vim and editor-improvements pass on the first run. ci-sweep.py v2.74.0: one failed job, main's dependency audit, fixed by 9250282b. hazard-scan.py --since v2.74.0: no hazards. dash-lint clean on the notes, the diff and every commit. Note search and the table picker were driven in the built app over CDP.

Edit-mode table cells are plain contenteditable fields inside an atomic
block widget. Their keystrokes never become editor transactions, so the
editor's [[ completion never saw a [[ typed in a cell, and links in
tables had to be typed from memory.

The cell now runs the same picker on its own text: the editor's ranking
(shared as wikilinkCandidates), its item rendering and popup classes,
and its keys. Arrows and Ctrl+J/K/N/P move, Enter or Ctrl+Y inserts,
Tab keeps the caret inside the brackets, | starts the display text, and
Escape only closes the popup, in Vim INSERT too. Inserts are the
editor's edits measured on the cell string, so a #section or |alias in
a closed link survives and assets become embeds; the widget commits
them on blur like any typed cell edit. [[ inside inline code stays
literal.

Heading and block suggestions ([[note# and [[note^) stay editor-only.
…id#126)

The pane header kept every folder crumb at full width and gave the
note's title whatever space was left. On a phone, a note three or four
folders deep got a title a few pixels wide, and tapping it opened an
88px rename field scrolled to the tail of the name, so the start of
the name could not be read while renaming it.

The title now outranks the folders. The crumbs share one group that
gives way first, clipped at the vault end so the nearest folder stays
beside the title, and the title truncates only once it alone fills the
row. Each crumb carries its trailing space as padding instead of the
row's flex gap, so spacing is unchanged when everything fits and a
collapsed group leaves no gap behind. The rename field is as wide as
the name (field-sizing), up to the whole row, and opens at the start
of the name with all of it still selected.

The same layout applies on desktop: in a narrow pane or a crowded
header, a deep note now loses its outer folders before its title. A
pane narrower than its toolbar still leaves no room for either; that
is unchanged.
DarellYuhu keeps documentation where the same note name repeats across
folders. Search notes (Mod+P) showed each result's title and its area
in capitals, so five notes called Overview read as five identical
INBOX rows and opening the right one meant guessing. The buffer
switcher solved the same problem in #635 and the search palette was
left out.

A result now shows the folder its note lives in, the way the buffer
switcher does: the title keeps its natural width, the folder takes the
rest of the row, and a folder too long to fit loses its start rather
than its end (dir="rtl" with an LRE/PDF embedding, so the path itself
still reads left to right), keeping the part that tells the notes
apart. A note at the vault root, where a root-mode vault keeps its
notes, has no folder to show and keeps its area label. The folder comes
from parentDirOf (manual-order.ts) instead of a third copy of the
helper. Search itself is unchanged: it already matched on the path.
The in-app manual's note search guide says so in one sentence.

In the built app over CDP (isolated userData and config, a vault with
six notes called Overview), Mod+P and "overview" listed every one with
its folder: inbox, archive/2025/Atlas, inbox/Projects/Billing/docs,
inbox/Projects/Atlas/docs and two client folders, the deepest shown as
"...rporation International Holdings/onboarding/2026/q4/handover/weekly
reviews". The two new palette tests and the updated row-text assertion
fail on the old rows; the trash tests' row helper now reads the title
span, since a row's text includes its folder.
Typecheck 8/8, app-core 3,408 tests pass. The website docs mirror of
that sentence is not in this change: its checkout holds other
uncommitted docs work.
…llows

zennotesandroid#128: on a Redmi 13C with a 368 MB vault kept in a
Syncthing folder, New note and Quick took 12 to 15 seconds to open the
note; tapping again meanwhile made four Quick notes. createAndOpen
waited for a full refreshNotes before it opened anything, and on a
phone that listing is one storage query per folder (two walks, notes
and folders, while the create's own 'add' event starts a second
refresh). newTaskFile waited for a full refreshTasks before "Task
added", and the phone's task scan reads every note.

createAndOpen now puts the created note in the list, sets the view and
the title focus, opens the note, and refreshes after; the call still
resolves once the listing has landed, so callers see the same state at
the end as before. newTaskFile rescans only the new file when a task
list is loaded. An empty list may never have been loaded, and Home and
the calendar load the list only while it is empty, so a patched list of
one task would stop them; that case loads the list whole in the
background instead of before the toast. Desktop and web lists were fast
enough that neither wait was felt there; nothing they show changes.

The phone shell carries its own half (listings shared between
overlapping walks, a per-note task cache) in zennotesandroid; this half
needs no shell change and reaches the phones when they adopt this core.

On an API 36 emulator over WebView CDP, Android 1.1.44 with both halves
(a rehearsal core from this tree) and a 1,663-note, 175-folder vault
opened through the folder picker: New note opens in 0.32 to 0.35 s
(5.1 s on 1.1.44, 1.5 s with the shell half alone), Quick in 0.23 s,
"Task added" after 0.26 s (13.4 s on 1.1.44); the Quick Notes list and
Tasks show every note and task created. Three new store tests fail on
the old code. Typecheck 8/8, app-core 3,397 tests pass.
The production dependency audit (npm audit --omit=dev --audit-level=high)
has failed on main since 2.74.0's packaging commits: DOMPurify 3.4.14
falls under advisories published on 2026-10-22, a critical one for
SAFE_FOR_TEMPLATES and a high one for IN_PLACE sanitizing, with three low
ones beside them, all fixed in 3.4.17. ZenNotes uses neither mode nor the
XHTML parser, and its one hook (uponSanitizeAttribute in app-core's
markdown.ts) only drops attributes, so 2.74.0 was not exposed; the phone
shells already ship 3.4.17. The package moves to its first fixed version
and nothing else in the lockfile changes (every workspace range is
^3.3.4); the audit passes at its level. The remaining advisories (katex,
fast-uri, hono, ip-address, smol-toml) are moderate or low and do not
fail it.
What's New opens on the first launch after the update with three highlights. First, note search shows the folder each result lives in, so notes that share a name are easy to tell apart (#982). Second, typing [[ in a table cell in Edit mode opens the same note picker as in a paragraph (#977). Third, a note several folders deep keeps its title in a narrow pane's header and renames from the start of its name (zennotesandroid#126).
The Render tables in live preview entry of the manual lists what a table cell does in Edit mode; it now says that [[ in a cell opens the same note picker as in a paragraph, with the same keys, and that | starts the display text. The website docs carry the same sentence.
@adibhanna
adibhanna merged commit 7e6506d into main Oct 23, 2026
10 checks passed
@adibhanna
adibhanna deleted the v2.75.0 branch October 23, 2026 16:03
@adibhanna
adibhanna restored the v2.75.0 branch October 23, 2026 16:03
@adibhanna
adibhanna deployed to boundary-artifacts October 23, 2026 16:26 — with GitHub Actions Active

This branch was successfully deployed

1 active deployment
boundary-artifacts — 7e6506db Deployed Oct 23, 2026 by adibhanna via draft #69
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant