Repository navigation
ZenNotes 2.81.1 fixes databases on touch screens and in narrow panes. 2.81.0 shows the controls that appear on hover all the time where nothing can hover, and in the Table that put a row's Open button over the end of a long name and squeezed the select column against the edge. Checking that fix found two older problems in a narrow pane, and they are fixed here too. It is a patch for 2.81.0, whose notes have everything 2.81 brings.
Released from daedf423 through #1042 on 2026-11-02. All installers are verified.
Fixes
- The Table's Open no longer covers a long name on a touch screen. Before: the Open button that a mouse brings up over the right end of a row's name sat on every row, hiding the end of a long name ("Book the venue for the spring lau…"). After: a touch screen leaves it out, since the page icon left of the name already opens the page; with a mouse it still appears on hover. The web app on a phone or tablet had it, and so did the desktop app on a touch-first device such as a Surface in tablet mode.
- The Table's select column keeps its width. Before: a long title made the Table wider than a phone's screen, and the select column, shown all the time on touch since 2.81.0, shrank from 40 px to 18 px with its box against the edge. After: it keeps 40 px.
- A Table with a long name opens at its first column. Before: in a narrow pane, a first cell wider than the pane scrolled the Table 40 px as it opened, so the select column was off screen and "New row" read "ew row". After: it opens at the start and scrolls only when the cursor moves. This one is older than 2.81.
- + Row and the header's menu stay on screen in a narrow pane. Before: under about 490 px the database header's tools ran past the pane's edge, and + Row and the … menu could not be reached. After: the tools wrap inside the pane. A wide pane still draws one line.
The phone apps get all four with this core: iPhone 1.36.0 in a new build, replacing the one waiting for review, and Android 1.1.53.
For contributors
zn-hover-only(17bd43d8): the counterpart of 2.81.0'szn-hover-reveal, for a hover shortcut to something already on screen. The no-hover block instyles/index.csssets it todisplay: none, so the control neither covers anything nor takes an unseen tap. The Table row's overlay Open is the only user so far.- The Table's select header and cells add
min-w-10besidew-10(1f816456), since a table squeezes a column's width but not its minimum. - Tests (
f11c3b81):lib/touch-hover-style.test.tsreads the no-hover block, andDatabaseTableView.test.tschecks the overlay Open, the page glyph and the select column. All three are red on 2.81.0. - Opening scroll (
416fbb4a): the effect that scrolls the active cell into view compares row and column by value and skips an unchanged cursor, because the effect that keeps the cursor in bounds hands back a new object with the same numbers on every open. Its test is red without the fix. - Header tools (
e69ea716): the group ismax-w-full flex-wrap justify-end. Checked on the web app; no unit test, since jsdom lays nothing out.
Verification
How to test locally:
- Run the web app with
npm run dev:web-stackand open it in Chrome. - Open DevTools, turn on the device toolbar, pick a phone, and reload, so the page sees a touch screen that cannot hover.
- Make a database (
:kanban, or New Kanban from a folder's menu), switch it to Table, and give a row a long name. - Before: an Open button covers the end of every row's name, and the select boxes sit against the left edge. After: the name reads to its end, the select column stays 40 px wide, and the page icon left of the name opens the page.
- Still on the phone or a narrow window with the sidebar open: before, the Table opened 40 px scrolled (the select boxes off screen, "New row" reading "ew row") and + Row and … sat past the pane's edge. After, it opens at its first column and both buttons are on screen.
- Turn the device toolbar off, widen the window and reload: hovering a row with the mouse still shows Open, and the header's tools sit on one line.
Distribution channels
- GitHub release: installers for macOS (Apple silicon and Intel DMG and zip), Windows (x64 and ARM64 installer and zip) and Linux (x64 and arm64 AppImage, deb, rpm, pacman, tar.gz), with five update manifests. Windows and Linux came from run 41486498938, macOS from run 41490682665, whose
promote-latestmarked it latest once the last feed was up. - AUR:
zennotes-bin2.81.1-1 (AUR cloned896443, repo1ff36e54), pinned toZenNotes-2.81.1-linux-x64.tar.gzSHA-256da286ae9…768dafter the bump script checked the bundled CLI folder. - Nix:
packaging/nix/release-data.jsonfrom the update workflow (run 41490805804, bot PR #1044 closed) asd5417c81;nix-buildpassed on main (run 41491811627). - nixpkgs: NixOS/nixpkgs#579420 now proposes 2.74.0 -> 2.81.1 (
903e776d), the source hash from the v2.81.1 tag tarball; still waiting for review. - Homebrew:
zennotes2.81.1 in the tap (b163ea9), mirrored in03ef9c2b; DMG SHA-256 arm647018e6b4…, x64bf7a8657…. - Website: ZenNotes/website#105 merged at
87f41179(the 2.81.1 entry and server 2.81.1); deployed by its owndeployjob on Laravel Cloud, and the live check passed. - zn CLI: unchanged, 0.14.0 stays bundled.
- Server: ZenNotes/znserver v2.81.1 (#64, README #65) pins
web-2.81.1-web.h1357d855920329a8; Dockeradibhanna/zennotes:2.81.1,2.81,latestatsha256:bb1b79cb…(amd64, arm64). - Boundary packages:
core-2.81.1-core.h4d33347386401068andweb-2.81.1-web.h1357d855920329a8, built from the tag's commit and published as pre-releases. The viewer stays at 2.81.0, since nothing a shared note draws changes. - Phones: iPhone 1.36.0 in a new build 56, replacing build 55 before Apple reviewed it, Waiting for Review; Android 1.1.53 (versionCode 56) in Play review, with its GitHub release carrying Play's universal APK. Both also tighten the header's tools on a phone, and Android's system Back now closes Filter and Columns.
Release validation
- Local gates on the release commit, in a clean
npm cicheckout: typecheck, every test suite uncached (shared-domain 2341, app-core 4699, desktop 1376, Quick Look 18),build:prod, the three smoke suites,npm run packand the packaged launch check (page target, rendered, 2.81.1), hazard scan and dash lint; no failed CI since v2.81.0. - The fixes were checked before anything shipped: the web app from the branch and then the real server binary built with the exact web package, both under touch emulation at 700x900 and the first also with a mouse at 1424 px; the built desktop app with a mouse and with touch emulated (its window stops at 900 px, so the narrow case rests on the web checks); and both phones on this core, before it was published.
- That first web check found the two narrow-pane bugs above, which is why they are in this release. The phone walks found that the wrapping tools left the … menu alone on a line, and that Android's Back left the database over Filter and Columns; both are fixed in the phone apps.
- #1042: all ten checks green. CI on
mainpassed on the release commit before the tag (run 41480080618, CodeQL included), after one re-run: Windows x64 timed out one test at 5 s,leaves no scratch file behind, on a runner whose disk was badly degraded. Disk-heavy test files ran 10 to 25 times slower than on the same commit's passing run (vault.test.ts76.7 s against 4.4 s) while tests without disk work took the same time, and the save path's retries total under 0.4 s, so they cannot explain it.vault.tsis untouched in this release. - The release run needed two restarts, both GitHub's side and neither on our code. Its first attempt stopped at creating the release on an HTTP 500, before anything was built or pinned, and was re-run. Then the macOS job was cancelled before running a step ("not acquired by Runner"), during a macOS runner shortage GitHub had posted, and macOS was rebuilt alone by dispatch, leaving the other platforms' files untouched. "Latest" stayed on 2.81.0 throughout.
verify-installers.py: every file the five feeds name is present at its size; both DMGs are Notarized Developer ID and stapled, reporting 2.81.1;npm run verify:channels -- 2.81.1reported every channel serving 2.81.1.