github ZenNotes/zennotes v2.61.0
ZenNotes v2.61.0

3 hours ago

ZenNotes 2.61.0 makes ZenNotes Cloud say what it is waiting on. A note paused by a sync conflict says so on the note, Cloud's limits name the file and the limit, and a deleted Cloud vault no longer stops syncing in silence. Videos and audio play in the editor, the backup browser reaches every file, and heading links follow in the reading view.

Released from 80c284b8 through PR #887 on October 2, 2026. All installers are verified.

Features

  • A note paused by a sync conflict says so on the note. When the same note changes on two devices, a one-row banner across its top reads "Sync is paused for this note. It changed on this device and on another device.", in Edit, Preview and split alike, with a Review button that opens the conflict queue on that note (with Vim on, Space r does the same and the banner names it). A notification with Review appears once for each new conflict, stays quiet while the queue is open, and comes back if a resolved conflict returns. Before, the only sign was "1 file needs review" in the status bar, which zen mode hides.
  • Videos and audio play in the editor. Attaching or dropping an image, PDF, audio or video file now embeds it (![[path]]) instead of writing a link, and Edit mode draws a standalone audio or video line as the same player the reading view uses, with Open and </> (edit the line) in its header.
  • The backup browser reaches every file. Settings → Cloud → Backups → Browse notes now reads "Showing 50 of N notes" with Load more, and its search asks Cloud, matching any part of a path across the whole backup. Before, it listed the first 50 files and searched only those, so a note that sorted later could not be restored on its own.
  • Deleting a Cloud vault asks for its name. The dialog reads "Delete “Name” for every device?", says what is lost and what stays on your devices, points to Unlink this device for stopping on one device only, and keeps Delete disabled until the vault's exact name is typed.

