Releases: ZenNotes/zennotes
Release list
ZenNotes 2.16.0
ZenNotes 2.16.0
Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
✨ Features
-
Cancelled tasks:
- [-]for something you decided not to do. Alongside open[ ], done[x], and forwarded[>], task lines now recognize- [-]as a cancelled task (the Obsidian Tasks convention). In the editor it renders as a muted ✕ with the task text struck through, so a dropped task reads differently from a finished one at a glance. In the vault-wide Tasks view cancelled tasks collect into their own Cancelled group (kept out of Today/Done), and there's a one-key way to cancel the selected task: presscin the Tasks list, or run Cancel Task from the command palette. It round-trips as plain- [-]markdown, and the whole stack understands it: the editor, the Tasks view, thetasksCLI, the MCP server, and the self-hosted/web backend all parse and report the cancelled state. (#450, requested by @edwarsgts) -
Open a file from inside ZenNotes (
File → Open File…, ⌘O). You can now open a one-off.mdfile that isn't part of your vault without leaving the app: File → Open File… on macOS (⌘O), or the "Open File…" command in the command palette on any platform, pops a native file picker. Pick a file and it opens the same way the Finder "Open in ZenNotes" entry does — as a note if it lives inside a vault you have open, otherwise in its own standalone editor window. Great for quickly reading or proof-reading a stray markdown file. (#449, requested by @rrpolanco) -
Auto-pair brackets and quotes as you type. A new Settings → Writing → "Auto-pair brackets and delimiters" toggle makes the editor insert the matching closer for
[],(), and{}while you type: it wraps a selection when you have one, skips over a closer that's already there, and deletes both halves when you backspace an empty pair. Quotes (""/'') pair too, but only inside inline code and fenced code blocks by default (so ordinary prose and contractions likedon'tare left alone); a second toggle turns on quote-pairing in prose if you want it. In Vim mode it only applies in insert mode. It's on by default and fully configurable, and the choice persists toconfig.toml. (#456, contributed by @AydenGarza in #457) -
Task metadata is color-coded in the editor. Priority markers (
!high/!med/!low), due dates (due:YYYY-MM-DD), and@fields(@waiting,@key:value) now get the same at-a-glance cues in your source notes that the Tasks view already shows, so the important bits pop instead of blending into the task text. Priorities are colored (red / amber / blue), due dates render as a small chip that turns red when overdue (past due and the task still open) and stays neutral-blue otherwise, and@fieldsget a muted chip. It updates live as you type and edit, and it's purely visual, the markdown you wrote is untouched. (#tagswere already styled; this brings the rest of the metadata up to match.) (#454, requested by @uNyanda) -
Forwarded tasks land under your
## Tasksheading. When you forward a task to a note that already has a## Taskssection, the copy is now slotted at the end of that section (right after the existing tasks, before the next heading) instead of being dropped at the very bottom of the note. Notes without a## Tasksheading keep the old behavior and append to the end. This applies both to forwarding a single task with Forward Task to Note… and to the automatic roll-over of unfinished tasks into today's daily note, so a sectioned daily note stays tidy without manual reshuffling. The heading match is exact ("Tasks", any level, and it ignores a## Tasksline inside a code block). (#452, requested by @uNyanda) -
Filter database rows by multiple fields, with AND or OR. Databases get a proper filter editor: a Filter button in the toolbar (with a count of active filters) opens a popover where you add
field · condition · valuerows and choose whether rows must match all of them (AND) or any of them (OR). Operators adapt to each field type (is / is not, contains, greater than, before/after, is empty, is checked, and so on), and the value input becomes a dropdown for select fields or a date/number/text box otherwise. It works in the Table and Board views, and your filters (including the AND/OR choice) are saved with the database. So you can ask for "Priority is High and Status is In Progress" to find urgent unstarted work, or "Status is In Progress or Priority is High" to see everything active alongside anything urgent. (#394, requested by @naingyeminn)
🐛 Fixes
-
The outline no longer invents a heading from your frontmatter. When a note's frontmatter had no blank line before its closing
---, the outline read that---as a Setext-style H2 underline for the line above it, so a note liketitle: Testovertype: Testshowed a phantomtype: Testheading in the outline panel. The parser now skips the whole leading frontmatter block before it looks for headings, so only your real headings appear. Because the same parser also powers the outline palette,[[#heading]]link resolution, and wikilink navigation, those stop matching the phantom heading too. This is the outline-side companion to the v2.15.0 fix that stopped the same frontmatter from rendering as a giant heading in the editor. (#442, reported by @stevecopley) -
The "New Drawings, Databases & Tasks" location settings stick now. Setting a default location for new task files did nothing: on the self-hosted/web build the server dropped all three location settings on save, and on the desktop the tasks location specifically was dropped, so the control snapped back and every new task landed in the inbox regardless of your choice. The settings now round-trip on both the desktop and the server, so a new task (or drawing, or database) is created where you set it. Task detection itself was never affected: a note tagged
tags: [task]shows up in the Tasks view either way. (#446, reported by @wedgen) -
Links inside table cells follow in Edit mode. A
[[wikilink]]or[text](Note.md)placed inside a table cell only revealed the cell's raw source when you clicked, Cmd/Ctrl-clicked, or pressedgdon it, while the same link outside a table (and in Preview) navigated fine. Table cells now follow links the same way the rest of the editor does: a plain click follows a rendered link, Cmd/Ctrl-click always follows, andgdfollows the link under the cursor, for both wikilinks and Markdown links, in Vim and non-Vim mode. (#445, reported by @samaniegoluis) -
A long tag list no longer overflows the Tags view or hides the sidebar's scroll. With a lot of tags (say 30+), the main Tags tab had no scroll region for its tag list, so the tags grew straight past the bottom of the window and pushed the matching notes off-screen entirely. The tag list is now capped and scrolls on its own, with the matching notes in their own scroll area below it. In the left sidebar the tag list already scrolled with the rest of the sidebar, but its scrollbar (a near-black thumb at low opacity) was effectively invisible on a dark sidebar, so the list looked cut off; the sidebar's scrollbar now uses the sidebar's own text color, so it's clearly visible in both light and dark themes and it's obvious the list scrolls. (#451, reported by @naingyeminn)
Keyboard-first and local-first, as always.
ZenNotes 2.15.0
ZenNotes 2.15.0
Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
✨ Features
-
A whole note can be a task now, not just a checkbox. Tag a note's frontmatter with
task(tags: [task]) and the note itself becomes a task, with itsstatus,priority(high / normal / low),due,scheduled, andtagsliving in frontmatter while the body holds free-form detail. These "task files" show up in the Tasks List, Calendar, and Kanban right alongside the inline- [ ]checkboxes you already use, so both styles live in one vault. It follows the TaskNotes convention, so your vault stays interoperable with TaskForge and Obsidian. Quick-add one from the command palette (New Task, or New Task in Folder… to choose where it lands), the + New task button in the Tasks header, theakey in Vim mode, or the:newtask/:taskcommand — and:newtask Projects/Websitedrops it straight into a folder so multiple projects stay organized. New task files default to your configured tasks location (Settings → New Drawings, Databases & Tasks; the inbox by default), and the folder-picking options override that per task. Checking a task file off rewrites its frontmatter (status: doneplus acompletedDate) instead of a checkbox character, rescheduling from the calendar or moving its Kanban column updates the matching frontmatter field, and deleting one trashes the note. Frontmatter also reads more clearly across the app: property values now render at full text brightness with the keys as muted labels, so an all-frontmatter note like a task file no longer fades into the background. -
Turn a URL into a rich embed or bookmark, Notion-style. Drop a link onto an empty line (or use the Embed / Bookmark slash commands) and a small Paste as menu offers three choices: Embed a curated player (YouTube or Vimeo) in a sandboxed inline frame, a Bookmark card built from the page's title, description, thumbnail, and favicon, or keep it as a plain URL. Both render live in the editor and the reading view: the video plays inline, the card opens its link in your browser on click, and a hover Edit pill (or stepping in with
j/k) reveals the source to change the URL. The paste menu is fully keyboard-driven, in keeping with the rest of the app:j/kor arrows move the highlight, Enter picks, Esc dismisses, and it appears for bothCmd/Ctrl+Vand Vim'sp/P. Bookmark metadata is fetched by the desktop app with private-network and size guards; the web build falls back to a bare link card. -
Choose your math typesetter: KaTeX or Typst. A new Settings ▸ Editor ▸ Math renderer option lets you render
$…$and$$…$$math with Typst instead of the default KaTeX. Typst reads the blocks as Typst markup rather than LaTeX (so$ integral_0^1 x^2 dif x = 1/3 $and$ mat(1, 2; 3, 4) $render), and each note's math is written for whichever engine you pick. It applies in both the live editor and the reading view, block equations get the same paper-tinted card as KaTeX, and clicking a rendered block opens it for editing. The whole Typst toolchain is bundled and runs fully offline: the compiler, the renderer, and the New Computer Modern fonts ship with the app, so nothing is fetched from the network, and the output matches the classic Computer Modern look. KaTeX stays the default, so existing notes are untouched. (#428, requested by @satwikShresth) -
Relaxed
$$math delimiters, LaTeX-style. A new Settings ▸ Editor ▸ Writing ▸ "Relaxed$$math delimiters" toggle (off by default) lets a$$…$$display block render even when prose sits before the opening fence (The Gaussian integral: $$…) or after the closing fence ($$… — the Basel problem.), instead of requiring the$$to sit alone on its line. The surrounding text moves to its own paragraph in the reading view. It stays opt-in because a bare$$legitimately shows up in prose (prices, shell variables), so existing notes parse exactly as before until you turn it on. Reading view only for now; the live editor still shows the raw source for those shapes. (#434, requested by @Mitchman05) -
Markdown links can point at files outside your vault. A link like
[my script](~/.local/bin/build.sh)used to offer to create a note (~/.local/bin/build.sh.md); now it opens the file with your system's default app instead, after a quick confirmation. Works from the editor and the reading view, for~/…,file://…, and absolute paths. Vault notes, assets, and relative links are unchanged, and it is desktop-only (the web build has no filesystem access). (#424, requested by @cyperion) -
The status bar previews a link's target on hover. Move the pointer over any link (a Markdown link, an external file path, a URL, or a
[[wikilink]]) and its destination shows on the left of the status bar, browser-style, in both the editor and the reading view. -
Type to filter the table's action menu. Open a WYSIWYG table cell's action menu (with
mor right-click) and just start typing: the menu narrows to the items whose label matches your query, case-insensitive, with the match highlighted and a small header showing the query and how many items are left. Backspace widens it, Escape clears the filter before closing, Enter runs the highlighted match, andj/kstill move within the results. It mirrors the sidebar context menu, sodeljumps straight to the Delete actions. (#438, requested by @uNyanda) -
Nested tags, shown as a collapsible tree. Tags that share a
/-separated prefix (like#project/compilerand#project/website) now group into a collapsible tree in both the sidebar Tags section and the Tags view, instead of a flat list. An ancestor that isn't itself a tag (project, when only#project/compilerexists) becomes a grouping row with a rolled-up count. Nothing changed about how tags parse or filter:#project/compilerwas always a single tag, this is purely how the list is grouped for browsing. The sidebar renders tags as indented chips (real tags filled with#, grouping nodes a fainter chip) so they still read as tags rather than file rows; a disclosure triangle expands and collapses, clicking a leaf filters by it, andj/k/l/hnavigate the tree from the keyboard. Expand and collapse state is shared between the two surfaces and persists across restarts. It sits behind a new Settings ▸ Appearance ▸ Chrome ▸ "Nested tags (tree view)" toggle (default on); turn it off for the flat list of full tag names, and a vault with no nested tags renders as a flat tree either way. (#439, requested by @uNyanda)
🐛 Fixes
-
You can type a backtick again in the editor on macOS AltGr-style keyboard layouts. With a custom layout whose Option layer emits characters directly (common for Czech, Polish, German, and other ISO-layout users), the Option combo that produces
`inserted nothing in the editor, while working everywhere else. The stock CodeMirror completion keymap binds mac-onlyAlt-`(andAlt-i) to "open completion", which swallowed the keystroke. Those two bindings are now removed, so the characters type normally;Ctrl-Spacestill opens completion. Fixed across the main editor, Quick Capture, the template editor, and the reference pane. (#429, diagnosed by @vlcinsky) -
Vim
f/F/t/Tcan now find[and]. Pressing one of the find-character motions and then[or]did nothing: the cursor stayed put, Vim stayed in "find" mode, and your next keystroke jumped to that character instead. The brackets were being intercepted by the[b/]b(previous/next buffer) shortcuts before Vim could take them as the search target. Those shortcuts (andgt/gT) now stand down while Vim is mid-command, sof[,t],r[, and friends work as expected. (reported by Julie on Discord) -
Vim
f/t/rnow work inside WYSIWYG table cells too. In Vim mode, a table cell runs its own small modal editor (it's a rendered cell, not the main editor), and it had never implemented the find-character motions or replace-character: pressingf,t,F,T, or plainrin a cell in Normal mode did nothing. They're now implemented directly in the cell editor —f/F/t/Tfind a character,rreplaces the one under the cursor, and;/,repeat the last find — matching how they behave in the regular editor. (#435, reported by @uNyanda) -
Frontmatter no longer renders as a giant heading in the editor. When a frontmatter block's last line sat right against the closing
---(no blank line in between), the markdown parser tokenized it as a setext heading, so valid frontmatter showed with large heading typography in edit mode. Frontmatter now always renders as the compact metadata card it's meant to be, regardless of spacing before the closing fence. (#426, thanks to @junereycasuga) -
Vim
j/kcan no longer get stuck when word wrap is on. The display-linej/kmotion (which steps through soft-wrapped rows) is pixel-based, and on some setups — notably compositors using fractional display scaling — the underlying coordinate lookups can be imprecise enough that the motion fails to advance across a wrap boundary, leaving the cursor stuck even with lines still that way.j/know fall back to a logical-line step whenever the display-line move doesn't make progress, so the cursor always keeps moving. On setups where the pixel motion is accurate this changes nothing. (#423, reported by @uNyanda) -
Note tab titles no longer get clipped in Compact layout density. With Layout density set to Compact and Wrap note tabs off, the horizontal scrollbar under the tab bar was rendering much thicker than intended and slicing off the bottom of the tab titles. Two things were wrong: a stray
scrollbar-colorstyle quietly disabled the slim 6px scrollbar the tab bar was supposed to use (so it fell b...
ZenNotes 2.14.0
ZenNotes 2.14.0
Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
✨ New
- Hashtag autocomplete. Typing
#followed by a letter in a note now opens a dropdown of your previously used tags, ranked by match and how often you use them. Pick one with Tab, Enter, or a click to complete it. Suggestions skip code blocks and the tag you're already typing. (#410, requested by @ShowhyT)
🐛 Fixes
-
Template
{{date:…}}now accepts the same tokens as the daily/weekly note patterns. Tokens likeEEEE(weekday),ww(ISO week),yyyy, andddworked in the note directory/title patterns but did nothing in templates, which only understood moment-styleYYYY/DD/dddd. Templates now accept both, so the variables you set up for dated notes work verbatim in a template. (#411, reported by @sh0nuff) -
The calendar panel's "Week of…" header now has separate Day and Week open buttons. It previously had a single "Open note" button wired to the daily-note action, so it always opened the currently selected day's daily note even though its placement next to the weekly header implied it would open that week's note. The header now shows a Day button that opens (or offers to create) the selected day's daily note and, when Weekly notes are enabled, a Week button that opens (or offers to create) that week's weekly note. Each button has a tooltip naming the exact target (e.g. "Open weekly note (2026-W29)"). (#409, reported by @uNyanda)
-
Keyboard focus now returns to the editor after closing Settings or opening a task's source note. Closing the Settings window (Esc, the backdrop, or Done) and opening a task's source note from the Tasks view (Enter) left keyboard focus stranded, so Vim motions and typing did nothing until you clicked the editor or jumped panes. Both paths now hand focus back to the editor immediately. (#415, reported by @uNyanda)
-
Vim pane navigation from the Tasks/Tags view to the sidebar now transfers keyboard focus. Pressing
Ctrl+Wthenhfrom the Tasks or Tags view highlighted the sidebar but left keyboard input in the view, soj/kkept navigating the list. Focus now moves to the sidebar so its Vim motions work immediately, while the Tasks/Tags cursor stays put. (#412, reported by @uNyanda) -
Leader+Cis no longer shown in the leader hints where it can't open the Calendar. The calendar attaches to a note in the pane, so it can't open in the note-less Tasks/Tags views.Leader+Cused to be listed there but did nothing; the hint is now hidden in those contexts (and the command is hidden from the palette too), while it still toggles the calendar in a note as before. (#413, reported by @uNyanda) -
The Gray completed-task style now actually grays the text in the editor. With Gray (or Both) selected under Settings → Editor → Completed task style, completed tasks kept their normal color in the editor because the text sits inside a syntax-highlighted span that overrode the gray; only strikethrough showed. Gray now applies to the whole completed task, so Gray grays it and Both grays and strikes it. (#414, reported by @uNyanda)
-
Inline-format keyboard shortcuts now work in non-Vim mode. Cmd/Ctrl+B (bold), and the italic/code/strikethrough/highlight/math/link shortcuts, did nothing outside Vim mode even though they work inside it. They now work in both modes, matching the docs. The editor's right-click Highlight actions were also hardened to apply to the selection you had when the menu opened, so they can't be lost when the menu takes focus. (#416, reported by @UmmarJ)
-
Pressing
pwhile editing a table cell no longer dumps the clipboard into the document. With "Sync clipboard with Vim registers" enabled,pin a table cell was interpreted as the Vim paste command and pasted text into the note at a seemingly random position instead of typingpinto the cell. The Vim clipboard-paste shortcut now only acts in the main editor, not inside the table widget. (#417, reported by @uNyanda and by D. Hellinger)
Keyboard-first and local-first, as always.
ZenNotes v2.13.5
ZenNotes 2.13.5: editor and settings fixes
A small release. Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
🐛 Fixes
-
Code blocks opened inside a bullet list now indent and close correctly. Typing a fence right after a list marker (
- ```bash) and pressing Enter used to drop the next line to column 0, escaping the list item and breaking the block, and a manually typed closing```was mistaken for a new fence and got its own auto-inserted closing trio. The editor now recognizes a fence (or a$$math block) opened after a list or blockquote marker: it auto-closes the block and aligns the content and the closing fence to the fence's own column, so everything stays inside the list item. (#405, reported by @cyperion) -
Template and font dropdowns in Settings no longer get clipped by the window. In Settings → Vault → Periodic notes, the Daily/Weekly/Monthly template pickers always opened downward with a fixed height, so the Monthly template dropdown (the last setting) spilled off the bottom of the Settings window and its lower options could not be reached. Dropdowns now flip open upward when there isn't room below, and cap their height to the available space so they scroll instead of clipping. The font picker gets the same fix. (#407, reported by @uNyanda)
Keyboard-first and local-first, as always.
ZenNotes v2.13.4
ZenNotes 2.13.4: editor, sidebar, export, and command fixes
A small release. Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
🐛 Fixes
-
"New Note in Current Folder" creates the note in the active note's folder. The command was using the folder the sidebar happened to be browsing, which does not follow the editor when you switch tabs, so with notes open from several folders the new note landed in the wrong directory. It now creates the note in the folder of the note you are actually editing, falling back to the browsed folder only when nothing is open. (#403, reported by @uNyanda)
-
Autocomplete popups keep their
Ctrl+J/Ctrl+Knavigation, even if you remap pane switching onto those keys. If you moved the "focus pane" shortcuts ontoCtrl+H/J/K/L(a common Vim setup), the pane-switch handler was swallowingCtrl+J/Ctrl+Kbefore the open popup, so the slash menu, the[[link picker, and the callout[!type picker stopped responding to those chords. An open autocomplete popup now owns the keyboard: its navigation wins over the pane-switch shortcut, which resumes the moment the popup closes. (reported by Tornado300 on Discord) -
The
mcontext-menu hint no longer shows on date subfolders that had no menu. Under Daily Notes, Weekly Notes, and Monthly Notes, the year and month rows are a virtual grouping by date rather than real folders, so they have no context menu, yet the sidebar still displayed themshortcut hint next to them and pressingmthere did nothing. Themhint now appears only on rows that actually have a context menu (real folders and the top-level date folders), so the shortcut and its hint stay in sync. (#402, reported by @uNyanda) -
PDF export can now match your preview, CSS snippets and all. With "Use theme for PDF export" turned on (Settings → PDF export), the export used your theme but ignored your CSS snippets and color tweaks, so tweaks you made in the preview (hiding a callout's leading break, a
page-break-inside: avoidrule, and the like) were dropped from the PDF. The export now injects those same snippet and tweak layers, so the PDF matches what you see on screen. The clean light-for-print default (toggle off) still ignores them. (#401, reported by @IVII1)
Keyboard-first and local-first, as always.
ZenNotes v2.13.3
ZenNotes 2.13.3: editor polish (block-math navigation, reading-view parity, click accuracy, consistent heading markers)
A patch release: three fixes to the live math rendering that shipped in 2.13.2 (all found within a day of release) plus a heading-marker consistency fix. Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
🐛 Fixes
-
Vim
j/k(and the arrow keys) now step into rendered math blocks. A rendered$$…$$block is a single widget, and vertical cursor motion used to skip clean over it: only a mouse click could reveal the source, and on notes with several blocks the reveal-induced height changes compounded into multi-line jumps, freezes, and "double skips". Moving onto a block now reveals it and walks the raw LaTeX line by line, in both directions, then re-renders it when you move on. Counts (3j),gj/gk, operators, and movement over other widgets (tables, embeds) are unchanged. -
A closing
$$at the end of a content line now works in the reading view. The editor accepted a block ending incontent$$(and a whole$$x^2$$block on one line), but the reading view's parser only closes a block on a fence-only line, so those notes rendered in Edit and broke in Preview, swallowing everything after the block. The reading view now parses exactly the shapes the editor renders; notes already using canonical$$-on-its-own-line fences are untouched. (#399, reported by @ShowhyT) -
Mouse clicks land where you click, no matter how far you scroll. The math block widget carried vertical margins the editor cannot measure, so every rendered block above the pointer added a few unaccounted pixels: the deeper you scrolled in a math-heavy note, the further below your click the cursor landed. The widget now uses measurable padding, so click position and cursor position agree at any scroll depth.
-
Heading
##markers now reveal with the cursor anywhere in the heading. Headings were the one live-preview element that behaved differently: the marks only appeared when the cursor sat left of the first letter, while list bullets, quote marks, tasks, and inline formatting all reveal anywhere on the active line. The active heading line now reads as source like everything else, and the marks still hide when the cursor is elsewhere. (reported by Julie on Discord)
Also in this release: launching with ZEN_PERF=1 now prints a boot timeline (main.boot.module-loaded, main.boot.app-ready, and absolute uptimeMs on the window marks), so slow-startup reports, like a Linux AppImage taking a minute to first paint, can be pinned to the guilty phase from one terminal run.
Keyboard-first and local-first, as always.
ZenNotes v2.13.2
ZenNotes 2.13.2: Callout type picker, completed-task styling, temporary folder sessions, a sticky editor view mode, PDF page and search links, live math in the editor, plus Vim, Excalidraw, and split-view fixes
A small release: six features (a callout insert menu, completed-task styling, temporary folder sessions, a sticky editor view mode, deep links into PDFs, and live math rendering in the editor) and sixteen fixes. Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
✨ Improvements
-
Obsidian-style callout admonitions, with an insert menu. Turn a blockquote into a colored callout by starting its first line with
> [!type](optionally with a title:> [!warning] Heads up). Type[!inside a blockquote to open a type picker with an icon and description for each type — filter by name (aliases match too, sowarnfinds Warning andtldrfinds Abstract), move with the arrow keys or the Vim/Emacs completion chords (Ctrl+J/Ctrl+K,Ctrl+N/Ctrl+P), and accept with Enter, Tab,Ctrl+Y, or a mouse click. Callouts now render in six color groups: note / info / abstract (blue), tip / success (green), the new question / example (purple), warning (yellow), danger / bug / failure (red), and quote (gray); types are case-insensitive and an unrecognized one still renders as a neutral note, so callouts pasted from Obsidian keep working. The picker leads with the most common types, and Enter now accepts an open completion even inside a blockquote or list (previously the "continue the quote" key won). The/slash menu's Callout entry still works too. (requested by Philipp) -
Open a folder temporarily, without making it a vault. Drag a folder of markdown onto the ZenNotes window (or, once installed, the dock icon) to read and edit it in place as a temporary session. Its notes show recursively, edits save straight to the files, but ZenNotes writes nothing else into the folder (no
inbox/, no.zennotes/, noWelcome.md), never remembers it as a vault, and returns to your normal vault as soon as you close the window. Handy for skimming a docs or specs directory without committing to it. (Move to Trash and comments are disabled in a temporary session since both would write into the folder; on macOS the dock-icon drop needs a fresh install so Launch Services registers the folder type, while dropping on the window works right away.) -
Style completed tasks. By default, checking a task (
- [x]) just fills its checkbox. A new Settings → Editor → Completed task style can also strike the text through, gray it out, or both, so finished items visually recede in the editor and the reading view while the checkbox stays checked. There are matching command-palette entries (Completed Tasks: Strikethrough / Gray / Strikethrough + Gray / No Style). Nested sub-tasks keep their own state — a completed parent never strikes an unchecked child — and formatting like bold or[[wikilinks]]inside a done task is styled along with the rest. Defaults to off, so existing notes look unchanged until you opt in; the choice travels with your other portable prefs inconfig.toml. (requested by Philipp) -
Keep the editor view mode when switching notes. Normally each note remembers whether you last had it in Edit, Split, or Preview and reopens that way, so clicking from a note you were reading in Preview into another one drops you back into Edit. A new Settings → Editor → Writing → Keep view mode when switching notes makes the current mode stick instead: switch to Preview once and every note you open stays in Preview (likewise for Split or Edit) until you change it. Off by default, so the per-note behavior is unchanged unless you opt in; the mode is tracked per pane, and the toggle travels with your other portable prefs in
config.toml. Handy if you mostly read rather than edit. -
Link straight to a page or search term inside a PDF. PDF links and embeds can now carry a URL fragment that passes through to the built-in PDF viewer, so
[Spec](spec.pdf#page=12)opens the PDF at page 12 and[Install](guide.pdf#search=installation)opens it with "installation" highlighted. Combine them (guide.pdf#page=5&search=term) or set#zoom=. It works everywhere a PDF appears: inline embeds, the standalone PDF card's inline and pinned reference views, and Cmd/Ctrl+click in the editor. Point a note at the exact page of a spec instead of copying the context into the note. (closes #295, requested by @Lejhin) -
Math renders live in the editor, not just the reading view. Inline
$…$and block$$…$$LaTeX now render as formatted KaTeX directly in the Edit and Split views, matching what the Preview already showed. Put the cursor on a formula and it reveals the raw source so you can edit it, then re-renders once you move away. Everyday dollar signs are left alone in both the editor and the reading view: currency like$5 and got $10and math inside inline code stay literal (the reading view used to render that as a formula), so only real formulas render. (reported by Julie on Discord)
🐛 Fixes
-
Dropped files now land in
assets/instead of the vault root. Dragging a file into a note copied it to the vault root, while pasting an image put it in the unifiedassets/folder — so in Vault Root mode a dropped image was dumped right next to your notes, inconsistent with paste. Drag-drop now usesassets/too, matching paste in both Inbox and Vault Root mode. Existing links are untouched. (#377, reported by @Orcolom) -
Drag images, PDFs, and other attachments between folders in the sidebar. Notes, folders, and drawings could be dragged to a different folder, but assets were silently ignored on drop — you could only move them via the row's "Move…" menu. Dropping an asset on a folder now moves the file into it, so attachments drag just like notes (context menu still works too). (#378, reported by @Orcolom)
-
Remote/web vaults: recoloring folders and moving or renaming attachments now work. On a server-backed vault, three things the desktop app supports were quietly missing: recoloring a folder didn't stick, and images couldn't be moved or renamed. Folder colors now persist (the server was dropping them on every save, including through folder rename, delete, and duplicate), and new server endpoints let the web app move assets between folders and rename them, matching desktop. Duplicating, deleting, and pasting clipboard images for assets remain desktop-only for now. (#379, reported by @Orcolom)
-
Table editor: the add-row / add-column buttons no longer sit on top of the table. In the live-preview table widget, the hover + rails for adding a row or column were pinned to the grid's exact edge, so each one overlapped the last row and column. They now sit just outside the table in the surrounding margin, so nothing is obscured (add-row / add-column still work, and a stray vertical scrollbar the reposition briefly introduced is gone too). (#382, reported by @cyperion)
-
Moving a note to Trash no longer risks closing all your open tabs. A background note-list refresh pruned any open tab whose note wasn't in the freshly-listed notes, so if that list ever came back incomplete for a moment (seen when trashing a note on Linux) every tab could close and drop you on the home screen. The refresh now refuses to close every open note tab at once; genuine deletions still close their own tab. (#384, reported by @simotare)
-
Vim: pane navigation now works from the Calendar panel. With focus in the Calendar panel, the Vim pane-focus shortcuts (
Ctrl+W h/j/k/l) did nothing, so you had to use the mouse to move to another pane — the panel's ownh/j/k/lday navigation was swallowing the keys. The panel now hands the pane prefix (and its follow-up direction) off to pane navigation, exactly like the other keyboard-driven surfaces, while bareh/j/k/lstill move between days. (#374, reported by @uNyanda) -
Vim:
Ctrl+Iin normal mode now moves forward in the note-history jumplist again, instead of inserting**. On Linux and Windows the editor's italic shortcut (Mod+I, whereModisCtrl) collided with theCtrl+Ijumplist binding, and the formatting handler was winning, soCtrl+Ityped the italic markers rather than navigating. The jumplist (Ctrl+Oback /Ctrl+Iforward) now takes priority in normal and visual mode, while insert mode still toggles italic. macOS was never affected, since thereCtrl+IandCmd+Iare distinct. (#373) -
Excalidraw: changing a text element's font now works in the web version. In the self-hosted web build, picking a hand-drawn font (Excalifont, Comic Shanns, and so on) had no visible effect. Excalidraw pulls those fonts from the esm.sh CDN by default, which the server's content-security policy (
font-src 'self') blocks, so the woff2 files never loaded and the selection did nothing. The fonts are now bundled and served from a same-origin/excalidraw-assets/path that the existing policy already allows, and the server sends the correct web-font MIME types. This is the web counterpart of the desktop #324 fix (desktop already self-hosts the fonts). (#324) -
Kanban columns: renaming is clearer, and you can reorder columns. On a field board (Custom status or any
@key), renaming a column only ever changed its display label, with nothing to show the label wasn't the stored value, so moving a card into a renamed column looked like it should change the value but didn't. A renamed column now shows its underlying@field:valuebeneath the name, so the label can't be mistaken for the value. You can also reorder the columns themselves now, by dragging a column header or pressing</>with a column focused (saved per board; the "No value" bucket stays last), instead of renaming columns to fake an order. And renaming that "No value" bucket finally sticks across a restart. (#389, reported by @uNyanda) -
**Vi...
ZenNotes v2.13.1
ZenNotes 2.13.1: native Fedora / RHEL / openSUSE packages
A packaging-only release: same app as 2.13.0, now with a native
.rpm. Installers for macOS, Windows, and Linux (x64 + arm64) are attached below.
📦 Packaging
-
Native
.rpmfor Fedora, RHEL, and openSUSE: every release now ships a native RPM for both x64 (x86_64) and arm64 (aarch64), alongside the existing.deb,.pacman, AppImage, and.tar.gz. Fedora users no longer need to fall back to the AppImage:sudo dnf install ./ZenNotes-2.13.1-linux-x86_64.rpmThe package installs to
/opt/ZenNotes, adds azennoteslauncher and desktop entry, and sets the chrome-sandbox permissions on install, matching the.deb.
There are no application changes since 2.13.0.
Keyboard-first and local-first, as always.
ZenNotes v2.13.0
ZenNotes 2.13.0 — inline Excalidraw drawing embeds, PDF export confirmation, and a tidier Settings
Installers for macOS, Windows, and Linux (x64 + arm64) are attached below once the build finishes. On macOS,
brew install --cask zennotes/tap/zennotes; on Arch,yay -S zennotes-bin.
✨ Improvements
- Embed Excalidraw drawings inline in your notes: reference a
.excalidraw(or Obsidian.excalidraw.md) drawing with the wikilink embed syntax and it renders inline as an image, in both the editor's live preview and the reading view —![[diagram.excalidraw]], or sized with![[diagram.excalidraw|600]]/![[diagram.excalidraw|600x400]]. Click an embedded drawing to open it in its own Excalidraw tab, or right-click it for a drawing menu — Open drawing, Open in split, Copy image, Copy embed, and Reveal in File Manager. The command palette gains New Drawing, Embed Existing Drawing… (a searchable picker), and Embed New Drawing (create, insert an embed at the cursor, then open it). Previews are exported at 2× and cached so they stay crisp and fast, refresh when the drawing changes, and follow your light/dark theme so a drawing never shows a white box in a dark note. (#276, #278, thanks @junereycasuga) - Confirmation after exporting a note to PDF: exporting used to give no feedback, leaving you unsure whether it worked. Now a small toast appears in the bottom-right after a successful export with a "Show in folder" button that reveals the saved PDF in your file manager, and it auto-dismisses after a few seconds. If an export fails, an error toast explains why and stays until you dismiss it (replacing the old blocking alert). (#257, requested by @ShowhyT, implemented by @wholetthekfcgo in #361)
- New theme — Kanagawa Paper Ink: a muted Kanagawa dark variant (ported from kanagawa-paper.nvim) with a custom very-dark-purple canvas for focus. Find it under Settings → Appearance → Kanagawa → Paper Ink. (#365, thanks @Kamyil)
- Choose where new drawings and databases are created: they no longer always land in the root of your vault. A new Settings → Vault → Notes → New Drawings & Databases section lets you place each (independently) in your primary notes area, in the active note's folder, or in a specific vault-relative subfolder you pick (e.g.
assets/drawings). The choice is saved per vault and applies everywhere a drawing or database is created: the sidebar buttons, the command palette, and the home view. (#362) - Turn off the blinking cursor: a new Settings → Editor → Blinking cursor toggle keeps the caret solid instead of blinking, for anyone who finds the blink distracting or prefers a steady cursor (matching the macOS "Prefer non-blinking cursor" accessibility setting). It applies to both the insert-mode caret and the Vim normal-mode block cursor, live, and persists per device. (#160)
- Tidier Settings: the Vault tab's overloaded "Notes" sub-tab is split up. Daily, weekly, and monthly notes plus the calendar now live in their own Periodic notes sub-tab, "Notes" keeps just note organization, and the folder-label sub-tab is renamed Folders (was "System"). Each sub-tab now shows its own accurate header, and two settings moved to where you'd expect them: Scroll offset (Vim
scrolloff) and Time format now sit under Editor instead of Typography.
🐛 Fixes
- Excalidraw drawings follow your light/dark theme, including custom themes: a
.excalidrawdrawing used to ignore the active theme and render light whenever you were on a custom theme. It derived its light/dark mode by looking your theme up in the built-in themes list, and a custom theme's id isn't in that list, so the lookup quietly fell back to light. Drawings now read the app's resolved mode directly (the samedata-theme-modethe rest of the UI uses), so a custom theme that declares dark mode renders dark, and an open drawing updates live when you switch themes or your OS dark mode changes. (#363, thanks @Kamyil) - The calendar panel's task list stays in sync with your daily note: with the calendar panel open and the Tasks view closed, checking a task in your daily note (or adding a new one) did not update the panel's weekly task list, so completed tasks lingered and freshly added ones were missing until you opened the Tasks view. The panel refreshed its tasks only while a Tasks view was on screen; it now refreshes as you edit the note whether or not the Tasks view is open. (reported by Philipp)
- Opening a daily note drops you straight into it: with Vim mode on, using
<leader>d(or the command / calendar) to open or create a daily note left focus on the selected sidebar item, so pressingidid nothing and you had to click into the note first. It only seemed to work when focus already happened to be in the editor. Opening a daily, weekly, or monthly note now lands focus in the editor in normal mode, soistarts insert right away. (reported by Philipp) - Strikethrough now crosses out math: wrapping a formula in
~~…~~(like~~$a^2 + (2k+1)$~~) crossed out the surrounding text but left the rendered KaTeX untouched, because a formula renders as an inline block that a normal strikethrough line does not paint across. Struck math now shows a line through the formula in the current text color, matching struck text, everywhere rendered markdown appears (reading view, hover previews, comments, note embeds, and PDF export). (#359, thanks @LognanLi)
Keyboard-first and local-first, as always.
ZenNotes v2.12.0
ZenNotes 2.12.0 brings custom Kanban boards for any inline task field, a two-way Vim clipboard, one-move tag-filter clearing, and a batch of keyboard and drawing fixes.
Installers for macOS, Windows, and Linux (x64 + arm64) are attached below once the build finishes. On macOS,
brew install --cask zennotes/tap/zennotes; on Arch,yay -S zennotes-bin.
✨ Improvements
- Custom Kanban statuses, and a board for any task field: the Tasks Kanban can now group by a workflow you define, not just the built-in due-date buckets. Tag tasks with an inline
@status:<id>token (like- [ ] Ship it @status:review) and the new "Custom status" board sorts them into your columns. Set the columns and their order in Settings → Tasks (no config editing) or inconfig.tomlunder[view]askanban_statuses = ["backlog", "in_progress", "review", "done"]. It generalizes to any inline field: use@sprint:24,@area:backend, or any@key:value, and each key auto-appears as its own board with a column per value, no setup needed. Everything is keyboard-first:gcycles the group-by,Shift+H/Shift+Lmove the focused card between columns (rewriting the token), and drag works too. A note'sstatus:frontmatter sets a default for its tasks. (#354, thanks @dwarjie) - Clear selected tag filters in one move: in the Tags view, selected tags accumulate as you click, and clearing them used to mean picking off each chip's ×. Now there is a "Clear all" button in the header, the
ckey (and:clear) wipes the whole selection at once, and right-clicking a selected chip offers Deselect, Unselect others (keep just that one), and Clear all tags — the same actions are on the sidebar tag menu too. The tag strip was tidied up along the way, with the selected chips and the tag picker on their own rows. (#356, thanks @MrClyfar) - Vim
ppastes from the system clipboard: the Vim clipboard setting used to be one-way,y/d/c/xcopied out to the system clipboard, butponly ever pasted Vim's own register. It is now two-way and renamed "Sync clipboard with Vim registers" (Settings → Vim): with it on,pandPpaste whatever is on the system clipboard, so text copied in another app drops straight into a note in normal or visual mode. Counts (3p), linewise pastes, and visual-mode replace behave like normal Vim; insert mode, Vim off, and Ctrl/Cmd chords are untouched. (#357, thanks @philippswoboda)
🐛 Fixes
- CircuiTikZ diagrams render on desktop again: a
tikzblock using CircuiTikZ (for example\begin{circuitikz}with\ctikzset) used to load forever or crash, most visibly on Linux. The TikZ WebAssembly engine has a fixed memory pool, and ZenNotes was always pre-loading the heavypgfplotspackage for every diagram, leaving no room for large packages likecircuitikz.pgfplotsnow loads only when a block actually uses it (pgfplots/axis/plot), andcircuitikzis auto-detected and loaded, so circuit schematics render out of the box. Plots are unaffected. (#349, thanks @kuyacarlo) - Backspace inside a highlight deletes one character, not the whole run: with the cursor inside
==highlighted==text, pressingBackspaceused to delete every character back to the start of the highlight (or wipe the whole phrase from the end), leaving the markers behind. It now deletes a single character like anywhere else. The inner text of a highlight was mistakenly treated as one indivisible unit by the editor; only the hidden==markers are now, so the text stays fully editable. Works in Vim and non-Vim mode. (#351, thanks @uNyanda) - Shortcuts and Vim keys keep working after the app sits idle: after roughly ten minutes untouched, usually once the display had slept, pressing
Cmd/Ctrl+.(Zen mode) would type a literal.into the note instead of toggling, and Vim keys stopped responding, until you opened Settings and pressedEscape. Chromium was freezing the idle editor window to save power, which halts every bit of the renderer's key handling, so both the app's shortcut handler and CodeMirror's Vim keymap went silent while typed characters still fell through as plain text. Editor windows now opt out of that background freezing, and the app re-grabs editor focus on its own when the window wakes, so shortcuts and Vim keep working without the Settings-and-Escape dance. (#350, thanks @SandeepKumarKuanar) - Closing a focused pane returns keyboard focus to the editor: with Vim-style pane navigation, focusing the sidebar and then hiding it (
Cmd/Ctrl+1or Leader E), or closing the Tasks or Tags view with:q, used to leave keyboard focus stranded on the pane that just disappeared. The open note would not accept typing until you moved focus back with a pane command or clicked the editor. Focus now snaps back to the editor automatically the moment a focused pane closes, so you can keep typing without the extra step. Hiding the sidebar while you are already editing still leaves your cursor in the note. (#353, thanks @uNyanda) - Exporting a drawing as PNG or SVG writes the file again: in a drawing, "Export image → Save to disk" would show the save dialog, then fail the moment you picked a location with a
createWritable"not allowed" error, leaving a 0-byte file. Excalidraw's export uses the browser File System Access API, whose write is gated on afileSystempermission that the app's locked-down renderer allowlist (tightened alongside the clipboard fix) was denying. The native picker was never blocked, only the write. That permission is now granted for the app's own, user-initiated saves, so PNG and SVG exports write real files again. (#355, thanks @naingyeminn)
🔒 Security & maintenance
- More resilient Linux release builds: the release workflow now drops the GitHub runner's pre-configured Microsoft/azure apt repositories before installing Linux packaging tools, so an intermittently broken upstream
InReleasefile can no longer fail the Linux installer build.
Keyboard-first and local-first, as always.