github ZenNotes/zennotes v2.60.0
ZenNotes v2.60.0

latest release: web-2.60.0-web.h5a4dd1242cf8c2c0
3 hours ago

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 zn installed 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 new zn once before switching to it, so a failed or tampered download never replaces a working CLI, and the previous version stays on disk. The zn a 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 list marks each entry app (saved by the desktop app) or terminal (saved by zn), so zn vault remove, zn disconnect and zn use stop 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 managed zn from. 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-runtime can 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 a note switch wall p50 budget of 150 ms. The old note.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.json and an Ed25519 signature (key zn-release-1, public key in that repo's packaging/release-signing/), built and verified by scripts/releasemanifest in its release workflow. The manifest uses the same schema as apps/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:

  1. Build and launch: npm run build --workspace @zennotes/desktop, then npx electron apps/desktop/out/main/index.js.
  2. Open a large vault with many wikilinks (thousands of notes; links to missing notes and folder/Note links 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.
  3. Benchmark: ZEN_PERF_DESKTOP_NOTES=6577 ZEN_PERF_WIKILINKS_PER_NOTE=2 npm run perf:desktop-runtime, then read note switch wall p50.
  4. CLI: update and open ZenNotes once, check Settings → CLI for 0.6.2, then run zn --version and zn vault list.
  5. CLI updates: with zn installed from Settings → CLI, open Settings → CLI → Updates and press Check for updates; it reports zn 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 in docs/releases/v2.60.0/cli-updates/e2e.mjs.

Distribution channels

  • AUR 2.60.0-1: 93bddbf, mirrored in bac448ab; tarball SHA-256 bd0896eb...e910cc matches GitHub's digest, the bundled CLI folder check passed, and the package checks passed on main and the release branch.
  • Homebrew: tap 0a64194, mirrored in 2250b001; both DMG digests match GitHub's, brew style clean.
  • Nix: 77ce3667; hash-generation run 36896053113 and the main rebuild 36896433936 passed. desktopHash is 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.0 passed for Homebrew, AUR, Nix, and all seven website download routes. GitHub latest is v2.60.0. Website PR #53 merged at 7fda07b4; 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); Docker adibhanna/zennotes:2.60.0, 2.60 and latest (amd64 and arm64).
  • CLI: ZenNotes CLI 0.6.2, the bundled version, is the first CLI release signed by its own workflow; Homebrew's zn formula 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 bundled zn reports 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.

Don't miss a new zennotes release

NewReleases is sending notifications on new releases.