ZenNotes

ZenNotes manual

Docs

The same in-app help, on the web, plus a simple run guide for desktop and self-hosted setups. Start with the run section if you just cloned the repo and want ZenNotes running.

Overview

ZenNotes is a keyboard-first, Markdown-first notes app. It ships from one shared core as a native Electron desktop app and as a self-hosted web app backed by a Go server, with a planned hosted mode on the same stack. Your notes stay as plain .md files in a vault you own. Modal editing, Vim motions, split panes, preview, and a bundled MCP server are all first-class.

This page is a live copy of the built-in manual. Press :h or open Help from the sidebar footer to browse the same content inside the app.

Checking whether ZenNotes can do something specific? Jump to the Feature index — a scannable list of every feature with the fastest way to reach it. Press Cmd/Ctrl+F to search this page.

Run ZenNotes

The shortest practical paths to getting ZenNotes running. If you want the browser version or a home-server setup, start with Docker. If you want the native app, start with desktop.

Run the desktop app

Best if you want ZenNotes as a native desktop app on your own machine, with either a local vault or a remote ZenNotes server.

npm ci
Install the monorepo dependencies.
npm run dev:desktop
Start the Electron desktop app in development mode.
make desktop
Shorter alias for the same local desktop dev flow.
  • Requires Node.js 22+ and npm.
  • Open a local vault from Settings -> Vault, or use Quick Connect… / Connect to Remote Vault… to point the desktop app at a self-hosted ZenNotes server.
  • Desktop can save multiple remote workspaces, repoint the active remote with Change Remote Vault…, and return to local mode later.
  • Export Note as PDF… is available from the command palette and the Shift+Mod+E shortcut.
  • For packaged desktop builds, use npm run build:prod and then npm run pack.

Run the published Docker image

The fastest way to self-host in the browser. Pull the prebuilt multi-arch image from Docker Hub — no git checkout or local build required.

TOKEN=$(openssl rand -hex 32)
Generate a login token. The container binds to 0.0.0.0, so the server requires a token and refuses to start without one.
mkdir -p "$HOME/Documents/MyVault" "$HOME/zennotes-data"
Make sure the vault and data folders exist and are owned by you — otherwise Docker creates them as root and the container can't write to them.
docker run -d --user "$(id -u):$(id -g)" --name zennotes -p 127.0.0.1:7878:7878 -e ZENNOTES_AUTH_TOKEN="$TOKEN" -v "$HOME/Documents/MyVault:/workspace" -v "$HOME/zennotes-data:/data" --read-only --tmpfs /tmp --cap-drop ALL --security-opt no-new-privileges adibhanna/zennotes:latest
Start the prebuilt image as your own user (so it can write the mounted vault), with your host vault at /workspace and server config at /data.
echo "$TOKEN"
Print the token to paste into the browser on first connect.
open http://localhost:7878
Open the self-hosted ZenNotes web app in your browser.
  • Permissions: the container runs as a non-root user (UID 65532), and Docker bind mounts keep the host owner — so the mounted vault and data folders must be writable by the user the container runs as. The --user "$(id -u):$(id -g)" flag above runs it as you; without it you may see "vault init: mkdir /workspace/inbox: permission denied". As an alternative to --user, chown the folders to 65532.
  • The image is multi-arch (linux/amd64 and linux/arm64); docker pull adibhanna/zennotes selects the right build automatically.
  • Pin a release with a version tag, e.g. adibhanna/zennotes:2.0.1, instead of :latest.
  • Your vault stays on the host as ordinary .md files; the /data volume holds the server config.
  • This runs the same server as the make up flow below, so every ZENNOTES_* environment variable there applies here too.
  • Prefer ZENNOTES_AUTH_TOKEN_FILE over ZENNOTES_AUTH_TOKEN for Docker or Kubernetes secrets so the token never lives in shell history or .env.
  • Drop the 127.0.0.1 prefix on -p to reach it from your LAN, but put a TLS reverse proxy in front and set ZENNOTES_BEHIND_TLS=1 first.

Build and run with Docker from source

Build the image yourself from a local checkout with make up — use this when you want to modify the source or have the auth token generated for you. To just run it, use the published image above.

CONTENT_ROOT="$HOME/Documents/MyVault" make up
Build and start the self-hosted stack with your host vault folder mounted into the container.
cat data/auth-token
Read the generated bootstrap auth token the browser will ask for on first connect.
open http://localhost:7878
Open the self-hosted ZenNotes web app in your browser.
make down
Stop the Docker stack.
make logs
Follow the server logs.
  • The vault stays on the host. Docker is only serving it; your notes are not stored inside the container.
  • On first load, ZenNotes asks for the token stored in ./data/auth-token, then asks you to choose the vault folder from the mounted content root.
  • After the first browser login, ZenNotes uses a session cookie, so reloads should not keep asking for the token.
  • The desktop app can connect to the same Docker-backed server, so browser and desktop can point at one host-mounted vault.
  • Docker can only browse folders you mounted. If you want to browse an Obsidian or iCloud folder from the web picker, mount that folder as CONTENT_ROOT or mount a parent directory that contains it.
  • The default Docker setup binds to localhost and is meant to sit behind a reverse proxy or private network gate if you expose it remotely.
  • For public exposure, set ZENNOTES_BEHIND_TLS=1 once a TLS proxy is in front; that flips on Secure cookies and HSTS.
  • Set ZENNOTES_TRUSTED_PROXIES to the proxy CIDR (e.g. 127.0.0.1/32 or your bridge network) so X-Forwarded-Proto and X-Forwarded-For are only honoured from the proxy, not arbitrary clients.
  • Prefer ZENNOTES_AUTH_TOKEN_FILE over ZENNOTES_AUTH_TOKEN for Docker / Kubernetes secrets so the token never lives in .env.
  • Restarting the container logs everyone out — sessions are held in memory. Set ZENNOTES_PERSIST_SESSIONS=1 to persist browser logins to sessions.json on the /data volume (mode 0600, opt-in) so you stay logged in across restarts instead of re-entering the token.
  • Notes default to 0600 and dirs to 0700; tune with ZENNOTES_VAULT_FILE_MODE and ZENNOTES_VAULT_DIR_MODE if you intentionally share the vault with another local user.
  • Body size caps are enforced server-side: ZENNOTES_MAX_NOTE_BYTES (default 10 MiB) and ZENNOTES_MAX_ASSET_BYTES (default 50 MiB).

Run the web app from source

Best for development. For normal self-hosted use, prefer the Docker flow above.

npm ci
Install the monorepo dependencies.
npm run dev:server
Start the Go backend.
npm run dev:web
Start the Vite frontend in a second terminal.
make web-stack
Run both processes together instead of starting them manually.
  • The web client and Go server are separate processes in dev mode.
  • If auth is enabled, the browser will prompt for the server token before protected routes work.
  • Browser auth now uses the bootstrap token once and then an HttpOnly session cookie instead of keeping the token in the URL.
  • If backend routes change, restart the Go server and reload the page.
  • If Connect to server vault appears dead in dev mode, the Go server is usually missing or stale. Restart npm run dev:server and reload.

Use desktop with a remote ZenNotes server

Best if you want the native desktop app, but the vault itself lives on another machine running the ZenNotes server.

npm run dev:desktop
Start the desktop app.
Settings -> Vault -> Quick Connect…
Enter the server URL and, if required, the bootstrap auth token.
Choose the vault folder on the server
The desktop app then uses that remote vault instead of the local filesystem.
  • Remote connections can be saved and reused later from Settings and the command palette as Saved Remote Workspaces.
  • Settings -> Vault also exposes Change Remote Vault…, Return to Local Vault, and Open Local Vault….
  • When connected remotely, ZenNotes shows a Remote indicator in the sidebar and title bar.

Quick start

The shortest path from install to a working vault.

Choose a vault

A vault is just a folder of Markdown files. ZenNotes reads it directly, keeps everything file-based, and never hides your notes behind a database. That can be a local folder on desktop or a host-mounted folder served remotely through Docker.

Use the three working zones

The sidebar is your navigator, the note list is your current folder or attachments view, and the editor pane is where tabs, splits, preview, and focused writing happen.

Capture, organize, archive

Quick Notes are for fast capture, Inbox is active work, Archive is cold storage, and Trash is recoverable deletion. Archive and Trash open as dedicated main-pane lists so the sidebar stays singular; Quick Notes stays foldable in the sidebar and can also open its own list tab from the context menu.

Stay keyboard-first

Search notes, search vault text, and open the command palette from their configured shortcuts. Use Vim mode for ex commands, pane motion, hint mode, leader hints, link-following, and keyboard-opened context menus. Once a picker is open, Arrow keys and Ctrl+N / Ctrl+P both move through results.

Insert structure inline

Type / in the editor to open a slash menu for headings, lists, callouts, code blocks, dividers, tables, links, images, and more. Type @ to insert date shortcuts like Today, Yesterday, and Tomorrow as Markdown-friendly ISO dates, or to link a matching note.

Customize the chrome

Folder icons can be changed from the folder context menu, sidebar arrows can be hidden, and Quick Notes can use either timestamp titles, date titles, or a custom prefix.

Export what you wrote

Export Note as PDF… uses the rendered Markdown note, not raw text. On desktop it saves directly; in the browser it opens a print-friendly white paper view so you can Save as PDF.

Use the built-in manual

Open Help from the sidebar footer or with :help to browse shortcuts, commands, panel behavior, Vim flows, and settings in one place.

Seed a starter vault tour

Run Generate Demo Tour Notes from the command palette to add a guided set of demo notes under inbox/demo, plus a local attachment. Run Remove Demo Tour Notes to clear them later.

Pick up where you left off

ZenNotes restores the last open tabs, splits, built-in views, and sidebar layout for each vault, and remembers the main window size, position, and maximized state between launches. Remote vault connections can also be saved for quick switching later.

Feature index

A single scannable index of every user-facing capability in ZenNotes, grouped by domain. Each row lists the fastest way to reach a feature — a shortcut, ex command, command-palette entry, slash command, Settings path, or CLI command — so you can confirm a feature exists and use it without reading prose.

How to use this index

Press Cmd+F (macOS) or Ctrl+F (Windows/Linux) to search this page for a feature name, a shortcut, or an ex command. Each group below covers one domain; jump to the matching group, then scan its table.

Mod means Cmd on macOS and Ctrl on Windows/Linux. Bindings shown are defaults — every shortcut, Vim binding, and sequence is remappable in Settings → Keymap. Leader bindings (Space prefix) and ex commands (typed after :) require Vim mode; the equivalent command-palette entry works in any mode.

Many features have more than one access path. Where that is true, the row lists all of them: shortcut and ex command and palette entry. Use whichever fits your current context.

Feature groups at a glance

Six domains. Jump to the one that matches what you are looking for.

Editing, rendering & writing aids

Markdown editor and view modes, live preview, slash and @ menus, wikilinks, folding, math, diagrams, callouts, tables, code blocks, comments, find & replace, and formatting.

Editing

Workspace, panes & navigation

Sidebar, note list, panels, tabs, splits, reference panes, palettes, zen mode, theme switching, floating windows, and session persistence.

Workspace

Notes lifecycle, organization & views

Inbox, Archive, Trash, Quick Notes, Tasks, Tags, templates, daily and weekly notes, folders, assets, and all create/rename/move/duplicate/delete operations.

Notes

Keyboard system, Vim & commands

Global shortcuts, the Vim leader and which-key system, pane motions, ex commands, list navigation, and command-palette categories.

Keys

Settings & appearance

Themes, typography, editor behavior, vault location, daily/weekly/monthly notes, system folder labels, and the keymap editor.

Settings

Integrations & platforms

zn CLI, MCP server and tools, Raycast extension, the Go server, remote vaults, PDF export, and app updates.

Integrations

CSV databases

Turn any .csv into a Notion-style database — an editable Table and a grouped Board over the same data, typed fields, sort and filter, records as Markdown pages, and a vim-driven grid.

Databases

Editing — view modes

Switch how the active note is shown. Each mode has a shortcut, an ex command, and a palette entry.

Mod+4
Edit mode — raw markdown editor Also :editmode or :view edit; palette 'Switch to Edit Mode'. Vim leader Space e f context.
Mod+5
Split mode — editor + live preview side by side Also :splitmode or :view split; palette 'Switch to Split Mode'.
Mod+6
Preview mode — read-only rendered view Also :previewmode or :view preview; palette 'Switch to Preview Mode'. Navigate with j/k, Ctrl+D/Ctrl+U.
:view
Set pane mode from the ex line :view edit | split | preview. Per-pane and per-note persistent.

Editing — inline authoring aids

Insert structure and resolve links without leaving the keyboard.