Fixes

  • Cloud names what stopped a sync. The status bar and Settings say "1 file too large for Cloud", "Cloud storage full" or "Cloud item limit reached" instead of "Sync incomplete", the message names the file ("“clip.mov” is larger than the 10 MB Cloud file-size limit, so it stays on this device."), and the note itself shows "Not synced to Cloud: larger than the 10 MB file-size limit, so it stays on this device." under that file. A 10 GB plan now reads 10 GB rather than 9.3 GB.
  • A deleted Cloud vault no longer stops syncing in silence. When a Cloud vault is deleted on another device or on the website, the devices still linked to it used to unlink quietly and show the success color. Now the status bar says "Cloud vault deleted" (or "Cloud vault unavailable" when Cloud refuses it to this account), and Settings → Cloud → This vault explains what happened until you link or create a vault, or dismiss the notice; Review, Space r and the new Review Cloud Vault palette entry all open it, and the notice survives a restart. Settings also stops offering a vault that is gone.
  • Settings → Cloud after signing in. Signing in while the page was still loading reported "Cloud account changed while loading credentials."; the newest load now wins and a cancelled one retries. Failures of This vault's actions appear inside This vault instead of at the top of the page, and messages no longer start with an internal class name such as "CloudServiceRequestError:".
  • Large files sync in bounded steps. Cloud now hands over large revisions as references fetched in bounded pages, downloads go to a staging file checked for length and SHA-256 before they replace a note or attachment, an interrupted catch-up keeps its place, sync honors Cloud's retry delays across windows, and it stops cleanly on sign-out and quit (#884).
  • Heading links follow in the reading view. A Markdown [text](#heading) had nothing to scroll to because rendered headings carried no id; it now lands on the heading, as do #Heading%20Text and #heading-slug, and a click on a [[#Heading]] link no longer opens the hover card first.
  • Folder pickers on touch screens open without the keyboard. On a touch screen, Move to… for a note or a folder shows the whole folder list; tap the field to type a path. Prompts with nothing to tap still open with the keyboard.
  • Cloud never syncs another device's bookkeeping. A vault that is also open on a phone could carry the phone's zennotes-cloud-sync folder, which then synced back and forth on every run; sync now skips it.
  • The Review Cloud Sync Conflicts palette entry names Space r only with Vim on, since the leader does nothing without it.

For contributors

  • New optional bridge method listCloudBackupItemsPage(backupId, { page, search }) with the desktop IPC handler cloud-backup-items:page (the vault comes from main-process state; page and a 200-character search are validated there). Hosts without it keep the old single page with local filtering. ZenNotes Cloud's backup items endpoint accepts search (ZenNotes/website#57).
  • The status row carries data-cloud-sync-phase and data-cloud-sync-review, and Settings marks its dialog with data-settings-target, so the phone shells can style and route without matching Tailwind classes.
  • The phones already carry this release's app code: core 2.60.4 (core-2.60.4-core.hae0e49f9e5397fc2) is in iPhone 1.17.1 and Android 1.1.31, and the self-hosted web client web-2.60.4-web.ha0258ecc7b3c0133 is in znserver 2.60.1. No new boundary artifacts are built for 2.61.0: the code is the same.

Verification

How to test locally:

  1. Build and launch with isolated stores: npm run build --workspace @zennotes/desktop, then ZENNOTES_USER_DATA_PATH=$(mktemp -d) ZENNOTES_CONFIG_DIR=$(mktemp -d) npx electron apps/desktop/out/main/index.js.
  2. Media: drop a short .mp4 into a note. Before: [clip.mp4](…). After: ![[…/clip.mp4]] and a player in Edit mode and in Preview.
  3. Heading links: put [jump](#section-three) at the top of a note and ## Section Three far below, open Preview and click the link. Before: nothing. After: the note scrolls to the heading.
  4. Cloud (needs an account): link a vault on two devices, take one offline, edit the same line on both, reconnect. Before: only the status bar knew. After: the note shows the banner and a notification offers Review, which opens the queue on that note.
  5. Cloud backups: Settings → Cloud → Backups → Create backup, wait for Ready, Browse notes on a vault with more than 50 files. Before: 50 rows. After: "Showing 50 of N notes", Load more, and search finds files on later pages.
  6. Cloud delete: Settings → Cloud → Delete Cloud vault. After: the dialog names the vault and keeps Delete disabled until its exact name is typed. Cancel.

Distribution channels

  • AUR 2.61.0-1: 96731c2, mirrored in c9e2427f; tarball SHA-256 c0d8d21a...aa69b36 matches GitHub's digest, the bundled CLI folder check passed, and the AUR package checks passed on main and the release branch.
  • Homebrew: tap 1c0b680, mirrored in 9a74e705; both DMGs were downloaded and their SHA-256 matches the cask and GitHub's digests; brew style clean.
  • Nix: fcd44f09; hash-generation run 37078241465 and the main rebuild 37078403704 passed. desktopHash is the same tarball digest the AUR pins. nixpkgs PR #569616 carries 2.60.0 -> 2.61.0 as one commit on current master and awaits upstream review. Its source hash is the tag tarball's, which nixpkgs fetches differently from this repo's package, computed with nix store prefetch-file --unpack; the same command reproduces master's current 2.60.0 hash.
  • verify:channels -- 2.61.0 passed for Homebrew, AUR, Nix, and all seven website download routes. GitHub latest is v2.61.0. Website PR #59 merged at 7beab52; its main tests and deploy passed (run 37081053002), and zennotes.org/releases serves the 2.61.0 entry.
  • Self-hosted server: znserver 2.60.1, released the same day, embeds the same client code (web-2.60.4-web.ha0258ecc7b3c0133); Docker adibhanna/zennotes:2.60.1, 2.60 and latest. No server release follows 2.61.0, because the code is identical.
  • Phones: iPhone 1.17.1 (33) and Android 1.1.31 (34) carry this release's app code as core 2.60.4 and are in store review.

Release validation

  • Fresh typechecks passed (no cache); 5,831 unit tests passed, 5 skipped (shared-domain 1,861, app-core 2,945, desktop 1,025).
  • The signed local package (npm run pack) launched isolated with a CDP page in 1.4 seconds, reporting 2.61.0 and bundling CLI 0.6.2; codesign --verify --deep --strict passed. Vim editor (12 checks), sidebar navigation (12) and editor improvements (19) smoke suites passed.
  • Release PR #887: all 9 checks passed on 80c284b8.
  • Release run 37077212178 passed on every platform on the first attempt, with 25 assets.
  • 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, reports 2.61.0, and its bundled zn reports v0.6.2.
  • Cloud: the changes were exercised against production during the October 2 device acceptance run on a real iPhone and this desktop app, and the backup browser was checked against production with a 91-file backup. Publishing, full-vault restore and billing were not part of this release's checks.

Don't miss a new zennotes release

NewReleases is sending notifications on new releases.