github ZenNotes/zennotes v2.79.0
ZenNotes v2.79.0

latest releases: core-2.79.0-core.h7896a01910a2ea0f, viewer-2.79.0-viewer.h0711b886c5c63e6c, web-2.79.0-web.h3e205408b9525e19...
5 hours ago

ZenNotes 2.79.0 puts your tasks on a timeline and every command on a key. The new Timeline panel lays every open task with a date down one line, with overdue work and milestones marked. Every command in the palette can now take a key of its own, from Move Note to Trash to a leader sequence in Vim mode. On macOS, Share to ZenNotes saves a page or a selection from Safari and any other app. Unsplash covers arrive with a key of your own, and the keyboard works fully with Vim mode off, in the sidebar and in every side panel.

Released from 47d2682 through #1010, #1011, #1013 and #1017 on 2026-10-29.

Features

  • The Timeline panel (#1007, asked for by williamcheuk03). A fifth right-hand panel, beside Outline, Connections, Comments and Calendar, that lays every open task in the vault with a date down one line. Overdue tasks sit on top in red with how many days late each one is, Today follows, then one node for each later day that has work; a run of empty days folds into one "N quiet days" line. A task's date is its due: date, or for a task in a daily note, that note's date. Tag a task #milestone and its day draws as a diamond, saying how many open tasks are due before it. A switch reaches 2 weeks ahead (the default), a month or everything (timeline_range under [view] in config.toml), and the filter takes the Tasks filter syntax. Open it with Mod+7, Space n in Vim mode, :timeline, Toggle Timeline in the command palette, or its button in the note header; j/k move, x ticks, m opens the task menu, Enter opens the note at the task's line.
  • Every command can take a key (#971, thanks to Asterythm). All 197 commands in the command palette can now be given a key, all unbound to start. Highlight one in the palette and press Alt+Enter (Option+Enter on macOS) to record a key without leaving the palette, or use the new Commands group in Settings, Keymap. A key is a chord, a function key, or with Vim mode on a leader sequence such as Space x a, which shows in the leader hints. Your key wins over every default, the editor's own keys included; the recorder warns when it takes over a default and refuses one another of your bindings holds. When a command cannot run where you are, its key says why ("Restore from Trash only works on a note in the Trash"). In config.toml the keys live under [keymaps.commands], and from the ex line :bind <C-BS> note.trash binds and :unbind command note.trash takes the key away.
  • Share to ZenNotes on macOS (asked for by charles b.). Choose Share, ZenNotes in Safari or any app with a Share menu to save the page you are on, the text you selected, or both, as a note, with an optional line of your own. A page becomes a note named after it, with your selection quoted and a link back; text alone is named from its first line. Each vault chooses where shares land under Settings, Vault, Notes, Default shares location: Quick Notes (the default), your primary notes location, or a folder such as Clippings, and the sheet's heading says where a share will go. With ZenNotes closed, a share waits and is filed the next time you open it; a share for a server vault is filed once you are connected to it.
  • Unsplash covers with your own key (asked for by charles b.). The cover picker has an Unsplash tab: paste your Unsplash Access Key once under Settings, Typography, Covers, and search millions of photos for a note's cover. Searches go straight from your computer (or your browser, in the web app) to Unsplash with your key; zennotes.org takes no part. The key is kept in your system's secure storage, the photo is credited to its photographer on the cover, and without a key the tab shows how to get one.
  • A cover's frontmatter folds to one line. In Edit and Split, a cover's banner, banner_y and credit lines fold into one muted line, such as cover · Unsplash photo by Kalen Emsley or cover · lisbon.jpg, since the cover above already shows the picture. Move the cursor onto it (arrows, or j/k) or click it to edit the raw lines; it folds again when you leave.
  • A switch for the status bar (asked for by Piotr). Settings, Appearance, Chrome, Status bar hides the bar along the bottom of the window; it comes back on its own only while ZenNotes Cloud needs you. Also Toggle Status Bar in the command palette and :set nostatusbar (show_status_bar under [appearance] in config.toml).
  • Trash from the sidebar by key (#972, thanks to Asterythm). x in Vim mode, or Mod+Backspace in either mode, moves the note under the sidebar cursor to the Trash after a confirm, or the whole selection with one confirm; the cursor stays on the row that took its place. With the sidebar focused, Move Note to Trash and Move Note to Archive act on that row too.
  • A folder as a Gallery (asked for by charles b.). Open as Gallery on a folder in the sidebar shows its notes as cards by their covers: a vault image, an Unsplash photo or a gradient, and the title's first letter for a note without one. Sort by updated, created or title, switch on Include subfolders, and filter by title. Open it with Open Folder Gallery in the command palette, :gallery (with an optional folder, :gallery Projects), or Space G in Vim mode; in the grid h, j, k and l move, Enter or o opens, and / filters (with Vim mode off, the arrows, Enter and Escape). Covers are read only for the cards on screen, so a folder of a thousand notes opens at once. The sort and the subfolder switch travel in config.toml (gallery_sort, gallery_include_subfolders under [view]).
  • Database views that keep their own columns (asked for by charles b.). A table view's Columns button, beside Filter, opens a checklist of its columns with a find field, Show all and Hide all, and reads "Columns 5 of 44" once some are hidden; each saved view keeps its own, so one wide CSV can carry several narrow views. The + beside the view tabs makes a New table view, a New board view, or a copy of the current one (Duplicate this view). To keep certain rows in a view, select them and choose Show only these in this view: the view says "Showing N picked rows", with Edit picks and Show all rows, a row you add there joins its picks, and a board shows its picks too. Press c in the grid in Vim mode for Columns; five palette commands (Choose Database Columns, New Table View, Duplicate View, Show Only Selected Rows, Show All Rows) can each take a key.
  • Right-click to make or change a callout (#1016, asked for by williamcheuk03). Right-click selected lines, or a paragraph, and choose Turn into callout…: a Callout type menu lists every type with its icon (Note, Info, Tip, Success, Warning, Danger (Error), Quote and the rest), and your lines become a > [!type] callout in one undoable change. Right-click a callout, written out or drawn as a card in Live Preview, for Change callout type… (its title and fold marker stay) and Remove callout, which turns it back into plain lines. From the keyboard: Set Callout Type… and Remove Callout in the command palette, each bindable, and Space l a in Vim mode.
  • Code blocks pick their language, and guess one they lack (#1014, asked for by williamcheuk03). The language label at a code block's top right now opens a Code block language picker: type to find any of the languages the editor highlights (your own TextMate grammars too) and pick one, and only the fence's language word changes, as one undoable edit; Text (plain) removes it. Copy moved to its own icon beside the label. A block with no language gets a guess, highlighted the same way and labeled python · detected, but nothing is written to the file until you choose Python (detected) at the top of the picker; tiny or ambiguous blocks stay plain text. From the keyboard: Set Code Block Language… in the command palette, or Space l l in Vim mode. Settings, Editor, Writing, Detect code block languages turns guessing off in the editor and the reading view alike (detect_code_languages under [editor] in config.toml).

Fixes

  • Update checks while a release is uploading (#1003, thanks to THEMaeker). A check for updates in the first minutes of a release could find the new version before its update file was uploaded and showed a dialog full of HTTP headers that called a 404 a "temporary server error". It now says "ZenNotes 2.79.0 is still being published. Try again in a few minutes.", every other update error gets one plain sentence, and the raw text sits under Details in Settings, About. From this release on, a new version only becomes the latest release once all five update files are on it, so that window is gone.
  • Select all leaves the note's title alone (#1006, thanks to williamcheuk03). With the cursor in a note's text, the first Ctrl+A (Cmd+A on macOS) selects from the first line under the # Title heading to the end, so typing over it no longer replaces the title; a second press selects the whole note. Vim's Ctrl+A increment keeps working.
  • A blank Quick Note prefix gives a bare timestamp (#1008, thanks to davi-jorge-art). Clearing the prefix in Settings still named new quick notes "Quick Note ...": the empty field was saved, but the title builder put the default back. It now gives a title that is just the timestamp or date, the empty field reads "No prefix", and the field keeps the spaces you type.
  • The Tasks filter finds a task note by a tag in its body (#1008). A task made with New task (a note of its own) now matches a tag written anywhere in its note, in the list, the calendar and the board, as the Tags view already did.
  • Menus with Vim mode off take j and k as letters. In a right-click menu, j and k moved the highlight even with Vim mode off; with it off they now go into the menu's filter like any letter, and the arrows move.
  • Typing in a new note goes under its title. Make a note, name it and press Enter (or run New Note from the palette), then type: the text went in front of the # Title heading, as Body# My note, on desktop and on the phones. It now goes on the empty line under the heading.
  • Typing in a new sub-task lands after its checkbox (#1012, thanks to JulianBnder). Vim o on a task line and then Tab (or Enter, then Tab, with Vim mode off) showed the cursor after the new sub-task's - [ ] , but what you typed went in before it. Since 2.71.0, an empty task that you indented did this; text now goes where the cursor shows.
  • Self-hosted servers behind your own certificate authority connect on macOS (#1009, thanks to lewxdev). With a certificate from a private authority that your Mac trusts (step-ca, a company root), connecting failed with "fetch failed" unless ZenNotes was launched with NODE_USE_SYSTEM_CA=1. The app and its MCP server now also trust the certificates in the system's store, as the window always did.
  • Cloud sync after an assistant edits a note (#1004, thanks to tdtmusic2). Once an assistant (through the MCP server) had edited a note, Cloud sync failed on every run with "This path is not eligible for vault sync." The fix is on the Cloud server and is already live, so every version syncs again with no update.
  • The keyboard with Vim mode off. The sidebar walks like a tree: → opens or expands, ← collapses, Page Up and Page Down move a screenful, and Shift+F10 opens a row's menu. The note list, Connections, Outline and Comments panels gained the same keys (→ opens, ← goes back, Page Up/Down, the menu key in the note list), and Focus Sidebar from the command palette keeps the keyboard instead of handing it back to the editor. Letter keys stay off with Vim mode off.
  • The palette names no Vim key with Vim mode off. Seventeen palette rows showed keys that only work in Vim mode (leader chords like Space d, ex commands like :w, z c, Ctrl+O, Ctrl+W h). They now show only with Vim mode on, and Go Back and Go Forward show Alt+← and Alt+→ instead.
  • Ctrl, Alt and Cmd keys work for list-view actions. A modifier key bound to a list view action (such as "nav.delete" = "Mod+Backspace") was silently stored without its Mod and never fired. It now keeps its modifier and fires in the sidebar and every list view, and Settings marks a binding that a global shortcut holds as "Never fires".
  • Deleting a comment from the keyboard asks first. d, Backspace and Delete in the Comments panel deleted a comment for good with no confirm; they now ask, and the cursor moves to the next comment instead of jumping back to the first. The card's own Delete button is unchanged.
  • An image in the note list opens as an image. Enter or l on an image file in the note list loaded the picture into the editor as text; it now opens in its own tab, as a click does.
  • The cursor shows on a selected sidebar row. A row that was part of a multi-selection never drew the Vim cursor; it now shows as a ring over the selection.
  • Phones open notes to read (in the phone releases built on this core: iPhone 1.34.0 and Android 1.1.50). A note opened from Home, the drawer, a list, a link, a search pick, the Back button or a palette command opens with its first line rendered and the keyboard down; tap the text to type. Backing out of the palette, running a toggle from it, or picking a theme leaves the keyboard down too, Return in the palette no longer runs a command the phone hides, and Settings no longer mentions an Unsplash key the phones do not have. On Android, a self-hosted server whose certificate comes from your own certificate authority now connects once that authority is installed (thanks to lewxdev, ZenNotes/zennotesandroid#141).

For contributors

  • Timeline (ecb35368): lib/timeline-rail.ts builds the rail from the Tasks view's own Today and Upcoming groups and filterTasks (no new date or overdue rule, no parser copy touched); TimelinePanel.tsx joins the right-panel family (RightPanelId, side-panel-fit, the tuck rail) and handles its keys in its own onKeyDown after VimNav. New portable pref timelineRange.
  • Command keys (28f7ed99, de773eda): commandKeymaps sits beside keymapOverrides, with a generated shared-domain/commands-catalog.ts that a test rebuilds from buildCommands(). lib/command-keymap-dispatch.ts is a capture-phase listener that stands down for every overlay; leader sequences run in VimNav after the built-in leader keys, which always win. [keymaps.commands] in config.toml, with a courtesy read of bare command ids under [keymaps] (nav.back is both an action and a command, so it stays the action). KeymapRecorder.tsx is shared by Settings and the palette.
  • Keymap chords in list views (865c14d0): normalizeSequenceToken keeps Mod and resolves it at match time; lib/list-view-keys.ts replaces the per-view metaKey || ctrlKey || altKey bail. Sidebar trash (4cb73ecf): lib/sidebar-note-actions.ts, new action nav.sidebarTrash (Mod+Backspace), and note.trash / note.archive follow the sidebar cursor when it has focus.
  • Vim off (9b070afe, 701988d2): VimNav installs one more listener that routes the focused sidebar and panels to their existing Vim handlers with Vim off, typed keys gated; App's handlePanelKeyWithoutVim is gone. CommandPalette.runCommand records the panel a command moved the keyboard to before the palette closes, which is what made Focus Sidebar stick. Palette hints (4b7deaff): vimOnly in commands.ts.
  • Share to ZenNotes (fab6f182, 27c30cdc, 605b023b, 9e35242d): apps/share-extension is a Swift share extension built and signed into the app in after-pack.js like Quick Look; it writes JSON into ~/Library/Application Support/ZenNotes/Share Inbox/Captures, which share-inbox.ts drains through createNote. vault.json gains sharesLocation; server vaults need znserver 2.79 (supportsSharesLocation).
  • Unsplash (15cee9f2, 1063a4f4): the key lives in safeStorage (refused without OS encryption) and the main process calls api.unsplash.com directly; the web client keeps it in browser storage. Covers stay hotlinked with banner_credit / banner_credit_url and the download ping, per Unsplash's terms. The cover fold (0df65fce) is lib/cm-cover-fold.ts, reading cover lines through readNoteCoverLines in shared-domain/note-cover.ts; cm-vim-display-line.ts and cm-math-nav.ts step into it like a math block.
  • Updates (63594b19, 7edddae8): describeUpdateError reads an HTTP status only from structured fields (a bare 5\d\d had matched an HSTS header), and ErrorDetails.tsx is shared with the Cloud errors. release.yml creates the release with --latest=false; a promote-latest job marks it latest once all five feeds are up and never over a newer release.
  • Phones (d10fdd76, c329a9a5, ea958af8, 00cf1621): the editor host's openNotesToRead() decides read or edit; lib/command-landing.ts sorts palette commands into read, edit and stay, defaulting to stay. Status bar (cfd3b103): portable pref showStatusBar, :set statusbar.
  • Smaller fixes: 5d0d78e6 (resolveQuickNoteTitle takes string | null), 2db21e79 (filterTasks takes a note-tags map), 57f9e8b3 (selectNoteText, with leadingTitleHeading in shared-domain), 39ac61b0 (sidebarSelectedRowClass), aeaa41d4 (comment cursor).

Demos

Clips and screenshots of this release on the release build, attached to this release:

The Timeline: Mod+7 opens it beside a project note, with two overdue tasks, today, the quiet days folded and a #milestone diamond; Space n, j/k and x tick a task off the rail, and Month reaches further ahead. Watch the clip (33 seconds, captioned).

The Timeline panel beside a project note

A key for any command: Alt+Enter on Toggle Word Wrap in the palette records F8, and F8 then wraps the note; in Settings, Keymap, Commands, Move Note to Archive takes Space x a. Watch the clip (39 seconds, captioned).

Unsplash covers and the cover fold: the frontmatter folds to cover · Unsplash photo by ..., k opens it, and the Unsplash tab sets a new photo (recorded against a local stand-in for Unsplash, with real photos and their photographers). Watch the clip (26 seconds, captioned).

The Unsplash tab in the cover picker

Share to ZenNotes from Safari, and the note it files:

The ZenNotes share sheet over a Safari page

The sidebar with Vim mode off: Alt+H, the arrows walk the tree, and Mod+Backspace trashes one note, then three at once with one confirm. Watch the clip (28 seconds, captioned). The status bar hides from the palette and comes back with :set statusbar: watch the clip (13 seconds).

A folder as a Gallery: a Recipes folder with image, Unsplash and gradient covers, the letter cards for notes without one, and the cursor ring.

A folder's notes as a Gallery of covers

Database views: a Pipeline view showing five of a database's 44 columns and three picked rows.

A table view with five columns and three picked rows

The callout menu: Turn into callout… opens the Callout type list for two selected lines.

The Callout type menu

Code block languages: a block without a language, detected as Python, with Python (detected) at the top of the picker.

The code block language picker with a detected language

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. Turn Vim mode on in Settings for steps 1 to 4.

  1. Timeline. Write a few tasks with due: dates (one in the past, one today, one next week) and one tagged #milestone. Press Mod+7: overdue tasks sit on top in red, today has an accent ring, the milestone is a diamond. Press Space n, then j and x: the task leaves the rail and the note reads - [x].
  2. Command keys. Open the command palette, type "word wrap", press Alt+Enter, then F8, then Enter. Press F8 in a note: word wrap toggles. Run :bind <C-BS> note.trash and press Ctrl+Backspace on a note: it asks to move it to the Trash.
  3. Sidebar trash. Focus the sidebar (Ctrl+W h), move to a note with j, press x: confirm, and the note is in the Trash with the cursor on the next row.
  4. Select all. In a note made with New note, click into its text and press Cmd+A (Ctrl+A on Windows and Linux): the title is not selected. Press it again: everything is.
  5. Quick Note prefix. Settings, Notes, clear Quick Note prefix, then make a quick note: its title is just the timestamp.
  6. Vim off. Turn Vim mode off, press Alt+H: the arrows walk the sidebar, → expands a folder, ← collapses it, Shift+F10 opens the menu, and j does nothing. Open the command palette: no row shows Space, : or z keys.
  7. Unsplash. Under Settings, Typography, Covers, paste an Unsplash Access Key (make one at unsplash.com/developers) and press Save. Run Add Cover, press Tab, type "fog" and pick a photo: the cover shows with "Photo by ... on Unsplash", and the frontmatter folds to one cover · Unsplash photo by ... line.
  8. Share to ZenNotes (macOS). With ZenNotes running, in Safari choose Share, ZenNotes, then Save: the page is a new note in Quick Notes.
  9. Status bar. Run Toggle Status Bar: the bar along the bottom goes away.
  10. New sub-task. With Vim mode on, in a note with - [ ] parent, press o, then Tab, then type abc: the line reads - [ ] abc (it was abc- [ ]). With Vim mode off, Enter then Tab does the same.
  11. Private certificate authority (macOS). With a server whose certificate comes from an authority in your keychain, launch ZenNotes from the Dock and connect: it connects without NODE_USE_SYSTEM_CA.
  12. Gallery. Put a few notes with covers in a folder, right-click the folder in the sidebar and choose Open as Gallery: the notes show as cards by cover. Press l and j (or the arrows with Vim mode off) to move, Enter to open.
  13. Database views. Open a database with many columns, press Columns, Hide all, then tick four. Press +, New table view, and switch back: each view keeps its own columns. Select three rows and choose Show only these in this view: the view reads "Showing 3 picked rows".
  14. New note. Make a new note, type its name, press Enter (in Vim mode, then i) and type Body: it lands on the line under # <name>.
  15. Callouts. Select two lines, right-click, choose Turn into callout…, then Warning: the lines become a > [!warning] callout. Right-click inside it, Change callout type…, Tip: it reads [!tip]. Right-click again, Remove callout: the plain lines are back.
  16. Code languages. Write a fenced block of Python without a language: its label reads python · detected and it is highlighted, while the file still has a bare ```. Click the label and choose Python (detected): the fence reads ```python. Click the label of another block, type type, pick TypeScript, then Undo: the fence is back as it was.

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 clips and screenshots in Demos are attached too. This is the first release made "latest" by the release workflow itself, only once all five update manifests were uploaded:
  • AUR: zennotes-bin 2.79.0-1 (AUR clone 6f48c67, repo f47e888d), pinned to ZenNotes-2.79.0-linux-x64.tar.gz SHA-256 d8120c35…b172, after the tarball check confirmed the bundled CLI folder is world-readable.
  • Nix: packaging/nix/release-data.json lifted from the update workflow (run 40946961282, bot PR #1018 closed) as 257da0e9, and nix-build on main passed.
  • nixpkgs: NixOS/nixpkgs#579420 now proposes 2.74.0 -> 2.79.0, changing only the version and two hashes; the source hash comes from the tag tarball, and the same command reproduces master's 2.74.0 hash.
  • Homebrew: zennotes 2.79.0 in the tap (a778600), mirrored in 2eab66f2; both DMGs' SHA-256 match the cask and GitHub's digests; brew style clean.
  • zn CLI: the bundled zn is 0.12.2, the latest ZenNotes/tui release.
  • Website: ZenNotes/website#97 merged with the 2.79.0 entry and five captioned clips, the docs for everything in this release, the server 2.79.0 and Android 1.1.50 entries on their tabs, and the 2.79.0 share viewer (the 2.78.0 viewer kept for pages already open). ZenNotes/website#98, the #1004 Cloud fix, shipped earlier the same day. GitHub Actions cannot start jobs on the website repository while its billing is blocked, so both ran their full test suite on a Linux machine instead and were deployed to Laravel Cloud by hand (3c0b57c9, then f3b4a1c8); the live check passed: /releases leads with 2.79.0, the timeline clip matches the merged file byte for byte, seeking works, /docs has the new sections, and both viewers are served.
  • Server and Docker: ZenNotes/znserver v2.79.0 pins the browser app web-2.79.0-web.h3e205408b9525e19 (0c094f6, ZenNotes/znserver#51); all five binaries match SHA256SUMS, and the manifest.json asset matches the pin byte for byte. adibhanna/zennotes:2.79.0, 2.79 and latest are published from the tag. The README's install commands name 2.79.0 (ZenNotes/znserver#52).
  • Boundary packages: core-2.79.0-core.h7896a01910a2ea0f, web-2.79.0-web.h3e205408b9525e19 and viewer-2.79.0-viewer.h0711b886c5c63e6c, built by CI from 47d26827 and published as pre-releases (core once both phones were submitted on it). "Latest" names v2.79.0.
  • Phones: iPhone 1.34.0 (build 53, ZenNotes/zennotesios#83, on the final core) is Waiting for Review in App Store Connect, set to release automatically; it replaces build 52, which was withdrawn before review. Android 1.1.50 (versionCode 53, ZenNotes/zennotesandroid#142, which includes lewxdev's ZenNotes/zennotesandroid#141) is in Google Play review at 100% rollout with no devices lost, and on GitHub with Play's signed universal APK.

Release validation

Every CI failure since 2.78.0 was read before this release, and the gates ran in a worktree with its own node_modules on each of the release's tips; on the final commit 47d26827: typecheck 8/8 with no turbo cache, test:run (shared-domain 2,208, app-core 4,401, desktop 1,255, quicklook 18), a fresh build, a Developer ID signed pack, and the packaged launch check (page target and drawn app in 1.5 seconds, version 2.79.0). The vim-editor, sidebar-vim and editor-improvements smoke suites passed on the first run. Release PR #1017: all ten checks passed; CI on main for 47d26827 (run 40931288961): all six jobs green before the tag. Release run 40944582753: all jobs green; verify-installers.py ALL GOOD on the five manifests; the app in both DMGs is Notarized Developer ID with a valid stapled ticket. npm run verify:channels -- 2.79.0: every channel serves v2.79.0 (Homebrew, AUR, Nix and the website's eight download buttons).

The new rule that a release becomes "latest" only when all five update manifests are on it held on its first run: publishing the notes left v2.78.0 as latest, and the release workflow's "Mark the release latest" step ran at 20:48:03 UTC, nine seconds after the last manifest (latest-arm64.yml) was uploaded. Nobody checking for updates during the upload was offered 2.79.0 before its files existed, the case behind #1003.

Late changes were gated again each time: the three fixes found on release morning (#1004 on the server, #1009 and #1012 in the app), then charles b.'s database views and Gallery, #1016 and #1014, and two fixes found by the phone walks (a theme pick raising a phone's keyboard, and typing in a new note going in front of its title, a bug older than this release, also on desktop). Each feature was checked in the built app over CDP with isolated stores before it merged (the Gallery also against a self-hosted server and in the web app), and both phones were walked end to end on their release builds of the final core, with clips.

Things that went wrong, told plainly: the vim-editor smoke check "3j follows logical relative line numbers" failed once on a busy machine and then passed five times, beside load and without; its detail was lost, its cause is not named yet, and it is being chased for 2.80.0. One app-core test waited a fixed 80 ms for rows that took longer when every package's tests ran at once; it now waits for the rows (b996b58b, no product change). The production dependency audit failed once on main because npm's registry refused the request; the same audit passes locally with no high advisories, and its re-run passed. Code signing on the release Mac could not reach Apple's timestamp server over IPv6, so the local pack was signed through its IPv4 address (CI is unaffected). The core, web and viewer packages were rebuilt four times as fixes and features joined the release; only the final ones were published.

Don't miss a new zennotes release

NewReleases is sending notifications on new releases.