github ZenNotes/zennotes v2.18.0
ZenNotes v2.18.0

3 hours ago

ZenNotes 2.18.0

Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.

Self-hosted: upgrade the server image too, not just the desktop app. When the desktop is connected to a remote workspace it does not scan the vault itself, it asks the server to. So a newer desktop against an older Docker image quietly loses server-side features instead of reporting a version mismatch. This caught a user in #446: a 2.15.0 desktop against a 2.14.0 image showed inline - [ ] checkbox tasks but never whole-note (tags: task) tasks, because whole-note task support lives in the server and only landed in 2.15.0. No amount of restarting could have fixed it. docker compose pull && docker compose up -d --force-recreate, and docker compose images shows which tag you are actually running.

⚡ Performance

  • Images no longer reload every time you scroll back to them. In a note with images, scrolling past one and back made it blank out and pop in again. The editor throws away an image's rendered block when it scrolls out of view and rebuilds it on the way back, and local asset responses never reach the browser's cache, so each return trip re-read the file from disk, sent it across processes and decoded it from scratch. On a test note with ten large images, a single scroll down and back triggered 37 asset reads and rebuilt every image element 56 times, never reusing one. Recently shown images now stay decoded and get reused: the same pass drops to 16 reads and 19 rebuilds, and the worst frame during a fast flick scroll improves from 30.0ms to 22.5ms. The cache is sized by decoded pixels rather than image count, since a file's size says nothing about how much memory it takes once decoded, and it is kept deliberately small (about 64MB) so the app is not trading a lot of memory for a rare case. An image edited outside ZenNotes still reloads. (#472, reported by @SandeepKumarKuanar)

🐛 Fixes

  • Link text stops disappearing while you type or paste the URL. Writing an external link the normal way, [Example]( and then pasting the address, made the line go wrong mid-edit: the label collapsed to Example( the moment you typed the opening paren, and then the URL you pasted vanished too, so all you saw was Example( until the closing ) landed. Two things were behind the one symptom. While the target is unclosed the Markdown parser ends the link at the ], so live preview treated the cursor as being outside the link and hid the brackets. And the URL you paste after that paren parses as a plain autolink rather than a link destination, but the rule for hiding a destination was only "it follows a (", so the pasted address got hidden as well. Now a [label]( with no matching ) yet is not treated as a link at all: it stays as plain source while you type or paste, and collapses to the rendered label only once the syntax is complete. Parens are counted rather than stopping at the first ), so a destination like https://en.wikipedia.org/wiki/Foo_(bar is still recognised as half-typed. The same change fixes a bare URL written in parentheses, a (https://parens.example) b, which used to render as a () b. Completed links are untouched: [label](url) still collapses to just the label once the cursor leaves the line. (#471, reported by @SandeepKumarKuanar)

    Worth knowing: auto-pairs (on by default) turns ( into () as you type, which parses as a complete link straight away and hides the problem. It showed up with auto-pairs off, or when editing an existing link where the ) was briefly missing.

  • The Assets view remembers how you sorted it. 2.17.0 made every column in the Assets view sortable, but the choice only lasted as long as you stayed on the view: sort by Modified, click away to a note, come back, and you were staring at Name ascending again. The sort was component-local state, and the view throws that away the moment it unmounts. It is now a real preference, so the column and its direction stick: across leaving and returning to the view, and across quitting and reopening the app. It lands in config.toml as [view] asset_sort_order (name, used, type, size, or modified, each -asc or -desc), and it follows the View settings scope setting like the other view preferences, so it can be global or per-vault. (#473, reported by @rrpolanco)

  • The Filter button in the Database view no longer crashes the pane. Clicking Filter could take the whole view down with it. The button measured its own position from the click event inside a state updater, but React clears a synthetic event once dispatch finishes and the updater can run later, so the measurement hit nothing and the crash took out the root. The position is now captured while the click is still being handled and passed into the updater, so the filter menu opens where it should, every time.


Keyboard-first and local-first, as always.

Don't miss a new zennotes release

NewReleases is sending notifications on new releases.