ZenNotes 2.60.0 keeps its command-line tool up to date on its own, makes switching notes fast again in large vaults with lots of links, and bundles CLI 0.6.2 on macOS and Linux.
Released from 15829394 through PR #882 on October 1, 2026. All installers are verified.
Features
- zn updates itself. For a
zninstalled from Settings → CLI, ZenNotes checks the latest CLI release once a day and installs it when it is newer, so CLI fixes no longer wait for a ZenNotes release. Every release carries a manifest signed with the ZenNotes release key; ZenNotes checks the signature and the download's checksum and runs the newznonce before switching to it, so a failed or tampered download never replaces a working CLI, and the previous version stays on disk. Thezna ZenNotes build ships is its floor. Settings → CLI → Updates shows the installed and bundled versions, has Check for updates, and a switch to be told instead of updating automatically; Check for zn Updates… is in the command palette. Homebrew, Go and manual installs keep their own installer. - Open CLI Settings in the command palette now opens the CLI page instead of whichever Settings page was open last.
Fixes
- Switching notes no longer freezes in large vaults. The status bar's backlink count used to check every link in the vault against every note each time you opened a note, which took about five seconds in a 6,577-note vault with 13,672 links. ZenNotes now builds its link index once and looks the count up, so opening a note, or going back to one already in a tab, is immediate. Backlink counts and which note a link opens are exactly as before. Thanks to @yfernandes for the profile and diagnosis (#880).
- CLI 0.6.2 is bundled with the desktop app. It includes 0.6.1's fixes:
zn vault listmarks each entryapp(saved by the desktop app) orterminal(saved by zn), sozn vault remove,zn disconnectandzn usestop being trial and error. Every command starts without waiting five seconds on terminals that never answer a background-color query, help output lines up, and a config file zn cannot read is no longer overwritten with an empty list. 0.6.2 is the first CLI release signed by its own release workflow, the manifest this app updates its managedznfrom. CLI 0.6.1 notes, CLI 0.6.2 notes.
Performance
Click to paint on a vault shaped like the #880 report (6,542 notes, 12,973 links), M-series Mac:
| 2.59.0 | 2.60.0 | |
|---|---|---|
| Switch to another note (median) | 1,077 ms | 77 ms |
| Reopen a note already opened | 1,077 ms | 61 ms |
Wikilink rendering, link clicks, Atlas and the Connections panel's wikilink matching use the same index, so they stop scanning the vault for each link too.
For contributors
npm run perf:desktop-runtimecan seed wikilinks (ZEN_PERF_WIKILINKS_PER_NOTE, default 0, so default runs seed the same vault as before) and now times note switches from click until the note is on screen, with anote switch wall p50budget of 150 ms. The oldnote.open.*sample finishes before React renders the note, which is how #880 passed the benchmark. On the 2.59.0 code the new metric reads 1,513.6 ms; on 2.60.0, 33.7 ms. The search step sends Ctrl+P instead of Meta+P on Linux and Windows.- CLI integration stays at protocol 1; the 0.6.2 pin is that release's signed
terminal-release.json, copied byte for byte after verifying. - Every ZenNotes/tui release now publishes
terminal-release.jsonand an Ed25519 signature (keyzn-release-1, public key in that repo'spackaging/release-signing/), built and verified byscripts/releasemanifestin its release workflow. The manifest uses the same schema asapps/desktop/terminal-release.json, so a desktop release raises its bundled CLI by copying the verified asset. A change to the CLI's integration protocol still needs a desktop release.
Verification
How to test locally:
- Build and launch:
npm run build --workspace @zennotes/desktop, thennpx electron apps/desktop/out/main/index.js. - Open a large vault with many wikilinks (thousands of notes; links to missing notes and
folder/Notelinks made the old cost worst) and click between notes in the sidebar, then click one already open in a tab. Before: a pause of about a second on an M-series Mac, several seconds on slower machines. After: the note appears at once with the same "N backlinks" in the status bar. - Benchmark:
ZEN_PERF_DESKTOP_NOTES=6577 ZEN_PERF_WIKILINKS_PER_NOTE=2 npm run perf:desktop-runtime, then readnote switch wall p50. - CLI: update and open ZenNotes once, check Settings → CLI for 0.6.2, then run
zn --versionandzn vault list. - CLI updates: with
zninstalled from Settings → CLI, open Settings → CLI → Updates and press Check for updates; it reportszn 0.6.2 is the latest release.The full install path (a build that ships 0.6.0 meeting the signed 0.6.1 release) is scripted indocs/releases/v2.60.0/cli-updates/e2e.mjs.
Distribution channels
- AUR 2.60.0-1:
93bddbf, mirrored inbac448ab; tarball SHA-256bd0896eb...e910ccmatches GitHub's digest, the bundled CLI folder check passed, and the package checks passed onmainand the release branch. - Homebrew: tap
0a64194, mirrored in2250b001; both DMG digests match GitHub's,brew styleclean. - Nix:
77ce3667; hash-generation run 36896053113 and the main rebuild 36896433936 passed.desktopHashis the same tarball digest the AUR pins. nixpkgs PR #568334 now carries 2.57.0 -> 2.60.0 as one commit on current master and awaits upstream review. verify:channels -- 2.60.0passed for Homebrew, AUR, Nix, and all seven website download routes. GitHub latest is v2.60.0. Website PR #53 merged at7fda07b4; its main tests and deploy passed, and zennotes.org/releases, /docs, /tui and /tui/docs serve the 2.60.0 content.- Self-hosted server: znserver 2.60.0 embeds the 2.60.0 web client (
web-2.60.0-web.h5a4dd1242cf8c2c0); Dockeradibhanna/zennotes:2.60.0,2.60andlatest(amd64 and arm64). - CLI: ZenNotes CLI 0.6.2, the bundled version, is the first CLI release signed by its own workflow; Homebrew's
znformula points at it.
Release validation
- Fresh typechecks passed (7 tasks, no cache); 5,553 unit tests passed, 5 skipped (shared-domain 1,700, app-core 2,859, desktop 994).
- The signed local package (
npm run pack) launched isolated with a CDP page in 1.4 seconds, reporting 2.60.0 and bundling CLI 0.6.2. Vim editor (12 checks), sidebar navigation (12) and editor improvements smoke suites passed. - PR CI: the first Windows build failed three new CLI manifest parse tests, which built their manifest for the runner's own platform and so hit "ZenNotes does not manage a CLI on this platform" on Windows. A test-only fix (
15829394) made them name a managed platform; all 9 checks then passed on the release commit. - Release run 36888637663: the first Linux x64 job hung for 47 minutes in "Install Linux packaging tools" before building anything, so no Linux x64 file had been uploaded. After macOS, Windows and Linux arm64 finished green, the run was cancelled and only that job re-run; attempt 2 passed in about 10 minutes. No asset was replaced.
- All four update manifests and their 13 referenced files passed size and downloaded SHA-512 verification. The app in the arm64 DMG passed notarization (
Notarized Developer ID), staple and strict deep signature checks, and its bundledznreports v0.6.2. - CLI self-update: a build shipping CLI 0.6.0 updated itself from the live v0.6.1 and v0.6.2 releases with the production key, plus scripted relaunch, automatic-off, tampered-manifest and no-managed-zn scenarios on the dev and packaged builds.
- Mobile core: boundary artifact core-2.60.0-core.hb0d0b54f320a8e3f is adopted in ZenNotes/zennotesios#37 and ZenNotes/zennotesandroid#91.