github ZenNotes/zennotes v2.75.0
ZenNotes v2.75.0

latest releases: web-2.76.0-web.h5b1c11f768454e10, v2.76.0, core-2.75.0-core.h4b1bd3ddd69c2aab...
6 hours ago

ZenNotes 2.75.0 shows the folder of every note search result, so notes that share a name are easy to tell apart, opens the note picker when you type [[ in a table cell, and keeps a deep note's title readable when the header runs out of room. A new note or task now opens as soon as it exists instead of waiting for the whole vault to be listed again, which large vaults on the phones notice most.

Released from 7e6506db through #986 on 2026-10-23. All installers are verified.

Features

  • Note search shows each note's folder (#982, thanks to @DarellYuhu). Search notes (Cmd+P on macOS, Ctrl+P elsewhere) showed each result's title and its area in capitals, so five notes called Overview read as five identical rows. Each result now shows the folder it lives in, the way the buffer switcher does: the title keeps its full width, the folder takes the rest of the row, and a folder too long to fit loses its start rather than its end, so the part that tells your notes apart stays in view. A note at the vault root keeps its area label. Search itself is unchanged: typing part of a folder name still narrows the list.
  • Note links in table cells (#977, thanks to @Asterythm). Typing [[ in a table cell in Edit mode did nothing, so links in tables had to be typed from memory. The cell now opens the same note picker as a paragraph: arrows or Ctrl+J / Ctrl+K and Ctrl+N / Ctrl+P move, Enter or Ctrl+Y inserts, Tab keeps the caret inside the brackets, | starts the display text, and Escape closes only the picker, in Vim's insert mode too. A #section or |alias already in the link is kept, and an asset becomes an embed. Heading and block suggestions ([[note# and [[note^) stay in the editor.

Fixes

  • A new note or task is there at once (zennotesandroid#128, thanks to @davi-jorge-art). New note and New Quick Note waited for the whole vault to be listed again before they opened the note, and New task waited for every note to be scanned for tasks before saying "Task added". On a desktop that takes a moment; on a phone, where a large vault in a picked folder is read one folder at a time, it took 12 to 15 seconds, long enough that tapping again made four Quick Notes. The note now opens as soon as it exists and the list catches up behind it, and a new task is added to a loaded task list by reading only its own note. On an emulator with a 1,700-note vault in a picked folder, New note went from 5.1 s to about 0.3 s and Task added from 13.4 s to about 0.3 s (with the Android app's own half, below).
  • Deep notes keep their title in the header (zennotesandroid#126, thanks to @mr-thai). The header gave every folder of a note's path its full width and the title whatever was left, so on a phone a note three or four folders deep had a title a few pixels wide, and renaming it showed only the end of the name. The title now comes first: the folders give way, the nearest one staying beside the title, and the title shortens only when it alone is wider than the row. Renaming opens a field as wide as the name, from its start. On the desktop, a narrow pane or a crowded header now loses a deep note's outer folders before its title.

For contributors

  • Search rows (eb527d4d): SearchPalette shows parentDirOf(n.path) (lib/manual-order.ts) in a dir="rtl" span with an LRE/PDF embedding, as BufferPalette does since #635; a root note keeps n.folder. The palette tests read the title span ([data-search-dir] marks the folder).
  • Table links (890d4af4): cm-table-link-picker.ts runs the editor's [[ picker on a table cell's contenteditable text: wikilinkCandidates (shared with cm-wikilinks.ts), the same item rendering and popup classes, and the completion keys; inserts are the editor's edits measured on the cell string and commit on blur.
  • Header crumbs (b0aef0e7): EditorPane puts the crumbs in one group that shrinks first, clipped at the vault end; each crumb carries its trailing space as padding instead of the row's gap; the rename field uses field-sizing up to the whole row.
  • New notes (58615641): createAndOpen upserts the created note's meta into notes, sets the view and title focus, opens the note, and runs refreshNotes() after; newTaskFile calls rescanTasksForPath when vaultTasks is loaded, and a background refreshTasks when it is empty (Home and the calendar load the list only while it is empty).
  • dompurify 3.4.17 (9250282b), the first release fixing the advisories that failed npm audit --audit-level=high since 2.74.0's packaging commits; only that package moves in the lockfile. What's New 2.75.0 (11f6386f); version bump (a0670148).

Demos

Screenshots of this release on the release build, attached to this release:

Note search with six notes called Overview: each row shows its folder, and the deepest keeps its end in view.

Note search showing each note's folder

[[ in a table cell opens the same note picker as in a paragraph.

The note picker over a table cell

Verification

How to test locally. Build once with npm run build --workspace @zennotes/desktop and launch with isolated stores: ZENNOTES_USER_DATA_PATH=$(mktemp -d) ZENNOTES_CONFIG_DIR=$(mktemp -d) npx electron apps/desktop/out/main/index.js.

  1. Folders in note search. Make three notes called Overview in different folders (Projects/Atlas, Projects/Billing, and a deep one like Clients/Acme Corporation International Holdings/onboarding/2026/q4/handover). Press Cmd+P (Ctrl+P elsewhere) and type overview: each row shows its folder, and the deep one is cut at its start, ending in .../handover. Before: every row read "Overview INBOX".
  2. Links in a table cell. In Edit mode, click into a table cell and type [[ov: the note picker opens with your notes; press Enter and the cell holds [[Overview]]. Type | inside the brackets to add display text. Before: nothing opened.
  3. A deep note's title. Open a note four folders deep and narrow the window (or open it in a split): the outer folders shorten to an ellipsis first and the title stays readable. Click the title: the rename field shows the whole name from its start.
  4. New note at once. Press Shift+Cmd+N (Shift+Ctrl+N elsewhere) for a quick note, or Cmd+N for a note in the current folder: the note opens with its title selected, and the note list picks it up right after. The difference shows on a large vault; on a small one it was already quick. On the phones, the create row's Note, Quick and Task do the same.

Distribution channels

  • GitHub release: installers for macOS (Apple silicon and Intel DMG and zip), Windows (x64 and ARM64 installer) and Linux (x64 and arm64 AppImage, deb, rpm, pacman, tar.gz), with five update manifests; the two screenshots in Demos are attached too.
  • AUR: zennotes-bin 2.75.0-1 (AUR clone c85c8e6, repo aeeacb03), pinned to ZenNotes-2.75.0-linux-x64.tar.gz SHA-256 c22aa38f…23a7, after the tarball check confirmed the bundled CLI folder is world-readable.
  • Nix: packaging/nix/release-data.json lifted from the update workflow (run 39988115848, bot PR #988 closed) as ce4db236, and nix-build on main passed.
  • nixpkgs: NixOS/nixpkgs#575797 now proposes 2.70.0 -> 2.75.0 (1ad64e06), rebased on master; the source hash comes from the tag tarball, and the same command reproduces master's 2.70.0 hash.
  • Homebrew: zennotes 2.75.0 in the tap (07c632f), mirrored in 94d80e0c; both DMGs' SHA-256 match the cask and GitHub's digests; brew style clean.
  • Website: ZenNotes/website#89 merged with the 2.75.0 entry and its two screenshots and the docs for folders in note search and [[ in table cells. Laravel Cloud deployed it at 40550a35, and the live check passed: /releases leads with 2.75.0 and its four entries, both screenshots match the local files byte for byte, and /docs carries the note search sentence.
  • Server and Docker: ZenNotes/znserver v2.75.0 pins the browser app web-2.75.0-web.h601ed1d04a616d4e (4b911ce, ZenNotes/znserver#42); all five binaries match SHA256SUMS, and the released darwin-arm64 binary served the 2.75.0 app on a scratch vault. adibhanna/zennotes:2.75.0, 2.75 and latest are published from the tag (linux/amd64 and linux/arm64); the README's install commands follow (ZenNotes/znserver#43).
  • Boundary packages: core-2.75.0-core.h4b1bd3ddd69c2aab and web-2.75.0-web.h601ed1d04a616d4e, built by CI from 7e6506db, published as pre-releases once their consumers shipped on them. No viewer this time: nothing in 2.75.0 changes how a published note renders. "Latest" still names v2.75.0.
  • Phones: iPhone 1.31.0 (build 47, ZenNotes/zennotesios#74, on core 2.75.0, with its own vault-listing half from #73) is Waiting for Review in App Store Connect, set to release automatically. Android 1.1.45 (versionCode 48, ZenNotes/zennotesandroid#131, with #129 and #130) is in Google Play review at 100% rollout, with no devices lost, and its GitHub release carries Play's signed universal APK.

Release validation

Every CI failure since 2.74.0 was read before this release: ci-sweep.py v2.74.0 found one, main's production dependency audit failing at high on DOMPurify 3.4.14 from advisories published after 2.74.0's cut; it is fixed in 9250282b (3.4.17, the first fixed release, only that package moving in the lockfile). hazard-scan.py --since v2.74.0 found no hazards.

Release-time gates, in a clean worktree with its own npm ci at 7e6506db: typecheck 8/8 with no turbo cache, test:run with no cache (shared-domain 2,054, app-core 3,411, desktop 1,190, quicklook 15 and the rest), and a fresh build:prod. Pack: Developer ID signed; packaged launch check: page target and drawn app in 1.6 s, version 2.75.0. Smoke suites vim-editor, sidebar-vim and editor-improvements pass on the first run. Note search with six notes called Overview and the [[ picker in a table cell were driven in that build over CDP with isolated stores, which is where the screenshots come from. The new-note and task changes were measured on an Android emulator with a 1,663-note, 175-folder vault in a picked folder, before and after each half.

Release PR #986: all 10 checks passed on the first run. CI on main for 7e6506db (run 39983512658): all six jobs green before the tag, and CodeQL too. Release run 39985920115: all six jobs green (both Windows jobs ran slow today, about 45 and 50 minutes); verify-installers.py ALL GOOD by SHA-512 on the five manifests; the app in both DMGs is Notarized Developer ID with a valid stapled ticket. npm run verify:channels -- 2.75.0: every channel serves v2.75.0 (Homebrew, AUR, Nix and the website's eight download buttons).

After the tag, CI on main for the packaging commits: the AUR commit's run (aeeacb03) was cancelled by the Nix push that followed it a minute later, and the Nix commit's run (ce4db236) passed all six jobs; the Homebrew commit's run (94d80e0c) passed all six jobs too.

Don't miss a new zennotes release

NewReleases is sending notifications on new releases.