/
Slash insert menu — headings, lists, code, table, callout, math, link, image, divider, new page Type / at line start or after whitespace, then filter.
@
@ menu — insert a date/time or link a note Type @ then a label (e.g. @today, @tomorrow) to insert an ISO date, searchable by weekday or month name, or @time / @now for the current time in your 12h/24h format (Settings → Editor → Time format). Typing @ then part of a note title also suggests matching notes; picking one inserts a [[wikilink]], so @ is a quick alternative to [[.
[[
Wikilink autocomplete — link notes, paths, assets, and databases Type [[target]] or [[target|label]]. Filters notes, images, PDFs, SVGs, and CSV databases. Pick a database to drop a [[Database]] link that opens its grid.
gd
Follow link / go-to-definition (Vim) Cursor on a wikilink, a standard [text](url) Markdown link, a URL, or a PDF, then gd. Standard Markdown links navigate just like [[wikilinks]] — internal paths and #heading anchors open the note; external links (including bare domains like google.com) open in the browser. In Edit/Split, a plain click follows a rendered link (click one the cursor is inside to edit it), Cmd/Ctrl-click always follows, and links show a pointer cursor on hover. Palette 'Follow link'. If the target note does not exist yet, following the link (click, Cmd/Ctrl-click, or gd) offers to create it after you confirm, instead of leaving a dead link.
#tag
Hashtag link — clickable inline tag Type #tag, then any script — Latin or non-Latin like #тест (Cyrillic) or #标签 (CJK); slashes allowed for hierarchy. Headings (# x) and hex colors (#1971c2) are not tags. Click in preview to open Tags view.
![[ ]]
Embed image / asset inline ![alt](path) or ![[path]]; or paste/drop an image. SVGs and PDFs embeddable.
![[Note]]
Embed (transclude) another note inline Prefix a wikilink with ! to inline a note's rendered content in the reading view and PDF export — recursively, with cycle protection — so a master note can pull in sub-notes and export to PDF as one document. Note targets embed; image/asset targets keep the image behavior above.
Ctrl+Space
Open autocomplete manually Context-aware sources for /, @, and [[. Esc dismisses.

Editing — formatting, folding & cleanup

:format
Format markdown with Prettier Also Vim leader Space l f; palette 'Format Markdown'. proseWrap preserved.
Inline Bold
Wrap selection: bold, italic, strikethrough, code, link, image Palette entries 'Inline Bold/Italic/Strikethrough/Code', 'Insert Link'. Bindings configurable in Settings → Keymap.
Select text
Selection toolbar — bubble pops up over a selection A Notion-style toolbar: bold, italic, strikethrough, highlight, code, math, link, comment, and a 'Turn into' block menu (Text, Heading 1–3, lists, quote, code). The footer shows the focused action's shortcut.
Mod+B / Mod+I / Mod+E / Mod+K
Inline format shortcuts — bold / italic / code / link Plus Shift+Mod+S strikethrough, Shift+Mod+H highlight, Shift+Mod+M math. Work on every platform, in or out of Vim mode (Mod = ⌘ on macOS, Ctrl on Windows/Linux).
Mod+/
Focus the selection toolbar from the keyboard Then arrow keys (or h/j/k/l in Vim mode) move row-aware across formats and up to 'Turn into'; Enter applies, Esc returns to the text.
zc / zo
Fold / unfold heading at cursor (Vim) Also :fold / :unfold; palette 'Fold/Unfold Heading at Cursor'. Or click the inline fold arrow on hover.
zM / zR
Fold all / unfold all headings (Vim) Also :foldall / :unfoldall; palette 'Fold All' / 'Unfold All'. Fold state is per-session.
Alt+Z
Toggle word wrap Palette 'Enable/Disable Word Wrap'. Off requires horizontal scroll.
scrolloff
Scroll offset — keep the cursor off the top/bottom edge Settings → Editor → Vim → Scroll offset. Keeps N lines visible above and below the cursor as you move (Vim scrolloff). Default 0 (off).
cursor
Solid (non-blinking) cursor Settings → Editor → Writing → Blinking cursor. Turn it off for a solid caret and Vim block cursor, e.g. to match the macOS 'Prefer non-blinking cursor' accessibility setting.
Tab
Indent / nest list item (Shift+Tab de-indents) Ordered lists auto-renumber on insert, delete, and paste.
Mod+Z
Undo (Mod+Shift+Z / Ctrl+Y to redo) Per-pane history. Also via context menu.
Copy / Fold
Code block toolbar — copy to clipboard or collapse Hover a code block in Preview or Split. Fold state persists per note.

Editing — rendering, math & diagrams

Markdown rendering features. All are GFM-based and theme-aware; diagrams expand to a pan/zoom modal.

$ … $
Math (KaTeX) — inline $…$ and display $$…$$ Display block also via / slash menu → Math block.
```mermaid
Mermaid diagrams — flowchart, sequence, state, ER, Gantt, pie, git Theme-aware, lazy-loaded. Expand for pan/zoom.
```tikz
TikZ / PGF vector diagrams Lazy-loaded; theme-aware SVG; expandable.
```jsxgraph
JSXGraph interactive geometry & graphs Points, lines, functions, animations; expandable.
```function-plot
function-plot 2D function graphs JSON config (e.g. {"data":[{"fn":"sin(x)"}]}); expandable.
```lang
Code block syntax highlighting Triple backticks + language tag (200+ languages). Also / slash menu → Code block.
| a | b |
GFM tables with alignment Use :--- / ---: / :---: for left/right/center. Also / slash menu → Table.
> [!note]
Callout blocks — note, tip, warning, danger, question, and more Type [! inside a blockquote to open a type picker (filter by name/alias; navigate with arrows or the Vim chords Ctrl+J/Ctrl+K, also Ctrl+N/Ctrl+P; accept with Enter, Tab, Ctrl+Y, or click), or / slash menu → Callout. Color by type: note/info/abstract (blue), tip/success (green), question/example (purple), warning (yellow), danger/bug/failure (red), quote (gray). Unknown types render as a neutral note.
- [ ]
Task checkboxes (GFM) — click to toggle in preview Feed the Tasks view.
- [x]
Completed task styling — strike through / gray out done tasks Settings → Editor → Completed task style: none (default) / strikethrough / gray / both. Applies in the editor and preview; the checkbox stays checked and nested sub-tasks keep their own state. Palette: 'Completed Tasks: …'.
~~text~~
Strikethrough Also via inline strikethrough command.
> quote
Blockquote Also / slash menu → Quote.
[^1]
Footnotes with auto backrefs Define [^1]: text elsewhere in the note.
---
YAML/TOML frontmatter (hidden in preview) --- … --- (YAML) or +++ … +++ (TOML). Holds metadata and template variables.
F
Diagram modal — pan, zoom (+/-), fit (0), full-screen (F) Click Expand on any diagram. Drag to pan, scroll to zoom, open in a tab.

Editing — search, comments & PDF

Mod+F
Find & replace in the current note Tab to Replace; toggle case / regex / whole-word. Edit and Split modes only. (Non-Vim mode: Mod+F is note search instead — see Search.)
Mod+Shift+C
Comments panel — annotate selected text Toggles the panel. Mod+Alt+M (or select text + m) starts a comment; '+' for New Comment, Mod+Enter to save. Navigate with j/k; e edit, r resolve, d delete.
:outline
Heading outline palette — jump to any heading Also Mod+3 toggles the outline panel; Vim leader Space p; palette 'Open Note Outline'.
[label](file.pdf)
Embed a PDF; pin it as a reference (desktop) Right-click embed → 'Open as Reference (Global)' or '(This Note)'; or gd on the link. Render style set in Settings → Editor → PDFs in edit mode.

Workspace — panels & layout toggles

Show, hide, and arrange the chrome around the editor.

Mod+1
Toggle sidebar (folders, notes, tags) Also Vim leader Space e; palette 'Toggle Sidebar'.
Mod+2
Toggle connections panel (backlinks) Palette 'Toggle Connections Panel'. Navigate with j/k, Enter/o, p to peek.
Mod+3
Toggle outline panel (headings) Also Vim leader Space p; palette 'Toggle Outline Panel'.
Mod+.
Toggle Zen mode (distraction-free) Also :zn toggle | on | off; palette 'Enter/Exit Zen Mode'. Hides all chrome.
Mod+W
Close active tab or virtual view Also :q / :bd / :bclose; palette 'Close Tab'. Closes Tasks/Tags views too.
Toggle
Toggle note list column Palette 'Toggle Note List Column'. Button in note list header. Hidden in unified sidebar mode.
:closepanel
Close the right panel Palette 'Close Right Panel'; ex :closepanel / :closep. Closes whichever right-hand panel is open — connections, outline, comments, or calendar.

Workspace — panes, tabs & splits

Multi-pane editing. Split and pane commands work via Vim Ctrl+W, ex commands, and the palette.

Ctrl+W v
Split right — clone tab into a new right pane (Vim) Also :vsplit / :vs; palette 'Split Right'.
Ctrl+W s
Split down — clone tab into a new pane below (Vim) Also :split / :sp; palette 'Split Down'.
Ctrl+W h/j/k/l
Focus pane left/down/up/right (Vim) Wraps to sidebar/panels at edges. Ctrl+W Ctrl+h/j/k/l also works.
Alt+h/j/k/l
Focus pane left/down/up/right — always on Works even with Vim mode off, and skips the Ctrl+W prefix some Linux setups intercept.
:only
Close other tabs in pane Palette 'Close Other Tabs in Pane'; context menu on tab. Pinned tabs survive.
Pin Tab
Pin a tab so it survives bulk-close Palette 'Pin Tab'; right-click tab. Pinned tabs stay at the front.
Close Right
Close tabs to the right Palette 'Close Tabs to the Right'; context menu on tab.
Drag divider
Resize pane split Persists in the saved layout.

Workspace — reference pane & floating windows

Pin Reference
Pin active note as a side-by-side reference Palette 'Pin Active Note as Reference'; right-click tab. One pinned reference at a time; per-note pin overrides global.
Show Reference
Toggle reference pane visibility without unpinning Palette 'Show/Hide Reference Pane'; eye icon in the pane header.
Mod+Alt+E
Toggle reference pane edit/preview mode Button in the pinned pane header. Drag the left edge to resize.
Floating Window
Open a note in a separate window (desktop) Palette 'Open in Floating Window'; right-click note or tab. Independent editing state and Vim mode.

Workspace — palettes & search

Fast finders. Each has a shortcut and a Vim leader binding.

Mod+P
Search notes — fuzzy by title and path Vim leader Space f; non-Vim alias Mod+F; palette 'Search Notes'. Supports inline #tag filtering.
Mod+Shift+P
Command palette — run any command Also :cmd <query> (runs best match) or :commands (always opens). Switches to theme and vault modes.
Mod+Shift+F
Vault text search — full-text across notes Vim leader Space s t; palette 'Search Text in Vault'. Backend: Auto / built-in / ripgrep / fzf (Settings → Editor).
Space o
Buffer switcher — all open tabs (Vim) Also :buffers / :ls; palette 'Open Buffer Switcher'.
Space v
Vault switcher (Vim, desktop) Palette 'Switch Vault'. Lists local and remote vaults. Esc closes the switcher (it no longer drops into the full command palette).
↑/↓ · Ctrl+J/K
Move within any open palette or picker Ctrl+J/K, Ctrl+N/P, and the arrow keys all move the selection — consistent across the command palette, note search, the [[ reference picker, the / slash menu, and the date/template pickers.

Workspace — appearance & navigation extras

Mod+= / Mod+- / Mod+0
Zoom in / out / reset app UI Palette 'Zoom In/Out', 'Reset Zoom'. Persists across sessions.
Themes
Theme switcher with live preview Mod+Shift+P → 'Themes'; or Settings → Appearance. Esc reverts the preview.
Alt+Left / Mod+[
Tab history back / forward (Mod+]) Vim Ctrl+O / Ctrl+I; Vim leader Space [ / Space ]; palette 'Go Back' / 'Go Forward'.
Space h
Hint mode — jump labels for clickable targets (Vim) Moved off bare f to <leader>h in 2.3.0, so the f / t find-char motions stay free in the editor. Works in editor, preview, and panels; hinting a note drops you into the editor.
Hover / Space
Hover preview peek of a linked note Hover a wikilink, or press p (Space) on a connections-panel row.
Click image
Preview image lightbox — zoom, pan, prev/next Closes on Esc or click-outside.

Notes — built-in views

Special views that gather notes and tasks across the vault.

:tasks
Tasks view — all checkboxes, List/Calendar/Kanban Vim leader Space t (per binding); palette 'Open Tasks'; sidebar. Switch modes with 1/2/3. Toggle a task with x (Space too, unless Space is your Vim leader). A checked task lingers in place for a couple of seconds before it drops into the Done group, so you can toggle it again to undo.
:tag
Tags view — browse and filter by tag :tag foo bar pre-selects tags; Vim Space # ; palette 'Open Tags'; sidebar. Union (ANY) matching.
:trash
Trash view — restore (r) or delete (d/x) Palette 'Go to Trash'; sidebar. 'Empty Trash' clears all. Assets deleted from the Asset browser also land here under a Deleted assets section, where they can be restored to their original location or removed permanently.
Mod+Shift+N
Quick Notes (Inbox) view / new quick note Also Space z or Space q; palette 'New Quick Note'. Press n in the view to add. Naming set in Settings → Editor.
Inbox
Inbox view — primary active notes Sidebar 'Inbox'; palette 'Go to Inbox'. Sort, filter, group by kind, multi-select, drag-drop.
Archive
Archive view — inactive notes Sidebar 'Archive'; palette 'Go to Archive'. Press u to unarchive, d to trash.
Files
Files / Assets view — images, PDFs, media Sidebar 'Files'; palette 'Go to Files'. Grid or list layout; open in tab or reference pane.

Notes — create, template & journal

:new
New note (Inbox or vault root) :new <path> for an explicit location; palette 'New Note in Inbox' / 'New Note in Vault Root'.
:e <path>
Open or create a note by path :edit inbox/Work/note.md. Creates missing folders.
New in Folder
New note in the current folder Palette 'New Note in Current Folder'; folder context menu.
:template
New note from template (picker or by name) Also :tmpl; Vim leader Space t; Mod+Shift+T; palette 'New Note from Template'. Variables: {{title}}, {{date}}, {{time}}, {{week}}, {{cursor}}.
Save as Template
Save the current note as a custom template Palette 'Save Current Note as Template'; Space Shift+T. Stored in .zennotes/templates/.
:daily
Open today's daily note Vim leader Space d; Mod+Shift+D; palette 'Open Today's Daily Note'. Requires daily notes enabled in Settings → Vault → Periodic notes.
:weekly
Open this week's note (YYYY-Www) Vim leader Space w; Mod+Shift+W; palette 'Open This Week's Note'. Requires weekly notes enabled in Settings → Vault → Periodic notes.
:monthly
Open this month's note (YYYY-MM) Vim leader Space m; palette 'Open This Month's Note'. Requires monthly notes enabled in Settings → Vault → Periodic notes.

Notes — manage, move & organize

:mv
Move a note or asset to a folder Also :move; Mod+M; palette 'Move Note to Folder'; context menu 'Move…'. Interactive folder autocomplete. Or drag any sidebar row — notes, folders, drawings, and images/PDFs/attachments — onto a folder to move it.
Rename
Rename note (filename only) Palette 'Rename Note'; context menu 'Rename…'. No / or \ allowed. Inbound [[wikilinks]] across the vault — including aliases, #heading / ^block, embeds, and path-style links — rewrite to the new name automatically (code spans are skipped).
Duplicate
Duplicate note in place Palette / context menu 'Duplicate'. Appends ' (copy)'.
Mod+Shift+A
Archive note Palette 'Archive'; context menu. Unarchive moves it back to Inbox.
Trash
Move note to Trash (soft delete) Palette 'Move Note to Trash'; d in list views; context menu. Restore from Trash view.
Copy Wikilink
Copy note as [[Title]] Palette 'Copy Note as Wikilink'; context menu.
Copy Path
Copy relative or absolute note path Palette 'Copy Note Path' / 'Copy Note Absolute Path'; context menu.
Copy as Markdown
Copy the whole note's Markdown Palette 'Copy Note as Markdown'; Vim leader Space l y. Includes unsaved edits.
Reveal
Reveal note in Finder / File Explorer (desktop) Palette 'Reveal Note in File Manager'; context menu 'Reveal in Finder'.

Notes — folders, tags & assets

Create Folder
Create / rename / delete a folder Sidebar context menu; Settings → Folders. Supports nested paths like Inbox/Work/Projects.
Set Icon
Assign an emoji icon to a folder Sidebar right-click → 'Set icon'. Persisted per vault.
Rename Tag
Rename or delete a tag across the vault Palette 'Rename Tag…' / 'Delete Tag…'. Updates every note.
Drag-drop
Import markdown by dropping files on the window Desktop opens in place; web creates a new note. Filename becomes the title.
Paste / Drop
Attach images, PDFs, and documents Pasted and dragged-in files both land in the vault's assets/ folder (not the vault root), so drop and paste behave the same in Inbox and Vault Root mode. Manage in the Assets view.

Notes — task metadata & sorting

Annotate inline task lines, or make a whole note a task; tasks are parsed across all notes.

tags: [task]
A whole note as a task (task file) Tag a note's frontmatter with task (tags: [task]) to make the whole note a task, TaskNotes-style, with status, priority (high/normal/low), due, and scheduled all in frontmatter — so a vault stays interoperable with TaskForge and Obsidian. Task files show up in the Tasks List/Calendar/Kanban alongside inline checkboxes, and the note body holds free-form detail. Quick-add from the command palette ('New Task', or 'New Task in Folder…' to choose where), the '+ New task' button, the a key (Vim mode), or the :newtask / :task ex command; :newtask Projects/Website drops it straight into a folder so multiple projects stay organized. New task files default to your configured tasks location (Settings → Vault → Notes → Default tasks location; inbox by default). Checking one off rewrites its frontmatter (status: done plus a completedDate) instead of a checkbox character; rescheduling from the calendar or moving its Kanban column updates the matching frontmatter field; deleting a task file trashes the whole note.
due:YYYY-MM-DD
Task due date A space after the colon is fine (due: YYYY-MM-DD parses the same). Past = overdue (Today group); future = Upcoming. Also frontmatter due:.
!high / !med / !low
Task priority (also !h / !m / !l) Sorts Today and Waiting groups. Also frontmatter priority:.
@waiting
Mark a task as waiting Grouped separately, below Today/Upcoming.
@status:<id>
Custom Kanban status Free-form workflow status (slug like backlog, in_progress, review) for the Kanban 'Custom status' board. Define the ordered columns in config.toml under [view] as kanban_statuses = ["backlog", "in_progress", "review", "done"]. A note's status: frontmatter sets a default; drag a card or press Shift+H/Shift+L to change it. Reorder the columns by dragging a header or pressing < / >; renaming a column sets a display label only, so it still shows the underlying @status value beneath the name.
[>]
Forward a task to another note Type > inside a task's checkbox, run 'Forward Task to Note…' from the palette, or press > on a task in the Tasks list. The original stays as - [>] … [[Target]] (a forwarded record linking where it went), and a fresh - [ ] … [[Source]] copy is added to the note you pick, backlinked home. Forwarded tasks group under 'Forwarded', out of Today and Done.
#tag
Tag a task Filterable in the Tasks view and via the CLI/MCP.
Sort
Sort note list — name, updated, created, or manual Sort menu in note list header; palette 'Sort Notes: …'. 'Group by Kind' separates folders from notes.

Notes — databases (CSV)

Any .csv in the vault is a full database, with zero new dependencies. Create one with 'New Database' in the command palette or by right-clicking a folder → New database.

New Database
Turn a CSV into a database Command palette 'New Database', or right-click a folder → New database. Opening an existing .csv works too. Stored as <Name>.csv plus a <Name>.csv.base.json sidecar for field types, options, and views.
Table / Board
Two views over the same data An editable Table (inline cell editing) and a Board grouped by a select field. Add and switch views freely. Long Text values truncate within a capped column width so one long cell can't stretch the table; hover the cell or open it to see the full value.
Typed fields
text, number, checkbox, date, select, multi-select Add / rename / retype / delete fields, plus sort, filter, and a raw-CSV toggle. Every row keeps a stable id so external edits round-trip.
o
Records as pages Open any row as a real Markdown note in a per-database folder. The table is the source of truth: the row's properties mirror into the note's frontmatter, and editing a cell or adding, renaming, or removing a field updates an open record page's metadata immediately (its body is left intact). The in-editor frontmatter renders as a compact properties card.
h/j/k/l
Keyboard-first grid (vim) h/j/k/l to move, gg/G, i/Enter to edit, k onto the header to rename a field, m for the row menu, Space/x to select, o to open the page (Ctrl+O jumps back), Ctrl+W k/j/h/l to tabs/panes, a to add a row, dd to delete. See the Databases section for the full grid.

Keyboard — global shortcuts

Mode-independent shortcuts. All remappable in Settings → Keymap.

Mod+,
Open Settings Palette 'Open Settings'.
Mod+Shift+E
Export note as PDF (desktop/web) Also :note-export-pdf; palette 'Export Note as PDF'. Settings → Appearance → PDF export adds a 'Use theme for PDF export' toggle (off by default). Turn it on to export in your current look instead of the clean light print theme: your theme (colors + dark/light, including custom themes), plus your enabled CSS snippets and color tweaks, as a full-bleed page. This toggle is the single switch for how the PDF looks, so you customize the export by editing your CSS snippets, not with a separate print stylesheet.
Mod+Shift+Space
Quick capture floating window (desktop) Vim leader Space q; palette 'Quick capture'. System-wide hotkey configurable in Settings → Editor.

Keyboard — Vim leader (Space)

Vim mode only. Press Space, then the next key; enable which-key hints in Settings → Editor to see options.

Space f
Search notes Equivalent to Mod+P.
Space o
Open buffers Equivalent to :buffers.
Space s t
Search vault text Two-key sequence after leader.
Space e
Toggle sidebar Equivalent to Mod+1.
Space p
Note outline Equivalent to :outline.
Space t
Template picker Equivalent to :template.
Space d / Space w / Space m
Today's daily / this week's / this month's note Equivalent to :daily / :weekly / :monthly.
Space q
Quick capture Equivalent to Mod+Shift+Space.
Space v
Switch vault (desktop) Opens the vault switcher.
Space l f
Format note Editor normal mode; runs Prettier.
Space l y
Copy note as Markdown Editor normal mode; copies the whole note's Markdown to the clipboard.

Keyboard — Vim motions & panes

Ctrl+W
Pane prefix (then h/j/k/l, v, s) Configurable. Press twice to cancel.
Ctrl+O / Ctrl+I
Go back / forward in note history Per-pane history.
[b / ]b
Previous / next buffer Equivalent to :bp / :bn.
gt / gT
Next / previous tab Move through tabs in the active pane. Also :tabnext / :tabprevious (in the : autocomplete). Rebindable in Settings → Keymap.
gd
Follow link at cursor Resolves wikilinks, URLs, and PDFs; creates missing notes.
o / O
Open line, continuing the list On a list item, o (below) / O (above) carry the marker forward like Enter: bullets repeat, numbered lists advance and renumber, checkboxes start a fresh unchecked box, indentation is kept. Plain lines open normally.
Space h
Hint mode jump labels Moved off bare f to <leader>h in 2.3.0; the f / t find-char motions now work normally in the editor. Editor and panels.
zc / zo / zM / zR
Fold / unfold heading or all headings Equivalent to :fold / :unfold / :foldall / :unfoldall.
Ctrl+D / Ctrl+U
Half-page scroll down / up Clamped scrolling; safe with folds and live preview.
Native Vim
Full normal/insert/visual editing hjkl, w/b/e, d/c/y, text objects, n/N search, ., u, Ctrl+R, /pattern.

Keyboard — list & view navigation

Active when a list or panel (not the editor) has focus.

j / k
Move selection down / up Arrow keys also work.
gg / G
Jump to top / bottom List or preview content.
l / Enter
Open the selected item Opens folder, note, or result.
h / Esc
Back out — collapse folder or return to editor Hierarchical step back.
/
Focus filter / search in the view Esc clears the filter.
m
Open context menu for the row Shift+F10 / ContextMenu key also work.
:
Local ex prompt (Tasks/Tags views) View-specific commands, e.g. :tag foo.
x
Toggle task (Tasks view) or delete/trash (lists) Behavior depends on view; in Trash, deletes permanently. Space also toggles a task unless Space is your Vim leader key.
>
Forward task to another note (Tasks list) Opens a note picker; the original becomes a forwarded record ([>]) linking to the target, a fresh copy is added there, and forwarded tasks group under 'Forwarded'.
r / u
Restore (Trash) / unarchive (Archive) View-specific actions.

Keyboard — ex commands & the keymap editor

Type : in Vim normal mode, then a command. Tab cycles completions in a wildmenu. Every palette command is also reachable as an ex command (kebab-case to underscores).

:w / :q / :wq
Save / close tab / save and close Autosave is on by default; :w forces it.
:saveas / :sav
Save the note under a new name :saveas name (or :sav name) writes a copy of the current note under that title and keeps the original, then switches to editing the copy — like Vim's :saveas.
:qall / :only
Close all tabs / close other tabs :qa, :xall, :wall variants supported.
:help
Open the built-in Help manual Also :h; palette 'Open Help'; sidebar Help link.
Settings → Keymap
Remap any shortcut or sequence 'Record Shortcut' / 'Record Sequence' buttons; filter, Change, Reset per binding or globally. Assigning a global shortcut another action already uses is now blocked — the recorder names the clash and disables Save; any existing clash shows a badge on the affected rows.
Toggle Vim
Enable / disable Vim mode Palette 'Enable/Disable Vim Mode'; Settings → Editor. Disables leader, panes, ex, and hint mode when off.

Settings — appearance & typography

Open with Mod+, then choose a tab.

Appearance → Theme Family
Theme family (Apple, Gruvbox, Catppuccin, GitHub, Solarized, One, Nord, Tokyo Night, Kanagawa, Black Metal) Plus Mode (Light/Dark/Auto) and contrast/flavor/variant pickers. Kanagawa ships Wave/Dragon/Lotus; Black Metal is a monochrome, true-black (OLED-friendly) family with a light Day companion.
Appearance → Custom themes
Author your own CSS themes; New theme scaffolds a folder Each theme is ~/.config/zennotes/themes/<name>/ with a manifest.json + theme.css (arbitrary CSS, edits apply live). Set --z-* tokens under :root and dark-mode overrides under :root[data-theme-mode="dark"]; bundle fonts/images beside the file and reference them with url(zen-theme://<name>/file.woff2). Remote URLs are not loaded.
Appearance → Overrides
Toggle small CSS files on top of whichever theme is active Drop a .css file in ~/.config/zennotes/overrides/ and toggle it on here. Target :root[data-theme] { --z-accent: 255 59 48; } so it wins over the active theme. Overrides stack in filename order; see the seeded example.css cookbook for the token list.
Appearance → Dark sidebar
Dark sidebar and disclosure arrows toggles Also palette 'Dark Sidebar' / 'Light Sidebar'.
Typography → Fonts
Interface, text, and monospace fonts Independent font choices for chrome, reading, and code.
Typography → Size / Line height
Font size (12–32px) and line height (1.2–2.4) Applies to edit and preview.
Typography → Widths
Reading width, editor width, content alignment Caps line length on wide screens; Center or Left.
Typography → Line numbers
Off / Absolute / Relative line numbers Also palette 'Line Numbers: …'. Relative suits Vim counts.
Typography → Line number position
Gutter next to text, or at the editor edge Centered content only; keeps numbers near the text or pinned far-left.

Settings — editor behavior & vault

Editor → Vim mode
Vim mode, leader hints, hint behavior & duration Which-key overlay: Timed or Sticky, 400–3000ms.
Editor → Live preview
Live preview, note tabs, wrap tabs, word wrap, smooth scroll Hides syntax markers off the cursor line; tab and wrap options.
Editor → Search backend
Vault text search backend + rg/fzf binary paths Auto / Built-in / ripgrep / fzf.
Editor → Quick notes
Date-titled quick notes, prefix, quick capture hotkey Controls quick note naming and the global capture shortcut.
Vault → Location
Vault location, remote connection, saved profiles Change… folder picker; Quick Connect…; saved remote workspaces.
Vault → Primary notes
Primary notes location — Inbox or Vault root Obsidian-style root layout vs. dedicated inbox/.
Vault → Daily / Weekly / Monthly
Enable daily/weekly/monthly notes, directory, template Open today / this week / this month buttons. Monthly notes default to yyyy-MM (e.g. 2026-07). Each section collapses its fields when its toggle is off.
Vault → System Folders
Relabel Inbox / Quick / Archive / Trash in the UI Display names only; folder IDs are unchanged.
Templates
Browse, create, edit, reset, remove/restore templates Built-ins (ADR, RFC, Meeting Notes, and more) fork into editable copies in .zennotes/templates/. 'Remove Built-in Templates' hides all the shipped ones (with a confirm); 'Restore Built-in Templates' brings them back — your custom templates stay.

Integrations — zn CLI

Install from Settings → CLI, then run zn in any terminal. Override the target vault with ZENNOTES_VAULT; most commands accept --json.

zn list
List notes (filter by --folder, --tag, --limit) Most recent first.
zn read
Print a note body (--meta, --json) Vault-relative path.
zn create / write / append / prepend
Create or modify note bodies --body inline or - for stdin; write is destructive.
zn capture
Quick-add text as a note (defaults to quick folder) echo "text" | zn capture --tag idea. Markdown too: zn capture "- [ ] buy milk" keeps the leading - [ ] as a task in the body (so it shows up in Tasks) while the note title reads "buy milk".
zn search / search-title
Full-text and title search Line-level matches with --limit.
zn backlinks
Find notes linking to a note Run before renaming.
zn rename / move / duplicate
Rename, relocate, or copy a note --to, --folder, --subpath.
zn archive / trash / restore / delete
Lifecycle operations delete is permanent (--yes).
zn folder / tag / task
Folder, tag, and task operations Includes zn task list and zn task toggle <id>.
zn vault info / open / mcp
Vault stats, open a file in the app, start MCP zn mcp runs the stdio MCP server.

Integrations — MCP, Raycast & server

Connect AI agents, Raycast, and remote servers. MCP and Raycast are set up in Settings → MCP and Settings → CLI.

Settings → MCP
MCP server status, client integrations, instructions Install entries for Claude Code, Claude Desktop, Codex; edit the system prompt (.zennotes/mcp-instructions.md).
MCP tools
Full vault access for agents vault_info, list/read/create/write/move/rename/duplicate/archive/trash/delete notes; search_text, search_by_title/tag, list_tags, backlinks; list_tasks/toggle_task; append/prepend/insert_at_line, replace_in_note; folder tools.
Settings → CLI → Raycast
Install the ZenNotes Raycast extension (macOS) Search notes from Raycast; actions open, archive, trash, reveal, copy. Requires Node, npm, Raycast.
zennotes-server
Self-hosted Go server (desktop + web clients) Default 127.0.0.1:7878; configure via env vars, ~/.zennotes/server.json, or Docker. Auth token required off loopback.
Connect Remote
Connect desktop to a remote vault Palette 'Connect to Remote Vault'; Settings → Vault. 'Switch to Local Vault' returns.
Check for Updates
In-app app updater (desktop) Palette 'Check for Updates'; Settings → About. Downloads and relaunches.

Core concepts

How ZenNotes thinks about files, panes, leaders, and keyboard control.

Quick capture is a floating window

A system-wide hotkey (Cmd/Ctrl+Shift+Space by default, configurable under Settings → Editor) opens a small always-on-top capture window over any app. You type in one place — the first line becomes the note title, the rest is the body. Mod+Enter saves into Quick Notes and hides it, Mod+N saves and starts a fresh note without hiding, and Mod+P opens an existing note to edit. Editing the first line of a Quick note renames it in place instead of creating a duplicate, and the window can be dragged anywhere.

Notes are real Markdown files

ZenNotes edits Markdown on disk. Rename, move, archive, restore, and floating-window operations all work on the underlying files, not an internal copy.

Tabs and splits are first-class

Each editor pane can hold multiple tabs. Split the current tab right or down, move between panes with motions, switch the active note between Edit, Split, and Preview, and use the buffer switcher or :buffers when tabs are hidden. The active tab has a full keyboard context menu — Close Others, Close Right, Pin, Pin as Reference, Open in Floating Window, and Reveal in Finder.

Context menus are part of the keyboard model

ZenNotes treats context menus as keyboard-reachable UI. Use the configured context-menu binding on the selected sidebar or note-list row, or use Shift+F10 / the system Context Menu key to open the active tab menu from the editor.

The home view is where you land

When no note is open (outside Zen mode), ZenNotes shows a light home view instead of a blank pane: a greeting, quick-create actions (new note, database, drawing — plus daily and weekly notes when those are enabled in Settings), your most recently edited notes, and today’s open tasks with an overdue count. Click a note or task to open it, tick a checkbox to complete a task in place, and use ↑/↓ — or j/k in Vim mode — then Enter to move and open from the keyboard.

Sessions restore on relaunch

Workspace restore is saved per vault, while the window frame is global. Reopening ZenNotes brings back your pane layout, open buffers, built-in views, and the last window bounds.

Leader mode can teach itself

If Leader key hints are enabled, pressing Leader opens a which-key style panel that shows the next available actions. Settings let you pick a timed hint or a sticky leader overlay that stays open until you dismiss it.

Tasks, Tags, Archive, and Trash are vault-wide views

Tasks scans every note for checkboxes. Tags lets you browse notes by tag. Archive gives you cold storage. Trash gives you recovery without turning the left rail into a second browser.

A whole note can be a task

Besides inline - [ ] checkboxes, a whole note can itself be a task: give its frontmatter a task tag (tags: [task]) and its metadata lives in frontmatter — status (open / in-progress / done), priority (high / normal / low), due and scheduled dates, plus any tags — while the body holds free-form detail or sub-checkboxes. These task files appear in the Tasks List, Calendar, and Kanban right alongside inline tasks, so both styles live in one vault. It follows the TaskNotes convention, so a 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, the a key in Vim mode, or the :newtask / :task command — and :newtask Projects/Website drops it straight into a folder so multiple projects stay organized. New task files default to your configured tasks location (Settings → Vault → Notes → Default tasks location; the inbox by default), with the folder-picking options overriding that per task. Checking a task file off rewrites its frontmatter (status: done and a completedDate) rather than a checkbox character, and rescheduling from the calendar or changing its Kanban column updates the matching frontmatter field.

Moving notes is path-first

Use the note context menu, the command palette, or :move / :mv to move a note. The move prompt autocompletes folder paths, and the ex command accepts a destination directly like :mv archive/Reference.

Command palette mirrors tab actions

You do not need to remember where a tab action lives. The command palette exposes direct entries for closing, splitting, pinning, referencing, floating-window, and reveal actions.

Slash commands speed up writing

Type / at the start of a line or after whitespace to open an inline insert menu for common Markdown structures: headings, lists, to-do items, callouts, code blocks, dividers, tables, math blocks, links, images, and new-note links. The same slash menu is available in the Quick Capture window.

Callouts highlight the important bits

Turn a blockquote into a colored callout (an Obsidian-style admonition) by starting its first line with > [!type], optionally followed by a title, like > [!warning] Heads up. Typing [! inside a blockquote opens an insert menu of the callout types: filter by name (aliases match too, so warn finds Warning and tldr finds Abstract), move with the arrow keys or the Vim/Emacs completion chords (Ctrl+J / Ctrl+K, Ctrl+N / Ctrl+P), and press Enter, Tab, Ctrl+Y, or click to drop in the syntax. The type sets the color: note, info, abstract/summary/tldr render blue; tip/hint/important and success/check/done green; question/help/faq and example purple; warning/caution/attention yellow; danger/error, bug, and failure/fail red; and quote/cite a neutral gray. Types are case-insensitive, and an unrecognized one still renders as a neutral note, so callouts pasted in from Obsidian keep working.

Style completed tasks

By default, checking a task (- [x]) just fills its checkbox. 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, so a completed parent never strikes an unchecked child, and formatting like bold or [[wikilinks]] inside a done task is styled along with the rest. It defaults to off, so existing notes look unchanged until you opt in.

@ inserts dates and links notes

Typing @ in normal text opens suggestions: the date shortcuts (Today, Yesterday, Tomorrow) plus any notes matching what you type. Choosing a date inserts an ISO date like 2026-04-15; choosing a note inserts a [[wikilink]], so @ is a quick alternative to [[. A bare @ leads with just the dates — start typing letters and matching notes appear.

A selection toolbar formats inline

Select text in the editor and a Notion-style bubble toolbar pops up over it: bold, italic, strikethrough, highlight, inline code, math, a link, and a comment, plus a “Turn into” menu that re-types the block (Text, Heading 1–3, bulleted/numbered/to-do lists, quote, code). The footer shows the focused action’s keyboard shortcut. The same inline formats have shortcuts that work on every platform, in or out of Vim mode (Mod is ⌘ on macOS, Ctrl on Windows/Linux): Mod+B bold, Mod+I italic, Mod+E code, Mod+K link, Shift+Mod+S strikethrough, Shift+Mod+H highlight, Shift+Mod+M math. Press Mod+/ to focus the toolbar, then walk it with the arrow keys (or h/j/k/l in Vim mode); Enter applies, Esc returns to the text.

Templates scaffold new notes

Built-in templates cover engineering (ADR, RFC, Bug Report, Postmortem, Meeting Notes, 1:1) and personal use (Daily Note, Weekly Review, Reading Notes, Journal, Project Kickoff, To-do), and you can author your own under Settings → Templates. A template is plain Markdown with optional frontmatter and variables like {{title}}, {{date}}, {{week}}, and {{cursor}}, substituted at creation. Custom templates are saved as .md files in .zennotes/templates/, so they stay as portable as everything else.

Reference and connections support research-heavy work

Pin a companion note or PDF in the reference pane, then toggle the connections panel to inspect backlinks and unresolved links while you draft.

Zen mode removes chrome

Use the configured Zen shortcut to strip away the title bar, sidebar, note list, tabs, pane headers, side panels, and status bar. Only the active editor, preview, or split view stays visible.

Links are actionable

Use [[wikilinks]] or standard Markdown links — both are first-class. A [text](Note.md) link navigates just like a [[wikilink]] everywhere: the preview, the editor’s live preview, and the follow-link motion. Internal links (relative paths and #heading anchors) open the note; external links — including bare domains you typed without a scheme, like [site](google.com) — open in the browser. In Edit and Split a plain click follows a rendered link (click one the cursor is inside to edit it instead), Cmd/Ctrl-click always follows, and Markdown links show a pointer cursor on hover. In normal mode the follow-link motion (gd) opens the link under the cursor and pins PDFs into the reference pane. If the target note does not exist yet, following the link any way — click, Cmd/Ctrl-click, or gd — offers to create it after you confirm, instead of leaving a dead link. Prefix a wikilink with `!` to embed rather than link: `![[Note]]` inlines the target note content in the reading view and PDF export — recursively, with cycle protection — so a master note can pull in sub-notes and export to PDF as one document. `![[image.png]]` embeds an image.

Renaming a note fixes its links

Rename a note and every [[wikilink]] pointing at it across the vault rewrites itself to the new name — no dead links. It handles every form ([[Note]], [[Note|alias]] keeping your display text, [[Note#heading]], [[Note^block]], embeds ![[Note]], and path-style [[folder/Note]]), skips anything inside fenced or inline code, and only touches links that actually resolved to that note, so notes that share a title never get cross-wired. It runs in the vault layer, so it applies however you rename — the editor, the MCP tools, the CLI, or the HTTP API — on desktop and the self-hosted server alike.

Attachments stay local

Drop or paste files into a note to insert local assets. ZenNotes copies them into the vault's assets/ folder — the same for drag-drop and paste, whether you keep notes in inbox/ or at the vault root — can reveal them from the app, and treats PDFs specially in preview and reference workflows. In the sidebar you can drag an image, PDF, or any attachment onto a folder to move it, just like a note, or use its Move… context-menu entry.

Any CSV is a database

A .csv file in your vault is a full Notion-style database, with zero new dependencies. The same data shows up as an editable Table and a Board grouped by a select field, fields are typed (text, number, checkbox, date, select, multi-select) with sort, filter, and a raw-CSV toggle, and every row keeps a stable id so external edits round-trip cleanly. Open any row as a real Markdown record page whose frontmatter mirrors its properties. You can also link to a database itself: type [[ in any note and pick it (databases appear alongside notes and assets) to drop a [[Database]] link that opens the grid on click. The table is the source of truth: editing a cell or adding, renaming, or removing a field updates an open record page’s metadata immediately, leaving the body intact, and the in-editor frontmatter renders as a compact properties card. Create one with New Database in the command palette or by right-clicking a folder → New database.

Math, diagrams, and plots render from plain fences

Inline $…$ and display $$…$$ math render via KaTeX. Four fenced block languages turn into live diagrams: mermaid for flow and sequence; tikz for LaTeX-native coordinate systems (runs on-device); jsxgraph for interactive geometry; and function-plot for Cartesian plotting. Each block is ordinary Markdown on disk.

Footer actions expose utility views

The sidebar footer gives you direct access to Attachments, Help, and Settings, so utility screens stay discoverable.

Destructive actions ask first

Moving a note to Trash asks for confirmation before anything is deleted. The Trash view separates restore from permanent delete.

Organization and views

ZenNotes organizes your vault into a handful of system areas you move notes through over their lifetime, plus folders you create freely. This section covers every view in the sidebar, how to sort, filter, and group what you see, and every operation you can perform on a note or folder.

Your vault is a normal directory of Markdown files on disk. On top of it, ZenNotes defines four built-in lifecycle areas: Inbox, Quick Notes, Archive, and Trash. These areas exist conceptually even if you rename their sidebar labels. Tags and Files give you two more ways to slice the same notes and assets without moving anything.

Most actions described here are reachable several ways: a default shortcut, a command-palette title (open it with Shift+Mod+P), an ex command (type ':' in Vim normal mode), a right-click or 'm'-key context menu, and the zn CLI. Pick whichever fits your flow.

The system views

Six destinations in the sidebar. The first four are lifecycle stages a note passes through; the last two are lenses over your whole vault.

Inbox

Your primary workspace for active notes. View all notes in the inbox folder (or at the vault root, depending on settings), with configurable sort, filters, and folder grouping. Open it from the sidebar 'Inbox' entry or the command palette 'Go to Inbox'.

Lifecycle

Quick Notes

A capture buffer for fast, low-friction notes, sorted newest-first. Reach it from the sidebar, command palette 'Go to Quick Notes', or create-and-jump with the quick-capture shortcuts. The Quick Notes folder is system-wide and cannot be moved.

Lifecycle

Archive

Long-term storage for inactive notes you want to keep without cluttering Inbox. Open via the sidebar 'Archive' entry or command palette 'Go to Archive'. Notes here stay fully searchable; Unarchive returns them to Inbox.

Lifecycle

Trash

A recovery bin for deleted notes. Open with the :trash ex command, command palette 'Go to Trash', or the sidebar 'Trash' link. Notes wait here until you Restore them or delete permanently.

Lifecycle

Tags

Browse and filter notes by hashtag across the whole vault, with a multi-select chip strip. Open with :tag (optionally :tag foo bar to preselect), command palette 'Open Tags', Space # in Vim mode, or the sidebar Tags section.

Lens

Files

Browse every non-note file (images, PDFs, audio, video, binaries) in the vault tree. Open with command palette 'Go to Files' or the Files link in the sidebar footer. Open files in tabs or the reference pane.

Lens

Inbox and your primary notes location

Where your main notes live is governed by Settings → Vault → Primary notes location. In Inbox mode (the default), regular notes live in an inbox/ folder and other folders sit under archive/. In Vault root mode (Obsidian-style), notes live at the vault root with no dedicated inbox/ folder. This choice changes how the sidebar is laid out, where new notes are created, and which 'New Note' commands appear (for example, 'New Note in Inbox' versus 'New Note in Vault Root'). The setting persists across sessions.

Inside the Inbox view you can multi-select notes and folders for bulk operations, drag notes into folders or onto other panes, and assign emoji icons to folders. The note list updates automatically as you change the sidebar selection, showing notes and assets for the current folder.

Quick Notes and quick capture

Quick Notes are ordinary Markdown files that live in the quick area, listed in reverse-chronological order so the newest capture is always on top. Create one with Shift+Mod+N, Space q in Vim mode, the '+' button or 'n' key inside the Quick Notes view, or command palette 'New Quick Note'. ZenNotes focuses the title field immediately so you can start typing.

On desktop you can also pop a small floating capture window with Shift+Mod+Space (a system-wide hotkey that works even when ZenNotes is hidden), Space q via the leader, or command palette 'Quick capture'. It remembers its position and size, and notes you jot land in the Quick Notes folder.

Titling is configurable in Settings → Editor. Toggle 'Date-titled Quick Notes' to name notes by ISO date (for example 2026-05-29) instead of a timestamp, and set a 'Quick Note prefix' (default 'Quick Note') that is prepended to the title. Leave the prefix blank for a bare date or timestamp.

Archive and Trash workflows

Archive a note

Move a note from Inbox to Archive without deleting it. Use Cmd+Shift+A, command palette 'Archive', the context menu, or 'd' in some list views. Content is preserved and the note stays searchable.

Archive

Unarchive a note

Send an archived note back to Inbox with the 'u' key in the Archive view, the context menu 'Unarchive', or command palette 'Restore'/'Unarchive Note'. The sidebar updates the note's folder status immediately.

Archive

Archive view actions

Filter, sort, and search archived notes. Quick-action buttons cover Open, Unarchive, and Move to Trash. Keyboard: j/k navigate, Enter or o open, u unarchive, d delete. The full context menu (right-click or Space m) adds open in new tab, rename, move, duplicate, copy as wikilink, copy path, reveal in file manager, and open in floating window.

Archive

Move to Trash

Soft-delete a note with command palette 'Move Note to Trash', the 'd' key in list views, or the context menu. A confirmation dialog shows the note title. The note moves to the trash area and is recoverable.

Trash

Restore from Trash

Recover a trashed note back to Inbox with the 'r' key in the Trash view, the context menu 'Restore', or command palette 'Restore Note from Trash'. It returns to its original folder path if that path still exists.

Trash

Delete permanently / Empty Trash

Permanently remove a single note with the 'd' or 'x' key in the Trash view (confirmation: 'This cannot be undone'). Empty Trash deletes every trashed note at once after a single confirmation showing the count. Both are irreversible and available only in the Trash view.

Trash

Tags view

The Tags view shows every hashtag in the vault as a chip strip with per-tag counts. Click chips to select or deselect them; notes matching any selected tag appear below (union logic). A search box filters within the results. Tags can be hierarchical with slashes (for example #project/active), and they work in any script — non-Latin tags like #тест (Cyrillic) or #标签 (CJK) are recognized, render as clickable pills in the editor and preview, and appear here. Headings (# x) and hex colors (#1971c2) are still not treated as tags.

Open the view with command palette 'Open Tags', Space # in Vim mode, or the sidebar Tags section. The :tag ex command opens it, and :tag foo bar replaces the current selection with those tags in one step. Inside the view, j/k navigate notes, Enter or o opens, '/' focuses the filter, and ':' opens a view-local ex prompt. The view live-extracts tags from the active editor buffer as you type.

Tag operations across the vault

Rename Tag…
Rename a tag everywhere Command palette. Prompts for the old and new tag name, then updates every note that carries it.
Delete Tag…
Remove a tag everywhere Command palette. Prompts for the tag name, then strips it from all notes.
#tag
Create a tag inline Type a hashtag in a note body. Clicking it in preview opens the Tags view with that tag selected.
Space #
Open Tags view (Vim) Equivalent to :tag and command palette 'Open Tags'.

Files and assets

ZenNotes treats your vault as a file-based, Obsidian-compatible store: loose files anywhere in the vault count as assets. Images, SVGs, PDFs, audio, video, and generic files can open in tabs or the reference pane. New referenced files default to the vault root rather than a forced attachments folder, though legacy locations such as attachements/ and _assets/ are still recognized.

Embed an asset with ![alt](path) or the Obsidian-style ![[image.png]], or paste/drop an image into the editor to auto-insert it. Wikilink autocomplete ([[) also completes asset paths. Reach the asset views from the Files link in the sidebar footer (command palette 'Go to Files') or the Assets tab that appears when a folder or asset is selected.

Assets render in two layouts you switch from the note-list header: a grid of thumbnail cards (grid icon) and a compact list with names, paths, and sizes (list icon). Your layout choice persists for the session. From the asset views you can sort, filter, search, drag assets into notes, delete unused assets, and on desktop right-click to reveal an asset in the file manager.

Creating notes

Several entry points depending on where you want the note to land.

Shift+Mod+N
New Quick Note Also Space q (Vim), the '+'/'n' in Quick Notes view, or command palette 'New Quick Note'. Lands in the quick folder, focuses the title.
New Note in Current Folder
Create in the folder you are viewing Command palette, or the folder's context menu. Only available when viewing a folder (not in Tasks/Archive/Trash views).
New Note in Inbox / Vault Root
Create in your primary notes area Command palette; the title depends on your Primary notes location setting. Equivalent to bare :new.
:new [path]
Create at an explicit path Ex command. :new alone creates a note in Inbox and focuses the title; :new inbox/Work/idea.md creates at that path.
:e[dit] <path>
Open or create by path Ex command. Resolves a vault-relative path and creates the note (and any missing parent folders) if it does not exist.
Space t
New note from template Also :template / :tmpl, Cmd+Shift+T, command palette 'New Note from Template…', or a folder's 'New from template'. Opens the template picker; :template <name> skips the picker and uses the best match.

Note operations

Every operation works from the command palette and most from the right-click / 'm'-key context menu. Multi-select in the sidebar applies compatible operations to the whole group.

Rename Note…
Change a note's title Command palette or context menu. Prompts with the current title; rejects / and \. Changes only the filename, not the folder. Inbound [[wikilinks]] across the vault rewrite to the new name automatically — every link form (alias, #heading, ^block, embeds, path-style), skipping code spans and only links that resolved to that note. Runs in the vault layer, so editor, MCP, CLI, and HTTP-API renames all benefit, on desktop and the self-hosted server.
Cmd+M
Move to another folder Also :move / :mv (with or without a target) and command palette 'Move Note to Folder…'. Interactive picker with folder-path autocomplete; Tab browses folders, Enter confirms. :mv archive/Reference moves directly.
Duplicate
Copy a note in place Command palette or context menu. Copies content and metadata into the same folder and appends ' (copy)' to the title. Available in Inbox, Archive, Quick Notes, and search results.
Archive / Unarchive
Toggle a note in or out of Archive Cmd+Shift+A to archive; 'u' in the Archive view to unarchive. Also via command palette and context menu.
Trash / Restore
Soft-delete or recover 'd' in list views to trash; 'r' in the Trash view to restore. Confirmation on trash; restore returns the note to Inbox.
Delete permanently
Remove from disk Only in the Trash view ('d' or 'x'). Confirmation required; cannot be undone.
Copy Note as Wikilink
Copy [[Title]] Command palette or context menu. Puts a resolvable wikilink on the clipboard, ready to paste into another note.
Copy Note as Markdown
Copy the whole note's Markdown Command palette or Vim leader Space l y. Puts the note's full Markdown source (including unsaved edits) on the clipboard.
Copy Note Path
Copy the vault-relative path Command palette or context menu. Copies a POSIX path like inbox/folder/note.md.
Copy Note Absolute / Server Path
Copy the full path Command palette. On desktop this is the filesystem path; on a remote workspace the label switches to the server path.

Two related folder-path commands round this out: 'Copy Current Folder Path' (vault-relative, like inbox/Work) and 'Copy Current Folder Absolute Path' / '…Server Path' for the full path. On desktop, 'Reveal Note in File Manager' (context menu 'Reveal in Finder') jumps to the note's location in Finder or File Explorer.

Sorting, grouping, and filtering the note list

Sort the note list from the sort icon (gear) in the note-list header, from Settings, or from the command palette. Options are Name (A→Z and Z→A), Updated date (newest or oldest first, the default is newest first), Created date (newest or oldest first), and Manual. Choose Manual to disable automatic sorting and drag notes up and down to set a custom order; the order persists per folder. Your sort choice persists per view.

Toggle 'Group by kind' (command palette 'Group Notes by Kind' / 'Ungroup Notes by Kind') to list folders and assets in their own sections separate from notes, instead of mixing them in a flat list.

Filter the current list by pressing '/' to focus the filter box (or use the filter input in the folder view). Matching is a case-insensitive substring across title, path, and the first-line excerpt, with instant results as you type. An icon indicates when a filter is active; press Esc to clear it. Filtering is available in every list view, including Inbox, Archive, Quick Notes, Tags, and Tasks. The Tasks, Tags, and Trash views also accept '/' to focus their local filter.

Folders

Create as many folders as you like under your primary notes area and Archive. Folder commands live in the sidebar context menu and Settings → Folders.

Create a folder

Right-click a folder in the sidebar, or use Settings → Folders. Prompts for a name; nested paths like Inbox/Work/Projects create the full hierarchy at once.

Create

Rename a folder

Sidebar context menu 'Rename…' or Settings → Folders. Updates every contained note's path, preserves subfolder structure and folder-icon assignments, and rejects invalid characters.

Rename

Delete a folder

Sidebar context menu 'Delete…' or Settings → Folders. The dialog lets you cancel, move contents to the parent, or delete the folder and everything in it. Moving preserves access; deletion is permanent.

Delete

Folder icons (emoji)

Right-click a folder and choose 'Set icon' to open the emoji picker. The icon shows in the sidebar next to the folder name and is saved in vault settings. Clear it to reset to the default.

Icons

Collapse / expand

Click the chevron beside a folder, or use Left/Right arrows when the sidebar is focused. Right-click a section header or use the command palette to 'Collapse all folders' or 'Expand all folders'. Collapsed state persists per folder.

Collapse

Auto-reveal active note

Toggle 'Auto-Reveal Active Note' (command palette or sidebar settings) so opening a note expands its ancestor folders and scrolls it into view in the sidebar.

Auto-reveal

Reorganizing with multi-select and drag-and-drop

  • Select one item with a click, a range with Shift+click, and toggle individual items with Cmd+click (macOS) or Ctrl+click (Windows/Linux). The sidebar shows the count of selected items.
  • With a selection made, right-click or press 'm' to run a batch operation: open in tabs, move, archive/unarchive, trash, restore, duplicate, copy paths, or delete folders together.
  • Drag a note or folder within the sidebar to move it; drops snap to folder targets and show a visual drop zone. Dragging a selected item moves the whole group.
  • Dragging toward the sidebar edges auto-scrolls to reveal off-screen targets, and the scroll position is preserved after the drop.

Importing Markdown and the assets model

Bring existing Markdown into the vault by dragging .md or .markdown files onto the window. On desktop the file opens in place (in an external file window) or is imported as a copy; on web its contents are read and a new note is created. The filename becomes the title, and frontmatter and content are preserved. Programmatic import is available through window.zen.importNote().

Attachments and assets follow the file-based model described above: drop or paste images and PDFs to embed them, link documents for download or open, and manage everything from the Files/Assets views. PDFs embed with a viewer (zoom and page navigation) and can be pinned into the reference pane. New referenced files default to the vault root.

Opening notes and the vault in separate windows (desktop)

Open in Floating Window
Detach a note into its own window Right-click a note in the sidebar, list, or tab, or use command palette 'Open in Floating Window'. Each window is independent with its own edit/preview state and supports Vim mode.
Open Local Vault in New Window…
Open a whole vault in a new window Command palette. Creates a separate app window for the selected vault.
External file app
Edit Markdown outside the vault Triggered by dragging an OS file onto the window or the ?external=<path> URL parameter. Mirrors floating-window editing with save persistence and Vim mode.
zn open <file.md>
Open a file from the terminal CLI. Brings the ZenNotes window to front and loads the file, whether it lives in the vault or anywhere on disk.

Doing the same from the command line

Every lifecycle operation has a zn CLI equivalent for scripting and automation: zn list (filter with --folder or --tag), zn create / zn capture, zn rename, zn move (--folder inbox|quick|archive|trash, optional --subpath), zn duplicate, zn archive / zn unarchive, zn trash / zn restore, and zn delete --yes for permanent removal. Folders use zn folder list|create|rename|delete, and tags use zn tag list and zn tag find. Add --json to most commands for machine-readable output. Install the CLI from Settings → CLI.

Databases

Any .csv file in your vault is a full database, à la Notion or Obsidian Bases — with zero new dependencies. The same rows show up as an editable Table and a grouped Board, fields are typed, and any record can open as a real Markdown page.

A database is just a CSV on disk plus a small sidecar file. ZenNotes stores the data as <Name>.csv (with an id column that gives every row a stable identity) and keeps field types, select options, and your saved views in a <Name>.csv.base.json file next to it. Because the data stays a plain CSV, external edits — a script, a spreadsheet, git — round-trip cleanly.

Create a database with 'New Database' from the command palette, or right-click any folder in the sidebar and choose 'New database'. Opening an existing .csv from the vault works too. Switch the raw-CSV toggle at any time to see and edit the underlying file.

Two views, one file

Editable table

A spreadsheet-style grid with inline cell editing. Add, rename, retype, and delete fields; sort and filter; and drive the whole thing from the keyboard.

Table

Grouped board

A Kanban-style board grouped by a select field. Add and switch views freely — every view reads the same rows.

Board

Records as pages

Open any row as a real Markdown note in a per-database folder. The table is the source of truth: its properties mirror into the note's frontmatter, the body is a freeform page, and a page icon shows which records already have content. Editing a cell — or adding, renaming, or removing a field in the table — updates an open record page's metadata immediately, leaving the body untouched, and the in-editor frontmatter renders as a compact properties card.

Pages

Fields and data

Field types
text, number, checkbox, date, select, multi-select Add / rename / retype / delete fields from the column header. Field changes flow straight to an open record page's frontmatter — the table is the source of truth.
Sort & filter
Order and narrow rows per view Each view keeps its own sort and filter.
Raw CSV
Toggle to the underlying file Edit the CSV text directly; ZenNotes re-parses it back into the grid.
Stable ids
Every row has an id An id column keeps record pages and external edits aligned even as rows move.

Keyboard grid (Table view)

The grid is fully keyboard-driven, vim-style. It takes focus on open (and after a Ctrl+O jump back, or after reopening the app), so motions work without clicking a row first. Editing a column name no longer swallows h/j/k/l.

h / j / k / l
Move the cell cursor Arrow keys also work. 0 / ^ jump to the first column, $ to the last.
H / L
Move the current column left / right Reorders columns from the keyboard and the cursor follows. You can also drag a column header, or use “Move left / Move right” in the field menu (⋯).
gg / G
Jump to first / last row Within the current column.
k (into header)
Rename a field Press k up onto the column-header row, then Enter / i to rename the field, or m to open its column menu.
i / Enter
Edit the cell On a checkbox cell, toggles it instead.
m
Open the row menu On a cell, open the record's right-click menu (Open, Delete, …).
Space / x
Select the row For bulk actions; tick checkboxes to multi-select.
o
Open the record page Open the row as a Markdown note.
Ctrl+O
Jump back to the grid From a record page, return to the database grid — whether you opened it as a .csv file or via New Database.
Ctrl+W k/j/h/l
Move to tabs or panes Move between the grid, the tab strip, and split panes, just like from the editor.
a
Add a row Append a new empty record.
dd
Delete the row Remove the record at the cursor. Right-click a row to Open or Delete too.

Templates

Templates turn a repeated note shape into one keystroke. Use a built-in or author your own, fill in variables like the date and week automatically, and land the cursor exactly where you want to start writing.

Create a note from a template

Open the picker, choose a template, pick a destination folder, and name the note. ZenNotes substitutes variables and places your cursor.

Space t
Open the template picker The leader binding in Vim mode. Pick a template, then choose where to create the note.
:template
Ex command (alias :tmpl) Opens the picker, or with an argument like :template ADR creates from the best match directly.
New Note from Template…
Command palette The same picker from the command palette for mouse-free or discovery-first workflows.
Right-click → New from template
Sidebar folder menu Creates straight into the folder you clicked — no destination prompt.

Built-in templates

A curated starter set for engineering and personal work. Every one is editable — fork it from Settings → Templates to make it your own.

ADR

Architecture Decision Record — context, decision, and consequences.

Engineering

RFC / Design Doc

A proposal with summary, motivation, design, and alternatives.

Engineering

Bug Report

Reproduction steps, expected vs actual, environment, and severity.

Engineering

Postmortem

Incident review with timeline, root cause, and action items.

Engineering

Meeting Notes

Dated agenda, notes, decisions, and action items.

Engineering

1:1

One-on-one: wins, blockers, growth, and follow-ups.

Engineering

Daily Note

A dated daily log with focus, schedule, tasks, and a log.

Personal

Weekly Review

Review last week and plan the next, titled YYYY-Www.

Personal

Reading Notes

Notes on a book or article: key ideas, quotes, takeaways.

Personal

Journal

A free-form, first-person dated entry.

Personal

Project Kickoff

Goals, scope, milestones, stakeholders, and risks.

Personal

To-do

A simple checklist scaffold.

Personal

Template variables

Tokens are replaced when the note is created. Unknown tokens are left untouched, so your own braces survive.

{{title}}
The note title you choose when creating it.
{{date}}
Today’s date in ISO form, e.g. 2026-05-29.
{{date:FORMAT}}
A custom date, e.g. {{date:dddd, MMMM D, YYYY}} or {{date:YYYY-MM-DD}}.
{{time}}
Current time as HH:mm.
{{week}}
ISO 8601 week number, zero-padded.
{{cursor}}
Removed from the output; marks where the caret lands after creation.

Make and manage your own

Custom templates live as plain Markdown files in .zennotes/templates/, so they stay portable and versionable like the rest of your vault.

  • Open Settings → Templates and press “New template”. A template is frontmatter (name, description, category, titleTemplate, targetFolder, targetSubpath) plus a Markdown body.
  • Use titleTemplate to auto-name dated notes, e.g. {{date:YYYY-MM-DD}}, and targetFolder / targetSubpath to set a default destination.
  • Edit a built-in to fork an editable copy that shadows the original everywhere; Reset restores the built-in.
  • Hide every shipped template with “Remove Built-in Templates” (Settings → Templates or the command palette, with a confirmation), and bring them all back with “Restore Built-in Templates”. Custom templates and edited built-ins stay.
  • From any note, run “Save Current Note as Template…” to capture it as a new custom template.
  • Assign a template to daily and weekly notes under Settings → Vault so dated notes start pre-filled.
  • Built-in templates work everywhere; custom templates require a local vault.

Tasks

Tasks stay plain Markdown, but the app gives them list, calendar, and Kanban workflows on top.

Markdown task syntax

ZenNotes reads unchecked and checked Markdown task list items outside fenced code blocks.

- [ ]
Open task Example: - [ ] Ship the onboarding checklist due:2026-04-30 !high #docs
- [x]
Done task Checked tasks appear in Done and keep their source Markdown intact.

List

Compact vault-wide task scanning for every Markdown checkbox outside fenced code blocks. Open a task to jump to the exact source line.

Calendar

Due-date review for scheduled tasks. Waiting and done tasks stay out of normal due-date buckets so the calendar stays focused on active work.

Kanban

Drag tasks between columns grouped by status, priority, folder, or a custom @status workflow you define. The board updates immediately, then ZenNotes writes the source Markdown task line asynchronously.

Inline task metadata

Metadata tokens are stripped from the display title but stay in the Markdown line on disk.

tags: [task]
A whole note as a task. Tag a note’s frontmatter with task to make the note itself a task (TaskNotes-style), with status, priority (high/normal/low), due, and scheduled in frontmatter — interoperable with TaskForge and Obsidian. Task files appear in the Tasks List/Calendar/Kanban next to inline checkboxes. Quick-add from the command palette (“New Task” / “New Task in Folder…”), the “+ New task” button, the a key (Vim), or :newtask / :task (:newtask Projects/Website targets a folder); new files default to your configured tasks location (Settings → Vault → Notes → Default tasks location; inbox by default). Checking one off writes status: done plus a completedDate; rescheduling or changing its Kanban column updates the matching frontmatter field; deleting it trashes the note.
due:YYYY-MM-DD
Due date in ISO format.
!high / !med / !low
Priority. Short aliases like !h, !m, and !l are also recognized.
@waiting
Waiting or blocked task. Waiting overrides due-date grouping until the marker is removed.
@status:<id>
Free-form workflow status for the custom-status Kanban board. The <id> is a slug like backlog, in_progress, or review. A note-level status: frontmatter key sets a default for that note’s tasks.
[>]
Forwarded task. Type > in the checkbox (or use the palette, or > in the Tasks list) to move it to another note; the original stays as a - [>] … [[Target]] record and a backlinked - [ ] copy is added to the target. Grouped under Forwarded.
#tag
Task tag, shown alongside the task and shared with the note tag model.

Kanban status columns

Status columns are derived from checkbox state, due date, and @waiting. Dragging between columns rewrites only the affected task line.

Today
Unchecked tasks with no due date, overdue tasks, and tasks due today. Unchecks the task, removes @waiting, and sets due: to today.
Upcoming
Unchecked tasks with a future due date. Unchecks the task, removes @waiting, and preserves a future due date or sets tomorrow.
Waiting
Unchecked tasks with @waiting. Unchecks the task and adds @waiting.
Done
Checked tasks. Checks the task.

Custom statuses

Beyond the derived Status columns, the Kanban “Group by” menu has a Custom status board whose columns are a free-form workflow you define.

  • List the columns, in order, in config.toml under [view], e.g. kanban_statuses = ["backlog", "in_progress", "review", "done"].
  • Tag a task with an inline @status:<id> token, e.g. - [ ] Ship it @status:review. A note-level status: frontmatter key sets a default for that note’s tasks.
  • Dragging a card, or pressing Shift+H / Shift+L, rewrites the @status token; the trailing “No status” column clears it.
  • Statuses found on tasks but missing from the config still appear as columns, so nothing is hidden.
  • Reorder the columns by dragging a column header, or pressing < / > with a column focused; the arrangement is saved per board (the “No status” column stays last).
  • Rename a column by clicking its title (or [kanban_column_titles] in config.toml). The rename is a display label only: the column still shows its underlying @status:<id> beneath the name, and moving a card into it writes that value, not the label.

Kanban column titles

Column titles are editable display labels. Click the title or pencil icon, rename it, and press Enter or click away to save. Clear the field to reset the default label.

  • Renaming a column does not change task grouping or task metadata.
  • Status columns can be labelled Backlog, Todo, In Progress, Done, or any workflow labels you prefer.
  • While dragging, the insertion line marks the exact spot where the card will land.
  • Same-column reordering changes the local Kanban order only; it does not rewrite task metadata.

Remote and self-hosted

The practical model for Docker, browser access, desktop-to-server use, and the security posture you get out of the box.

Browser login uses the token once, then a session cookie

In self-hosted web mode, ZenNotes asks for the server auth token once, then the server issues an HttpOnly, SameSite=Strict session cookie. Refresh should keep working without leaving the token in the URL or browser local storage.

Docker serves a host-mounted vault

Your notes stay in a normal host folder. Docker mounts that folder into the server container; ZenNotes is serving the host files, not copying them into container-only storage.

Desktop can use the same remote vault

The desktop app can connect to the same ZenNotes server the browser uses. Saved Remote Workspaces let you keep multiple servers or vaults ready, change the active remote vault later, and switch back to a local vault cleanly.

Folder changes sync live across clients

Creating or deleting a folder in one client now appears in any other open client sharing the same vault — including the self-hosted web app — without a manual refresh. Empty folders used to show up only on reload.

Browse access is intentionally scoped

The server-side vault picker only sees allowed mounted roots. If a folder is not mounted or not inside the configured browse roots, the browser picker and remote desktop flow will not be able to select it.

Vault paths refuse symlink escapes

Note read, write, rename, delete, asset upload, and folder operations all walk each existing path component and resolve symlinks. Any link that points outside the canonical vault root is rejected before any file is touched, so a planted symlink inside the vault cannot be used to read or overwrite host files.

TLS is operator-declared

The Go server does not terminate TLS itself. Set ZENNOTES_BEHIND_TLS=1 once a reverse proxy is in front and the server marks cookies Secure and emits HSTS. ZENNOTES_TRUSTED_PROXIES then controls which TCP peers may set X-Forwarded-Proto and X-Forwarded-For so the flags cannot be flipped by an arbitrary client.

Rotate the auth token without restarts

POST /api/session/rotate-token replaces the bootstrap token, persists it with mode 0600, and invalidates every existing session. Requires the current token in the body even when authenticated, so a stolen session alone cannot rotate the secret.

Tight defaults for modes and size caps

New notes default to 0600 and directories to 0700 on Unix hosts; tune with ZENNOTES_VAULT_FILE_MODE / ZENNOTES_VAULT_DIR_MODE if needed. Per-request body limits cap note writes (10 MiB) and asset uploads (50 MiB) so a single bad request cannot fill the disk.

Login backoff makes weak tokens cost time

Repeated failed logins from the same client incur exponential backoff (1, 2, 4, 8, 16, 32, 60 seconds). Combined with the 256-bit bootstrap-token entropy, brute-force is not a realistic threat — but the backoff still protects users who set a short manual token.

At-rest encryption is the operator's call

Notes are written as plain Markdown so any tool can back them up or read them. For VPS-snapshot or stolen-disk threats, layer encrypted backups (Borg, restic) and an encrypted volume (LUKS, ZFS native, APFS encrypted) underneath the vault path. The repo docs include a cookbook for each.

Remote mode is visibly different

When desktop is using a server-backed vault, ZenNotes shows a Remote badge in the sidebar and title bar, labels copied paths as server paths, and keeps local-only file-manager actions separate from remote workspaces.

The browser and desktop share the same product core

Editor behavior, Markdown rendering, slash commands, picker behavior, and most settings come from the same shared app core. The main differences are runtime-specific things like native file dialogs, desktop save-to-PDF, and browser print-to-PDF.

Keyboard shortcuts

Every binding is remappable in Settings. Mod is on macOS, Ctrl on Windows and Linux.

Global shortcuts

These work across the main app shell.

Mod+P
Search notes Open the note search palette.
Mod+F
Search notes (non-Vim) Open the note search palette directly when Vim mode is off.
Shift+Mod+P
Open commands Open the command palette.
Shift+Mod+N
New Quick Note Create a quick capture note in the main window and focus its title.
Mod+,
Open Settings Appearance, editor behavior, fonts, vault controls.
Mod+1
Toggle sidebar Hide or show the left sidebar.
Mod+2
Toggle connections Toggle the connections panel for the active editor pane.
Mod+3
Toggle outline panel Toggle the heading-outline panel for the active editor pane.
Mod+Shift+C
Toggle comments panel Show or hide the Comments panel for the active pane.
Mod+Alt+M
Add comment Start a comment on the selected text (or current line) without reaching for the mouse.
Mod+B / Mod+I / Mod+E / Mod+K
Inline format the selection Bold, italic, inline code, and link. Plus Shift+Mod+S strikethrough, Shift+Mod+H highlight, and Shift+Mod+M math. These work on every platform, in or out of Vim mode (Mod is ⌘ on macOS, Ctrl on Windows/Linux).
Mod+/
Focus the selection toolbar Select text and a Notion-style bubble toolbar pops up; Mod+/ focuses it. Arrow keys (or h/j/k/l in Vim mode) move across the formats and up to the “Turn into” block menu; Enter applies, Esc returns to the text.
Alt+H / Alt+J / Alt+K / Alt+L
Focus pane left/down/up/right Always-on pane-focus motions — they work even with Vim mode off, and skip the Ctrl+W prefix some Linux setups intercept. (Ctrl+W h/j/k/l still works in Vim mode.)
Mod+4 / Mod+5 / Mod+6
Edit / Split / Preview mode Switch the active note between the raw editor, side-by-side split, and rendered preview.
Shift+Mod+Space
Open quick capture window Open the floating, always-on-top capture window. Also bound system-wide (default Cmd/Ctrl+Shift+Space) so it works over any app; change it under Settings → Editor.
Shift+Mod+E
Export Note as PDF Desktop saves a PDF directly; browser opens the print-friendly export view.
Mod+.
Toggle Zen mode Hide or restore the app chrome.
Mod+W
Close active tab Close the current note or virtual tab.
Alt+Z
Toggle word wrap Switch between wrapped lines and horizontal scrolling.
Mod+= / Mod+- / Mod+0
Zoom in / out / reset Scale the whole app UI; the zoom level persists across sessions.
Esc
Dismiss overlay Close note search or the command palette.

Quick capture window

These apply inside the floating capture window, opened with the quick capture hotkey.

Mod+Enter
Save and hide Save the note into Quick Notes and hide the window. A fresh capture clears for next time; an opened note is left as you left it.
Mod+N
New note Save the current note, then open a fresh blank capture without hiding the window.
Mod+P
Open a note Search the vault and load an existing note into the window to edit it in place.
Shift+Mod+P
Command palette Run a capture command: save, save without hiding, start a new note, or open another note.
/
Slash commands Open the same insert menu as the main editor (headings, lists, to-dos, code, table, callout, and more). Type /td then Enter to drop a todo; Esc closes the menu without saving.
Esc
Dismiss Close an open overlay; otherwise save and hide the window.

Pane and panel motion

The primary keyboard-first movement patterns. The Vim-style ones assume Vim mode is on.

Ctrl-w h/j/k/l
Move focus Move between sidebar, note list, editor, connections, or adjacent panes.
Ctrl-w v
Split right Clone the current tab into a pane to the right.
Ctrl-w s
Split down Clone the current tab into a pane below.
Space o
Open buffers Show a searchable list of every open buffer across every pane.
Space f
Search notes Open the vault-wide note search palette.
Space s t
Search vault text Fuzzy-search matching text lines across notes.
Space e
Toggle left sidebar Show or hide the folder/tag sidebar.
Space p
Note outline Jump to any heading in the active note.
Space (pause)
Show leader hints Open a which-key style guide if hints are enabled.
Mod+3
Toggle outline panel Show or hide the persistent outline in the active pane.
zc / zo
Fold / unfold heading Collapse or expand the section below the heading at the cursor.
zM / zR
Fold / unfold all Collapse or expand every heading section in the note.
Ctrl-o
Go back Jump to the previous note location in history.
Ctrl-i
Go forward Jump forward in note history.
gt / gT
Next / previous tab Move through tabs in the active pane (also :tabnext / :tabprevious). Rebindable under Settings → Keymap.
Space h
Hint mode Show jump labels for clickable targets. Hint mode moved off f to <leader>h in 2.3.0, so the f / t find-char motions work normally in the editor. Hinting a note drops you straight into the editor.

Palettes and pickers

These apply once a palette, search overlay, or picker already has focus — the command palette, note search, vault text search, outline, buffer switcher, the [[ reference picker, the / slash menu, and the date and template pickers.

ArrowDown / Ctrl+N / Ctrl+J
Move to the next result Ctrl+J / Ctrl+K work the same in every picker, so they never collide with the global Search-notes shortcut on Windows and Linux.
ArrowUp / Ctrl+P / Ctrl+K
Move to the previous result Matches the same picker navigation model as the next-item binding.
Enter
Run or open the selected result Open the selected note, heading, buffer, command, or search hit.
Esc
Close the picker Dismiss the overlay and return focus to the previous surface.
Type to filter
Narrow the current result set Each picker filters its own data live as you type.

Sidebar and list navigation

These bindings work when the sidebar or note list owns focus in Vim mode.

j / k
Move selection Move down or up one visible item.
g g / G
Jump to top or bottom Fast travel to the first or last visible row.
Enter / l
Open item Open the selected note, folder, tag, or built-in row.
h
Collapse or move left Collapse the current folder or move focus back toward the editor.
o
Toggle folder Expand or collapse the selected folder in the sidebar.
/
Search notes Open note search from keyboard navigation mode.
m
Open context menu Open the right-click menu for the selected row.
Esc
Return to editor Drop back into the main editor focus path.

Editor writing aids

Inline completions that appear while you type in the Markdown editor.

/
Open slash commands Insert menu for headings, lists, to-dos, callouts, code blocks, dividers, tables, math, links, images, new page.
Type after /
Filter the insert menu Narrow the slash command list by name, then confirm to insert.
@
Open date + note menu Inline suggestions for Today, Yesterday, Tomorrow, plus matching notes (picking one inserts a [[wikilink]]).
Type after @
Filter date suggestions Match by weekday, month, day number, or ISO date fragment.

Preview and connections

These keys apply when reading preview content or the connections panel.

j / k
Scroll preview Move through rendered preview content line-by-line.
Ctrl-d / Ctrl-u
Half-page scroll Move preview content by half a viewport.
g g / G
Jump to top or bottom Go to the start or end of the preview or connections list.
m / Shift+F10
Open active tab menu Close, Split, Pin, Pin as Reference, Floating Window, Reveal.
/
Search notes Open note search without leaving keyboard navigation.
p
Peek backlink In connections, open a hover preview for the selected note.
h / Esc
Back out Return from hover preview to connections, or from connections to the editor.

Tasks, tags, and trash

These virtual views each run their own keyboard loop in the main pane, and the Vim leader works here too (for example Space h for hint mode).

j / k
Move row cursor Step through task rows, tagged notes, or trashed notes.
g g / G
Jump to top or bottom Move to the first or last visible result.
Enter / o
Open current result Open the selected source, tagged note, or trashed note.
x
Toggle task Tasks view only: check or uncheck the selected task. Space also toggles unless Space is your Vim leader key, in which case it starts a leader sequence.
>
Forward task Tasks list only: forward the selected task to another note via a picker. The original becomes a forwarded record ([>]) linking to the target; a fresh copy is added there. Forwarded tasks group under “Forwarded”.
h / l
Move Kanban column focus Kanban view only: move left or right between columns.
j / k
Move Kanban card focus Kanban view only: move through cards in the focused column.
Shift+H / Shift+L
Move Kanban card Kanban view only: send the focused card to the previous or next column, applying that column’s change (status, priority, or custom @status). The keyboard equivalent of dragging.
r
Restore trashed note Trash view only.
x / d
Delete forever Trash view only. Asks for confirmation.
/
Filter the view Focus the local filter box.
:
Open local ex prompt Run the view-specific command line inside Tasks or Tags.
Esc
Clear the filter Clears an active filter. These views are tabs, so Esc no longer closes them — close with :q or the close button in the tab header.

Database grid (Table view)

The CSV database grid is fully keyboard-driven, vim-style. It takes focus on open (and after a Ctrl+O jump back), so motions work without clicking a row first. Editing a column name no longer swallows h/j/k/l.

h / j / k / l
Move the cell cursor Arrow keys also work. 0 / ^ jump to the first column, $ to the last.
H / L
Move the current column left / right Reorders columns from the keyboard and the cursor follows. You can also drag a column header, or use “Move left / Move right” in the field menu (⋯).
g g / G
Jump to first / last row Fast travel within the current column.
k (into header)
Rename a field Press k up onto the column-header row, then Enter / i to rename the field, or m to open its column menu.
i / Enter
Edit the cell On a checkbox cell this toggles it instead of opening an editor.
m
Open the row menu On a cell, open the right-click menu for that record (Open, Delete, …).
Space / x
Select the row Toggle the row selection for bulk actions.
o
Open the record page Open the row as a Markdown note in the per-database folder.
Ctrl-o
Jump back to the grid From a record page, return to the database grid — whether you opened it as a .csv file or via New Database.
Ctrl-w k/j/h/l
Move to tabs or panes Move between the grid, the tab strip, and split panes, exactly like from the editor.
a
Add a row Append a new empty record and move the cursor to it.
d d
Delete the row Remove the record at the cursor.
Esc
Clear selection / leave the grid Clears a multi-row selection first, then blurs the grid.

Vim ex commands

Run any of these from the : prompt. Tab on the ex line completes commands and supported arguments.

:w
Save the active note Flush the current buffer to disk immediately.
:q
Close the current tab or virtual view Closes the active note or virtual tab (Tasks, Tags, Help, Trash).
:wq
Save and close Writes the current note, then closes it.
:format
Format Markdown Runs Markdown formatting on the active note.
:tasks
Open Tasks Open the vault-wide Tasks virtual tab.
:template / :tmpl
New note from a template Open the template picker. With an argument like :template ADR, create from the best match directly.
:daily
Open today’s daily note Open or create today’s daily note (requires daily notes enabled). Uses the assigned daily template.
:weekly
Open this week’s note Open or create this week’s note titled YYYY-Www (requires weekly notes enabled). Uses the assigned weekly template.
:monthly
Open this month’s note Open or create this month’s note titled YYYY-MM (requires monthly notes enabled). Uses the assigned monthly template.
:tag foo bar
Open Tags with a selection Open the Tags view and replace the tag set with the given tags.
:trash
Open Trash Open the built-in Trash recovery view in the active pane.
:split / :vsplit
Split the current tab Clone the active tab down or right.
:edit path / :e path
Open or create by vault path Open a note by vault-relative path; create if needed.
:new [path]
Create a new note No path → new inbox note. With a path → opens or creates exactly there.
:move [folder] / :mv
Move the active note No argument opens the move prompt. With a path like archive/Reference, moves directly.
:bn / :bp
Cycle tabs Move to the next or previous tab.
gt / gT
Next / previous tab Move through the tabs in the active pane. Also :tabnext / :tabprevious (shown in the : autocomplete). Both rebindable under Settings → Keymap.
:buffers / :ls
Open the buffer switcher List the current pane’s open buffers in a searchable overlay.
:bd / :bc
Close the active tab Buffer-delete aliases for the current tab.
:only
Close sibling tabs Keep only the active tab in the current pane.
:closepanel / :closep
Close the right panel Dismiss whichever right-hand panel is open (connections, outline, comments, calendar). Also a “Close Right Panel” command in the palette.
:qa / :quitall / :xa / :wa
Close every tab everywhere Closes all tabs across all panes.
:help / :h
Open this manual Bring up the built-in Help tab.
:demo_generate / :demo_remove
Seed or remove the demo tour Install or remove onboarding notes under inbox/demo.
:cmd query / :commands
Run or browse palette commands Fuzzy-run the best matching command, or open the palette.
:tab_menu / :tab_close_others / :tab_close_right
Tab-menu actions from the ex line Every palette tab action is also on the : line.
gd
Follow the link under the cursor Open wikilinks, external links, create missing notes, or pin PDFs.
<Tab> on the ex line
Complete ex commands Cycle through registered commands with a wildmenu popup; complete args like :view edit|split|preview.
<Space> l f
Leader-format Format the active note from normal mode.
<Space> l y
Leader-copy as Markdown Copy the whole note's Markdown to the clipboard from normal mode.
<Space> (pause)
Show leader hints Which-key overlay for the next available leader actions.
<Space> o
Leader buffer switcher Open every open buffer across every pane.
<Space> f
Leader note search Open the vault-wide note search palette.
<Space> e
Leader toggle sidebar Show or hide the left sidebar.
<Space> p
Leader note outline Searchable list of every heading in the active note.
<Space> t
Leader new from template Open the template picker to create a note from a built-in or custom template.
<Space> d
Leader today’s daily note Open or create today’s daily note when daily notes are enabled.
<Space> w
Leader this week’s note Open or create this week’s note when weekly notes are enabled.
<Space> m
Leader this month’s note Open or create this month’s note when monthly notes are enabled.
:outline
Note outline palette Ex-line path to the searchable note outline.
:view edit|split|preview
Switch the active note layout Editor-only, side-by-side split, or preview-only.
:zn [toggle|on|off]
Toggle Zen mode :zn toggles; :zn on / off force a state.
:editmode / :splitmode / :previewmode
Direct mode aliases Single-command aliases for switching the active note layout.
:fold / :unfold
Toggle the heading at the cursor Collapse or expand the section beneath the current heading.
:foldall / :unfoldall
Fold every heading Collapse or expand every heading section at once.

zn CLI

zen is a small command-line tool bundled with the desktop app. It talks to your local vault directly, so any command you can do from the app you can also script from a shell. Pass --json on any command for machine-readable output.

Install

The CLI is shipped inside the desktop bundle. Open Settings → CLI and click Install — ZenNotes drops a zen shim into the first writable directory it finds on your $PATH (~/.local/bin, ~/bin, or /opt/homebrew/bin). The macOS admin prompt is only used when nothing user-writable is on $PATH.

  • The Install / Uninstall / Open CLI Settings actions are also in the command palette under the CLI category.
  • ZENNOTES_VAULT overrides the resolved vault root, useful when scripting against a non-default vault.
  • --no-color and the NO_COLOR environment variable disable ANSI color in the help output.
  • Run zn --help for the live command list, or zn --version for the CLI version.

Notes

zn list
List notes, most recent first --folder <f> --tag <t> --limit <n> --json
zn read <path>
Print a note body to stdout --meta --json
zn create
Create a new note. Body from --body or stdin --title <t> --folder inbox|quick|archive --subpath <p> --tag <t> --body "..."|-
zn write <path>
Replace a note body. Destructive — prefer append --body "..."|-
zn append <path>
Append text to the end of a note --body "..."|-
zn prepend <path>
Insert text at the top, after frontmatter --body "..."|-
zn rename <path>
Rename a note (filename only) --to <new title>
zn move <path>
Move a note to a different folder --folder <f> --subpath <p>
zn archive <path>
Move a note into archive/
zn unarchive <path>
Move it back from archive/
zn trash <path>
Soft-delete; reversible via restore
zn restore <path>
Restore a trashed note to inbox
zn delete <path>
Permanent delete --yes
zn duplicate <path>
Copy a note next to itself

Search

zn search <query>
Full-text search across live notes --limit <n> --json
zn search-title <q>
Match notes by title (substring) --json
zn backlinks <path>
Notes linking to this one via [[wikilink]] --json

Folders, tags, tasks

zn folder list
List every subfolder in the vault --json
zn folder create <p>
Create a subfolder, e.g. inbox/Work
zn folder rename <p>
Rename a subfolder in place --to <newPath>
zn folder delete <p>
Delete a subfolder and everything in it --yes
zn tag list
Every #tag with its note count --json
zn tag find <tag>
Notes carrying this #tag --limit <n> --json
zn task list
Open checkbox tasks across all notes --unchecked --all --tag <t> --json
zn task toggle <id>
Flip a task checkbox by stable id

Vault, capture, MCP

zn vault info
Vault path + per-folder counts --json
zn capture "..."
Quick add. Pipes stdin if no positional --folder <f> --tag <t> --title <t> --json
zn mcp
Start the MCP stdio server (Claude / Codex)

Examples

Common one-liners. Pipe stdin into capture, append, prepend, create, or write with --body -.

$ zn capture "Meeting takeaways" --tag work
$ pbpaste | zn append inbox/Daily.md --body -
$ zn search "deadline" --json | jq '.[].path'
$ zn list --tag idea --limit 5
$ zn task list --unchecked --tag work

MCP via the CLI

zn mcp launches the same MCP stdio server the app uses. New Claude Code, Claude Desktop, and Codex installs prefer this entry whenever the CLI is present, so the server upgrades alongside the app. Existing mcp.js integrations keep working unchanged.

  • MCP vault_info reports primaryNotesLocation and an inboxAbsolutePath so assistants pick the right folder for new notes.
  • Tool descriptions explain that the returned path is canonical — never prefix inbox/ yourself when the vault is in root mode.

MCP and AI assistants

ZenNotes ships a local Model Context Protocol (MCP) server so AI assistants — Claude Code, Claude Desktop, and Codex — can read and write your vault directly. Manage it in Settings → MCP (desktop).

The MCP server exposes your vault to compatible assistants over the Model Context Protocol. Because it operates on the same plain Markdown files as the app, anything an assistant creates or edits shows up immediately in ZenNotes. The server runs locally via the bundled zn CLI (zn mcp).

Open Settings → MCP to see the server status (Ready, Not built, or Checking), reveal the exact launch command, connect clients, and edit the system prompt sent to assistants.

Connect an assistant

One-click install writes a managed ZenNotes entry into each client config. Uninstall removes only that entry.

Claude Code
Install the ZenNotes MCP server for Claude Code Settings → MCP → Integrations. Writes a managed entry to the Claude Code MCP config.
Claude Desktop
Install for Claude Desktop Settings → MCP → Integrations. Updates the Claude Desktop config JSON.
Codex
Install for Codex Settings → MCP → Integrations. Updates the Codex TOML config.
Instructions
Edit the system prompt assistants receive Settings → MCP → Instructions. Default or custom; saved to .zennotes/mcp-instructions.md.
zn mcp
Start the MCP stdio server manually Run zn mcp in a terminal to point any MCP client at the vault.

What an assistant can do

The MCP server exposes the full vault toolset — read, search, create, edit, organize, and manage tasks.

vault_info
Vault path, primary notes location, and per-folder counts Reports primaryNotesLocation and the inbox absolute path.
list_*
list_notes, list_folders, list_assets, list_tags, list_tasks Enumerate vault contents.
read_note
Read a note body and metadata By vault-relative path.
create_note / write_note
Create a note or replace its body write_note is destructive; prefer append/prepend.
append / prepend / insert_at_line
Add content without rewriting the whole note Targeted edits.
replace_in_note
Find-and-replace within a note String replacement.
rename / move / duplicate
Reorganize notes Filename, folder, or copy.
archive / trash / restore / delete
Lifecycle operations trash is reversible; delete is permanent; empty_trash clears it.
folder create / rename / delete
Manage folders Nested paths supported.
search_text / search_by_title / search_by_tag
Find notes Full-text, title, or tag.
backlinks
Notes linking to a given note Via [[wikilinks]].
list_tasks / toggle_task
Read and check off tasks By stable task id.

Raycast extension

On macOS, ZenNotes can install a Raycast extension so you can search and act on notes without opening the app. Install it from Settings → CLI → Raycast.

Install

ZenNotes copies the bundled extension into app data, installs its dependencies, builds it, and imports it into Raycast.

  • Requirements: the zn CLI installed, Node 22.14+ and npm 7+, and Raycast.
  • Open Settings → CLI → Raycast on macOS and press Install (or Update / Reinstall after upgrading the app).
  • The extension talks to your vault through the zn CLI, so it always reflects the live files.

Search Notes command

Raycast’s “Search Notes” command lists notes and offers actions on the selected note.

Filter
Filter results by folder or tag Narrow the note list inside Raycast.
Open
Open the note in ZenNotes Via the zennotes:// URL scheme.
Open in Window
Open the note in a floating window Desktop floating-window view.
Archive / Unarchive
Move the note to or from Archive Without leaving Raycast.
Trash
Move the note to Trash Recoverable from the Trash view.
Reveal
Reveal the note in Finder Shows the underlying .md file.
Copy
Copy the note path or a [[wikilink]] For pasting elsewhere.

Inline comments

Highlight a passage in any note and leave a comment anchored to the text. Press Mod+Alt+M (or open the text menu with m) to start a comment, and Mod+Shift+C to toggle the panel itself. Comments live in a side panel on the editor and stay attached to their selection as the surrounding paragraph evolves.

Anchored to the selection

Each comment stores the selected range plus the text snippet itself. If the surrounding paragraph drifts, ZenNotes re-locates the anchor by snippet so the comment never points at the wrong place.

Side-of-line markers

A small marker sits inside the editor's right padding next to the line that owns the comment. Click it (or click the card in the sidebar) to jump back to the anchored text.

Resolve when done

Resolved comments stay in the note's history but disappear from the active sidebar. Reopen the panel anytime to revisit them.

Plain-file friendly

Comments are persisted next to the note, so the Markdown source itself stays clean and diff-friendly. Your .md files don't grow comment clutter.

Settings reference

Every setting in ZenNotes, grouped by panel.

Appearance

Theme, mode, and variant
Pick a theme family — Apple, Gruvbox, Catppuccin, GitHub, Solarized, One, Nord, Tokyo Night, Kanagawa (Wave / Dragon / Lotus), or the monochrome, true-black (OLED-friendly) Black Metal — plus light or dark mode and the active flavor where supported.
Dark sidebar
Tint the sidebar slightly darker than the canvas so chrome reads as a distinct surface.
Sidebar arrows
Show or hide disclosure arrows for collapsible sidebar folders and sections. When hidden, folders and files still stay aligned.

Editor behavior

Vim mode
Turn CodeMirror Vim bindings on or off for the editor and reference pane.
Leader key hints
Show a which-key style guide after pressing Leader. Available when Vim mode is enabled.
Leader hint behavior
Choose between timed auto-hide or a sticky overlay that stays open until dismissed.
Leader hint duration
When timed, control how long the overlay stays visible and how long the pending sequence remains active.
Scroll offset
Vim scrolloff — keep N lines visible above and below the cursor so it never hugs the top or bottom edge. Default 0 (off). Only applies with Vim mode on.
Time format
Clock format the @time / @now macro inserts — 12-hour or 24-hour.
Vault text search backend
Auto, built-in, ripgrep, or fzf. Auto prefers system tools when installed. Settings shows the resolved runtime backend.
Live preview
Hide Markdown syntax on lines you are not actively editing.
Note tabs and wrap tabs
Enable tab-based editing, and wrap the tab strip when it overflows.
Word wrap
Wrap long lines to editor width or let them scroll horizontally (also Alt+Z).
Blinking cursor
Blink the editor caret and Vim block cursor, or turn it off for a solid cursor — e.g. to match the macOS "Prefer non-blinking cursor" accessibility setting.
Smooth preview scroll
Animate Ctrl+D / Ctrl+U half-page scrolling in the preview pane.
PDFs in edit mode
Choose between compact PDF cards or full inline PDF embeds while editing.
Date-titled Quick Notes
Name quick notes by date instead of timestamp-based titles.
Quick Note prefix
Choose the prefix used for new quick note titles, or leave it blank for a bare timestamp/date.
Quick capture hotkey
Record, reset, or disable the system-wide hotkey (default Cmd/Ctrl+Shift+Space) that opens the floating quick-capture window.

Typography and layout

Interface, text, and monospace fonts
Choose different fonts for chrome, reading text, and code blocks.
Font size and line height
Tune reading density in the editor and preview.
Reading and editor width
Cap long lines so wide windows stay readable.
Content alignment
Center note content in its column or left-align to the pane edge.
Line numbers
Off, absolute, or relative gutter numbering.
Line number position
Keep the gutter next to the centered text or pin it to the editor edge.

Keymaps

Shortcut overrides
Remap global shortcuts, Vim bindings, panel navigation, and view actions from one place.
Recorded sequences
Capture single shortcuts or multi-step sequences like Leader flows, pane prefixes, g g, g d, or fold motions — no raw config editing.
Context-menu bindings
The same keymap table controls the context-menu action used across the sidebar, note list, and active-tab menu.
Reset controls
Clear an individual override or reset the entire keymap table to shipped defaults.

Vault

Vault location
Reveal or change the root folder ZenNotes treats as the active vault.
Primary notes location
Choose whether Inbox stays the main notes area or whether the vault root itself becomes the primary notes surface.
Daily notes
Enable daily notes, choose the directory, and assign a template so each day’s note starts pre-filled. Open today’s note with Space d, :daily, or the command palette.
Weekly notes
Enable weekly notes with a YYYY-Www title, choose a directory, and assign a template. Open this week’s note with Space w, :weekly, or the command palette.
Monthly notes
Enable monthly notes with a YYYY-MM title (e.g. 2026-07), choose a directory, and assign a template. One note per calendar month, handy for monthly reviews and reflections. Open this month’s note with Space m, :monthly, or the command palette. Each notes section collapses its fields when its toggle is off.
Folder icons
Right-click a folder in the sidebar and choose a custom icon that follows the current theme colors.
Saved Remote Workspaces
Save multiple remote servers or vaults, reconnect from Settings or the command palette, and edit or remove them later.
Remote workspace controls
When connected remotely, Settings exposes Change Remote Vault…, Return to Local Vault, and Open Local Vault….

Templates

Template library
Browse every template — built-in and custom — in one place.
Create a custom template
Author a new template as Markdown with optional frontmatter (name, description, category, titleTemplate, targetFolder, targetSubpath) and variables. Saved as a .md file in .zennotes/templates/.
Edit or reset built-ins
Press Edit on a built-in to fork an editable copy that shadows the original; Reset removes the copy and restores the built-in. Custom templates can be edited or deleted directly.
Remove or restore built-ins
Hide all the shipped templates with “Remove Built-in Templates” (a button here, or the command palette; it asks first), and bring them back with “Restore Built-in Templates”. Your custom templates — and anything already pointing at a built-in by id, like a daily-note template — keep working.
Save current note as template
The “Save Current Note as Template…” command captures the active note as a new custom template.

MCP

MCP server status
Shows whether the local MCP server is Ready, Not built, or Checking, and reveals the exact launch command.
Client integrations
One-click install/uninstall a managed ZenNotes entry for Claude Code, Claude Desktop, and Codex.
Instructions editor
Edit the system prompt sent to assistants; default or custom, saved to .zennotes/mcp-instructions.md.

CLI

Install zen
Install the bundled `zn` command into a user-writable directory on $PATH (~/.local/bin, ~/bin, or /opt/homebrew/bin preferred). Falls back to the macOS admin prompt only when no user-writable target is on $PATH.
Uninstall zen
Remove the installed shim. Never touches an unmanaged binary that happens to share the same path.
Reinstall / update
Reinstalls the shim against the current desktop build, useful after upgrading the app.
Status and path
Shows whether `zn` is installed, where it lives, and which app build it points to.

About

App identity
App icon, current version, and a short description of ZenNotes.
Configuration file
Portable preferences are mirrored to a plain-text config.toml you can sync across machines. See the Configuration file reference below for its location, full contents, and how to use it.
Lumary Labs
About section links to lumarylabs.com.

Configuration file (config.toml)

Your portable preferences live in one plain-text TOML file you can read, hand-edit, and sync across machines. Desktop app only — the web app keeps its settings in the browser.

Where it lives

macOS / Linux
~/.config/zennotes/config.toml Honors $XDG_CONFIG_HOME when set.
Windows
%APPDATA%\zennotes\config.toml Standard per-user app-data location.
$ZENNOTES_CONFIG_DIR
Override the directory Point the config anywhere — handy for a custom dotfiles layout or testing.
Settings → About
Reveal · Copy path Open the file in your file manager or copy its full path.

What it contains

A trimmed example. The real file lists every option (with allowed values) and every keymap action (defaults commented out).

# ZenNotes configuration  —  portable preferences (theme, editor, vim,
# keymaps, …) you can sync across machines with git, stow, or chezmoi.
# Safe to hand-edit; changes apply live, no restart. Every option is listed
# with its allowed values; a removed option reappears with its default.

config_version = 1

[vim]
enabled = true  # true | false — CodeMirror Vim bindings
insert_escape = ""  # key sequence to leave insert mode, e.g. "jk"; empty disables
yank_to_clipboard = false  # also copy Vim yank/delete/change to the clipboard

[search]
backend = "auto"  # auto | builtin | ripgrep | fzf
ripgrep_path = ""  # absolute path to ripgrep; empty = look on $PATH

[editor]
live_preview = true  # hide markdown syntax on inactive lines
render_tables = true  # render tables as widgets in live preview
font_size = 16  # editor + preview font size (px)
line_height = 1.65  # line-height multiplier
word_wrap = true  # wrap long lines vs. scroll horizontally
# … more editor options …

[appearance]
theme_family = "gruvbox"  # apple | gruvbox | catppuccin | github | nord | tokyo-night | kanagawa | …
theme_mode = "dark"  # light | dark | auto

[typography]
text_font = ""  # editor + preview font; empty = system default
mono_font = ""  # code / monospace font; empty = system default

[view]
tasks_view_mode = "kanban"  # list | calendar | kanban
calendar_week_start = "monday"  # monday | sunday | locale
# … more view options …

# Keymap overrides — uncomment a line and edit the binding to remap.
# Binding syntax: "Mod+P" = Cmd/Ctrl+P, "Shift+Mod+K", "Ctrl+W", "Space",
# or a two-key sequence like "g g".
[keymaps]
"global.focusPaneLeft" = "Ctrl+H"          # an active override
# "global.commandPalette" = "Shift+Mod+P"  # Open command palette
# "global.modePreview" = "Mod+6"           # Switch to preview mode
# "tasks.moveTaskUp" = "K"                 # Move task up
# … every action is listed, defaults commented out …

# Rename the built-in folders (inbox, quick, archive, trash).
[folder_labels]
# inbox = "Notes"

# Kanban column titles, keyed by "<groupBy>:<columnId>".
[kanban_column_titles]
# "status:todo" = "To Do"

How to use it

  • Sync it: commit the file to your dotfiles and pull it on another machine — theme, editor, Vim, keymaps, fonts, and search backend all carry over (git, stow, chezmoi, …).
  • Live and two-way: hand-edit the file (or git pull a synced copy) and changes apply immediately, no restart; change a setting in the app and the file updates to match.
  • Self-documenting: every option shows its allowed values inline, and every keymap action lists its default binding (commented out) — uncomment and edit to remap.
  • Nothing to set up: your current preferences are written out automatically on first launch, and a removed option reappears with its default the next time the app rewrites the file.
  • Machine-specific layout (window size, pane widths, collapsed folders) is deliberately kept out, so the file does not churn as you work.
  • Comments you add yourself may be dropped when the app rewrites the file.

Custom themes & overrides

Theme ZenNotes with your own CSS — author a full theme, or layer a small override on top of any theme. Both are plain files under ~/.config/zennotes/ and apply live, no restart.

Two ways to customize

A theme is a complete palette you select under Settings → Appearance → Custom. An override is a small CSS file that layers on top of whichever theme is active, toggled on or off under Settings → Appearance → Overrides.

Reach for a theme to design a whole look; reach for an override to change one or two things — a different accent, a darker background — without forking a theme.

Build a custom theme

Settings → Appearance → Custom → New theme scaffolds a folder at ~/.config/zennotes/themes/<name>/ with a manifest.json and a theme.css, reveals it, and adds a card you click to apply. Edits to theme.css apply live.

Only the active theme's CSS is loaded, so you write unscoped selectors: put light or shared values under :root, and dark-mode overrides under :root[data-theme-mode="dark"]. You never put the theme name in a selector. Colors are space-separated RGB triplets, e.g. --z-accent: 255 59 48; (= #ff3b30).

A starter theme.css

:root {
  --z-bg: 255 255 255;        /* space-separated RGB triplets */
  --z-bg-softer: 245 245 247;
  --z-fg-1: 29 29 31;
  --z-accent: 0 122 255;
}
:root[data-theme-mode="dark"] {
  --z-bg: 28 28 30;
  --z-fg-1: 255 255 255;
  --z-accent: 10 132 255;
}

/* Optional: bundle a font next to theme.css and point a token at it */
@font-face {
  font-family: "My Font";
  src: url(zen-theme://my-theme/my-font.woff2) format("woff2");
}
:root { --z-text-font: "My Font", ui-sans-serif, sans-serif; }

Design tokens (--z-*)

The seeded overrides/example.css lists them all with copy-paste recipes.

--z-bg
Backgrounds Canvas; also --z-bg-softer (sidebar) and --z-bg-1 … --z-bg-4 (panels, borders).
--z-fg-1
Text Primary body; also --z-fg-2 (secondary) and --z-grey-0 … --z-grey-2 (muted).
--z-accent
Accent Buttons, selection, active states; also --z-accent-soft and --z-accent-muted.
--z-red … --z-aqua
Syntax + diagnostic hues --z-red, --z-green, --z-yellow, --z-blue, --z-purple, --z-aqua — used in code and diagrams.
--z-text-font
Fonts (optional) --z-text-font, --z-interface-font, --z-mono-font. An explicit Settings → Typography choice overrides these.

manifest.json

name
Display name Falls back to the folder name if omitted.
modes
light | dark | both Which modes the theme styles; drives the Light/Dark toggle.
author / version / description
Metadata Optional; surfaced on the theme card.
preview
Swatch hint Optional { light, dark } colors used only for the card swatch.

Overrides — tweak any theme

An override is a .css file in ~/.config/zennotes/overrides/, toggled under Settings → Appearance → Overrides. Enabled overrides inject on top of the active theme in filename order, so they win the cascade — target :root[data-theme] { … } so the rule beats both built-in and custom themes.

Because they sit on top, one override re-themes everything: :root[data-theme] { --z-accent: 255 59 48; } turns the accent hot pink on every theme. Overrides stack, so keep several small ones and flip each independently. The seeded example.css is a commented cookbook with the full token list and ready-to-uncomment recipes.

Fonts, images, and finding what to change

Bundle an asset with a theme by dropping the file in the theme folder and referencing it with the zen-theme:// scheme, where the host is the folder name: url(zen-theme://my-theme/display.woff2). Remote http/https URLs are never loaded, so themes stay self-contained and work offline; small images can also be inlined as data: URIs.

To find which token or class controls an element, use the Developer tools button in Settings → Appearance → Overrides and inspect it.

Ready to try it?