This release adds 6 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
Summary
AI summaryBroad release touches Also in this release, ✨ Highlights, ⬆️ Upgrade notes, and macOS.
Full changelog
ZenNotes 2.9.0 — make it yours: author full CSS themes, layer quick overrides on top of any theme, or just recolor and resize with no‑code Quick tweaks — plus a built-in guide + element inspector to make it easy.
Installers for macOS, Windows, and Linux are attached below once the build finishes. On macOS,
brew install --cask zennotes/tap/zennotes; on Arch,yay -S zennotes-bin.
✨ Highlights
Bring your own theme (custom CSS themes)
ZenNotes themes are now real CSS you author. Settings → Appearance → Custom → New theme scaffolds a folder (~/.config/zennotes/themes/<name>/ with a manifest.json + theme.css), reveals it, and adds a card you click to apply — edits apply live, no restart. Only the active theme's CSS is loaded, so you write unscoped selectors: :root { … } for light/shared values and :root[data-theme-mode="dark"] { … } for dark — you never put the theme name in a selector. Colors are the app's --z-* design tokens written as space‑separated RGB (--z-accent: 255 59 48;), and you can bundle fonts or images right beside theme.css and reference them with the offline‑only zen-theme://<folder>/file scheme (remote URLs are never loaded, so a theme stays self‑contained).
Overrides — change one thing on any theme
The new Overrides layer (Settings → Appearance → Overrides) is for small tweaks you don't want to fork a whole theme for: drop a .css file and toggle it on, and it layers on top of whichever theme is active. Love Catppuccin Mocha but want a redder accent? :root[data-theme] { --z-accent: 255 59 48; } re‑skins every theme in one line. Overrides stack, persist across restarts, and apply live. A seeded example.css cookbook lists every token with ready‑to‑uncomment recipes.
Quick tweaks — recolor and resize without touching CSS
Don't want to write any CSS? Settings → Appearance → Quick tweaks is a small panel of controls that layer on top of whichever theme is active — and update a live preview right in the window as you adjust them:
- Colors — pick the accent and the six syntax/diagnostic hues with a swatch; the pickers track the theme you're on.
- Density — a Compact / Default / Comfortable toggle that scales the editor tab strip and the sidebar / note‑list rows together, for a tighter or roomier interface.
- Corners — Square / Default / Rounded, squaring or softening every corner in the app at once.
Every pick is saved to ~/.config/zennotes/config.toml under [tweaks], so it travels with your dotfiles like everything else.
A built-in guide and an element inspector
Customizing is documented end to end — an in‑app Help → How‑to guide (themes vs. overrides, the full --z-* token reference, manifest.json, bundling fonts/images) and a dedicated Custom themes & overrides page in the online docs. And a new Developer tools button in the Overrides section opens the inspector so you can hover any element and find the exact token or class to change — available in shipped builds, not just development.
Also in this release
- Vim: in visual mode the arrow keys now extend the selection just like
h/j/k/l— previously they moved the caret and collapsed the selection. Insert‑mode and non‑Vim arrow behavior is unchanged. (#287) - Calendar: the calendar panel is now reachable from the keyboard — it joins the pane‑focus cycle (the same keys that move between the explorer, notes, and editor), and
<leader>copens and focuses it. Once focused,h/j/k/l+ arrows move the day,[/]change months,Enteropens it, andEscapereturns to the editor. (#285) - Daily notes: the "Tasks are due on the note's date" and "Roll over unfinished tasks to today" toggles now save correctly — they previously reverted the instant you flipped them. (#288)
- Vim:
j/know move by visual line through soft‑wrapped text (like the arrow keys andgj/gk) instead of skipping the wrapped part to jump to the next logical line. Operators (dj/yj) and line‑wise visual (Vj) still act on whole logical lines. (#290) - Wikilinks:
[[#heading]]now links to a heading in the same note — clicking it (in the editor or the preview) scrolls to that heading, no full path needed. (#291) - Daily/weekly notes: the note‑template picker now uses a custom dropdown, so choosing a template works reliably on Linux — the old native menu sometimes wouldn't register the pick. (#275)
- Command palette: opening a note from the palette (e.g. your daily note) now moves focus straight to the editor, so you can start typing immediately — previously, if the explorer was focused, the note opened but focus stayed behind.
- Quick capture (macOS): summon the capture window from another app and saving (
⌘↩) or pressingEscnow returns you to that app — it no longer pulls the main ZenNotes window to the front. Summoned from within ZenNotes it still returns you to the main window. - Tabs:
Shift+⌘/Ctrl+Treopens your most recently closed tab — restoring its position and pinned state, and repeatable back through your close history. There's a matching Reopen Closed Tab command‑palette entry too. (#277, thanks @junereycasuga) - Vim: the
<leader>(Space) key now fires on the home view when no note is open — the home view's roving‑focus handler no longer swallows it, while still owningj/k/arrows/Enter. (#273, thanks @theurzil) - Tags & wikilinks:
#tagsand[[links]]inside a fenced code block that's indented under a list item are no longer indexed — e.g. a C#includeline stays code, not a tag. Top‑level fences were always ignored; this brings indented ones in line, across the tag list, the wikilink index, and the self‑host server. (#293) - Tables — resizable columns: drag a column's right border in the live table to set its width. The widths save with the note (a tiny
<!-- zen:cols=… -->comment that stays invisible in other markdown apps and survives:format) and are honored in both the editor and PDF export. Un‑resized tables are untouched. Also tidier add‑button spacing, and tables hold together better through PDF/:format— a/tablenow inserts as a proper GFM block, and wide tables wrap to fit the page on export. (#294) - PDF export — code wrapping: long lines inside a fenced code block now wrap to fit the page on PDF export instead of being clipped off the right edge — matching how they wrap in the editor. (#297)
- PDF export — match your theme: a new Use theme for PDF export toggle (Settings → Appearance → PDF export) renders the PDF in your current theme — colors and dark/light, custom themes included — as a full‑bleed page. Off by default, so exports stay on the clean light print theme unless you opt in.
- New built‑in theme — Rosé Pine: the rose‑pine/neovim palette ships built‑in with all three variants — Rosé Pine and Moon (dark) and Dawn (light). Settings → Appearance → Rosé Pine.
- MCP — OpenCode support: OpenCode joins Claude Code, Claude Desktop, and Codex CLI as a one‑click MCP client (Settings → MCP Integrations) — it writes a managed
zennotesserver entry into~/.config/opencode/opencode.json. (thanks @patricesos) - Per‑vault view settings + synced workspace: your note‑list view preferences (sort order, group‑by‑kind, the Tasks view, kanban columns, auto‑reveal, system‑folder labels, unified sidebar) can now be per vault instead of global, and your workspace (open tabs, pane layout, sidebar state) saves to
<vault>/.zennotes/workspace.jsonso it travels with the vault and restores when you open it on another machine. Pick Global or Per‑vault under Settings → Vault (defaults to Global). (#292, thanks @junereycasuga) - Keymaps — conflict detection: the shortcut editor now stops you from assigning a global shortcut that another action already owns — it names the clashing action and disables Save — and flags any existing clash with a badge, so two bindings on one key no longer silently drop one. (Vim/navigation/view keys that reuse a key by design — e.g.
xdeletes in Trash but toggles a task in Tasks — are intentionally left alone.) (#298, thanks @scottames) - macOS —
⌥←/→word motion in the editor: Option+←/→ now moves by word while you're editing instead of being hijacked by note-history navigation. History back/forward is unchanged — it still works outside text fields, on Windows/Linux, and via Vim'sCtrl+O/Ctrl+I. (#302, thanks @MatthewHunt84) - Tasks calendar honors the week-start setting: the Calendar starts week on preference (Sunday / Monday / locale) now applies to the Tasks → Calendar view too, not just the sidepanel calendar — the grid and weekday header both start on your chosen day. (#300, thanks @npodoscope)
- CLI —
zen captureaccepts tasks & lists:zen capture "- [ ] buy milk"now works — a leading-(a markdown task or list item) is no longer swallowed as a command flag. The auto-derived note title also strips the marker, so it reads "buy milk" while the- [ ]line stays in the body (and shows up in Tasks). (thanks Olivier Tripet)
⬆️ Upgrade notes
- Your themes are just files under
~/.config/zennotes/themes/and~/.config/zennotes/overrides/, so they sync with the rest of your dotfiles (git, stow, chezmoi). - Automatic migration: any earlier
themes/*.tomlpalette is converted once to the new folder format on first launch (the original is renamed*.toml.migrated), so existing themes keep working unchanged.
Keyboard‑first and local‑first, as always — now your whole look is yours too.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Beta — feedback welcome: [email protected]