github ZenNotes/zennotes v2.29.0
ZenNotes 2.29.0: links land on the exact block, and workflows reach the self-hosted web app

6 hours ago

Block references now work end to end: follow, complete, embed, and trace [[Note^block-id]]. Typst math gains command completion, forwarding a task now takes its subtasks along, shows up once on the Tasks page instead of once per carry, and no longer needs an arrow key before Enter, Cloud sync makes durable progress through asset-heavy vaults, and workflows can be created and run from an updated self-hosted server. Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.

✨ New

  • [[Note^block-id]] goes to the block. (#601) Mark a line with ^an-id and following its link now scrolls there from clicks, Cmd/Ctrl-click, the gd motion, and the reading view. [[^id]] targets the current note. Typing ^ inside a wikilink lists the target note's ids with their block text, ![[Note^id]] embeds only that block (including a bullet's children), and Connections names the block a backlink reached for. The marker stays hidden as addressing metadata until your cursor enters its line. Standalone markers tag the block above, fenced code included; arithmetic and code examples are left alone. Obsidian's spellings work as-is ([[Note#^id]], [[#^id]], [text](Note.md#^id)), so a vault shared with Obsidian keeps its block links.

  • Typst commands complete inside math. (#604, by @flokchvtr) In a Typst note, type two letters of a command inside $…$, #math.equation, or a math fence to get completions for Greek letters, operators, arrows, sets, accents, functions, and text styles. Argument-taking commands insert editable snippets such as frac(a, b) and sum_(i=1)^(n), with a rendered preview in the picker. LaTeX and prose completion remain separate.

  • Enter forwards a task to the first matching note. (#600) The note picker now preselects its first filtered result, so type part of a note name and press Enter. Arrow keys, Ctrl+J/K, and Ctrl+N/P still move through results, and the picker now shows those shortcuts.

🐛 Fixes

  • Workflows work in the self-hosted web app and Docker image. (#608) The read-only message was an app limitation, not a bad :rw mount: the web bridge and server had no workflow mutation/run API. An updated server now advertises workflow support and provides protected create, edit, run, history, delete, and undo operations. Runs are transactional, reject notes changed since planning, roll back failed writes, recover interrupted runs, and keep their journal inside the vault. Older servers remain read-only until upgraded.

  • Forwarding a task takes its subtasks along. (#611) Forwarding moved only the parent line: the destination got a task stripped of its breakdown, and the indented subtasks sat orphaned in the source. The whole subtree now travels, at every nesting level. The destination receives a faithful copy of the block: completed [x], cancelled [-], and in-progress [/] subtasks keep their state, metadata tokens travel verbatim, and the nesting structure is preserved under the forwarded copy. In the source, open subtasks flip to [>] alongside the parent so moved work stops counting as live, while done and cancelled subtasks keep their state as the record's history.

  • A forwarded task is one task on the Tasks page, not several. (#610) Carrying a task across daily notes leaves a [>] record in each note, and two surfaces resurrected those records as live work: daily due inference stamped every record with its note's date, so the Forwarded group listed the same task once per hop with a different due date each time, and the calendar dotted every day the task had ever been carried through. Forwarded records are now exempt from due inference and stay off the calendar unless a due: is written on their line (that date is the author's and keeps its slot). Today, Upcoming, and the board were already clean, so each logical task now appears exactly once everywhere actionable work is listed. The Forwarded group remains as the collapsed record of where things went.

  • Cloud Sync checkpoints asset uploads instead of losing the whole batch to a timeout. Binary files are now uploaded one request at a time while text changes stay batched. If several images or GIFs exceed a request's time budget, every acknowledged upload remains progress for the next sync instead of the group being retried from the beginning. This fixes the reported case where 163 notes synced instantly without assets, one image worked, and four images repeatedly stopped at about 30 seconds.

  • Cloud settings recover when the network returns. If the page showed fetch failed while offline, reconnecting now reloads the account and vault state and clears the stale error automatically; sync did not need the same recovery because it was already able to continue.

  • Nix desktop launches with working GPU output. (#607, packaging) The wrapper now exposes libglvnd so ANGLE can load libEGL, and the conditional Wayland Ozone flag expands at runtime instead of reaching Electron as a literal string.

🧰 For contributors

  • Workflow preparation is shared across desktop and web, while the Go server owns safe-path validation, optimistic checks, transaction journals, rollback, undo, pruning, and recovery. Compatibility is capability-gated so current clients remain safe against older servers.
  • Cloud assets are isolated at the coordinator's mutation-batch boundary, preserving normal batching for UTF-8 content. Cloud settings refresh on the browser online event and remove the listener on unmount.
  • Forward-subtree carry lives in shared-domain (forwardTaskSubtreeAtIndex) and uses the same indented-block walk as the daily-note rollover, so the two carry mechanisms agree on what belongs to a task.

Local-first and keyboard-first, as always.

Don't miss a new zennotes release

NewReleases is sending notifications on new releases.