Skip to content

ZenNotes 2.30.0: Atlas, your vault as a map

Latest

Choose a tag to compare

@github-actions github-actions released this 18 Aug 23:18
· 1 commit to main since this release

New in this release: Atlas, the whole vault drawn as a stable map of notes and links, in 2D or 3D, on by default. Plus the Tasks filter now works everywhere: one query narrows the list, the calendar, and the Kanban board, and it understands @key:value fields, so @project:alpha on the status board is a one-project Kanban. Opening a note with the mouse now hands you the keyboard, and the in-progress [/] box is clickable on every surface without ever losing its state. Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.

✨ New

  • Disabling the quick-capture hotkey now sticks across restarts. (#615) The disabled state persisted, but startup re-registered the default shortcut anyway, which on GNOME Wayland popped the system's keyboard-shortcuts dialog on every launch. A disabled hotkey now registers nothing. How to test locally: disable the hotkey in Settings, relaunch, and the shortcut stays unbound.

  • Live Preview off now means plain markdown. (#616) With the toggle off, frontmatter shows as raw --- lines instead of the properties card, and clicking inside a [label](url) places the cursor for editing instead of opening the link (Cmd/Ctrl+click still follows, and gd is unchanged). With Live Preview on, everything renders exactly as before. How to test locally: switch Live Preview off in Settings, open a note with frontmatter and a link, and click into the URL to edit it.

  • Markdown links to notes with spaces render like links. (#617) [text](My Note.md) used to collapse the label but leave the raw (My Note.md) trailing beside it, because the markdown parser rejects spaced destinations while ZenNotes' navigation accepts them. Rendering now matches navigation: the whole link collapses to its label, and the cursor inside it reveals the full source. How to test locally: link to a note whose filename has a space, click away, and only the label remains; gd still opens the note.

  • Atlas: the vault as a map. The answer to years of "add the Obsidian graph" requests, built the way ZenNotes does things instead. Every note is a point sized by how linked it is, every wikilink (and markdown-style note link) a line, regions come from your top-level folders, and the layout is computed once and frozen, so the map stays a place you know: new notes land beside what they link to and nothing else ever moves. Press v to switch between the flat map and a 3D sky you can fly through; lenses 1..4 recolor it to answer questions (structure, heat, orphans, bridges); f hint-jumps to any note; Enter opens it. Fully keyboard-first (Space g opens it, Ctrl+W walks in and out) and fully themeable: custom themes can restyle it with --z-atlas-bg and --z-atlas-region-1 through --z-atlas-region-8. On by default, with a switch under Settings → Atlas; Obsidian vaults render without any migration and Atlas never writes into the vault. How to test locally: launch, press Space g (or click Atlas in the sidebar), then f + two letters to jump, v for the sky, 2 for heat.

  • A Math size slider. (#623) Settings → Editor → Math size scales inline $…$ and block $$…$$ math from 50% to 200%, in the editor and reading view, for both KaTeX and Typst; stored as math_font_scale in config.toml. How to test locally: open a note with math and drag the slider to 150%.

  • The Assets row's m shortcut opens a real menu. (#621) Assets showed the m hint like every sidebar row but had no menu behind it. It now opens one: Open Assets, plus sort by name, type, size, last modified, or times used, with the active field flipping direction on re-pick, persisted like the Assets view's own sort. How to test locally: focus the sidebar, cursor onto Assets, press m.

  • [b and ]b take counts. (#622) 3]b walks three tabs forward and 2[b two back, Neovim-style, wrapping at the ends; without a count both still move one tab. Works with the editor focused and from anywhere else, and {count}gt keeps vim's absolute go-to-tab-N jump. How to test locally: open a few tabs and press 3]b.

  • Workflows now work on remote vaults in the desktop app. (#618) The desktop app connected to a self-hosted server previously showed Workflows as read-only; it now delegates everything (create, edit, run, undo, run history) to the server's journalled workflow API from 2.29, with runs prepared client-side and applied transactionally on the server. Older servers without the API stay safely read-only, so update the server too. How to test locally: connect the desktop app to a server, open Workflows, and create and run one; the files and run journal live on the server.

  • Cmd+N creates a note in the current folder. (#614) The palette's "New Note in Current Folder" is now a real, rebindable shortcut (Settings → Keymaps), default Cmd+N / Ctrl+N. It creates in the folder of the note you're editing (or the folder you're browsing when nothing is open) and focuses the title. How to test locally: open a note in any folder, press Cmd+N, and the new note lands beside it.

  • One filter across the list, the calendar, and the Kanban board. (#222, discussion #583) The filter box in the Tasks header now stays with you in all three sub-views, and the query survives switching between them: filter the list, press 3, and the board shows the same slice. Press / to focus it (Vim mode), type :filter <text> in the ex line (:filter alone clears), or just click in and type; Esc clears from anywhere in the view. Matching covers the task text, the note title, tags (with the #, so #launch reads the way it does in a note), !high-style priorities, and, new to the filter, inline @key:value fields. That last one is the project trick: tag tasks with @project:alpha, keep the board grouped by status, filter @project:alpha, and you are looking at that project's board and nothing else. The header counts along (3 of 12) so you always know how much the filter is hiding.

  • A filtered board keeps its shape, and your hand-made order. Filtering the Kanban narrows cards, never columns, so the board's structure holds still while you type instead of columns blinking in and out. The board stays fully live under a filter: drag cards, Shift+H/L them between columns, reorder inside a column. Hand-arranged card order is preserved for the cards a filter is hiding; a drag on a filtered board can no longer silently discard the arrangement of what you cannot see.

🐛 Fixes

  • Opening a note with the mouse hands you the keyboard. (discussion #599) Clicking a note in the sidebar or the notes panel opened the note but left keyboard focus on the clicked row, so typing went nowhere and j/k kept driving the sidebar. Every keyboard opener (quick open, Enter on a sidebar row, gt, hint mode) already handed focus to the editor; the mouse now does the same. Since ZenNotes already remembers your cursor position per note, a click lands you exactly where you left off, ready to type.

  • The in-progress [/] box is clickable, and the state survives the board. (discussion #599) The half-filled in-progress box was a drawing, not a control: clicking it did nothing in the editor, and the reading view had nothing to click at all. It is now a real checkbox on both surfaces, and clicking checks the task off, the same [/] to [x] the toggle command performs. Forwarded [>] and cancelled [-] markers stay deliberately inert: they are records of a decision, not live work. Two lossy paths are fixed with it: dragging an in-progress card between live Kanban columns silently erased the / (an "unchecked" write collapsed it to open), and the MCP/CLI task toggle flipped [/], [-], and [>] all back to open. Both now follow the app's rules: in-progress checks off to done, records stay put.

  • The keyboard survives the filter box (and any click) in the Tasks view. Before this release, touching the list's filter box and pressing j walked the sidebar instead of the task list, and after any click on a card or column, the view-switch keys (1/2/3), /, and : went dead until the tab was re-opened. Any interaction inside the pane was handing keyboard ownership to the editor surface, and the Tasks view's keys fell through to global navigation. The Tasks view now keeps claim of its own keys for clicks and focus anywhere inside it.

🧰 For contributors

  • Task toggle semantics are now identical in shared-domain (toggleTaskAtIndex), the MCP server, and the zn CLI (which reuses the MCP implementation): open and done flip, [/] checks off, [>]/[-] are untouched, and an uncheck never collapses [/] to open.

  • filterTasks in app-core is the single matching predicate for all three views; it now also matches reassembled @key:value tokens (they are stripped from display content) and hash-prefixed tags.

  • The Kanban builds unfiltered columns first and derives the visible board from them. Card-order persistence walks the unfiltered columns and resolves the drop index against a visible anchor card, so persisting a board arrangement under a filter cannot prune hidden cards.

  • Panel-style views must re-claim focusedPanel on their root (onMouseDownCapture/onFocusCapture): the pane's outer capture handlers claim 'editor' for any interaction, and outer capture runs first, so the view's inner claim wins. TasksView does this now; TagView and Quick Notes have the same latent pattern.


Local-first and keyboard-first, as always.