Skip to content

ZenNotes v2.82.0

Latest

Choose a tag to compare

@github-actions github-actions released this 03 Nov 19:38
· 3 commits to main since this release

ZenNotes 2.82.0 brings your notes over from Notion and Obsidian, in one Import window that new users also meet during onboarding. It also opens any local vault's folder in your file manager, lets a New Kanban column carry a color, and makes sure a hidden sidebar can always be brought back without a keyboard.

Released from 6ea4775a6f9ecf1d1e8a0b798d18b71e2ea8257d through #1046 on 2026-11-03.

Features

  • Import from Notion. Sign in with Notion and see your whole workspace in a tree inside ZenNotes, with everything ticked. Untick what you don't want and import. Pages keep their folder structure, images and attachments are downloaded next to them, and databases become ZenNotes databases. Nothing lands in your vault until the import is finished, in a new Notion Import folder, so undoing it means deleting one folder. Import Report.md in that folder lists anything that could not come over exactly. Stopped or interrupted, an import resumes. ZenNotes signs in through Notion's own sign-in page, sees only what your account can see, and never asks for an API key.
  • Import from Obsidian. Pick an Obsidian vault and copy it into a new Obsidian Import folder, leaving the original untouched. Notes keep their bytes unless a link would break: a link whose title is shared with another note is pinned to the note Obsidian would have opened. Canvases and Bases come over as files, Dataview queries stay code blocks, and the report says so, along with where to point Settings for daily notes and templates.
  • One Import window, and a step in onboarding. Space I with Vim on, or Import Notes in the command palette, opens a window that chooses between the two. A new user is offered the same choice during onboarding.
  • Open a vault's folder in the file manager. Space F opens the current vault's folder in Finder, Explorer or your Linux file manager. In the vault list, Shift+Enter or the row's button does it for any local vault.
  • New Kanban columns can carry a color (#1045). C on a column, its header menu, a card's menu or Set Board Column Color in the palette pick from the theme's palette. The color also reaches the matching chips in the Table view. On a phone or tablet, a long press on the column opens the same menu.
  • On phones, Home names the open vault (zennotesandroid#143). A chip at the top of Home shows the vault you are in, and one tap opens the Vaults sheet. The drawer's header still does both.

Fixes

  • A hidden sidebar can always come back without a keyboard (zennotesios#88). Before: with Note tabs off, hiding the sidebar left no button to show it again on a note or on Tasks, since that button lives in the tab strip. On an iPad with no keyboard the choice was saved, so the only way out was to delete the app. After: a note's header has the button, and Tasks and the other views get a slim strip holding it.

For contributors

  • lib/sidebar-restore.ts says where each pane offers the way back to a hidden sidebar. Both new controls carry data-sidebar-restore, which the phone layouts hide.
  • Notion import: packages/shared-domain/src/notion-import/ (pure) and apps/desktop/src/main/notion-import*.ts. It reads through Notion's hosted MCP service with OAuth and PKCE and no client secret, into a resumable staging store under user data, and moves into the vault in one rename.
  • Obsidian import: packages/shared-domain/src/obsidian-import/links.ts and apps/desktop/src/main/obsidian-import*.ts.

Demos

Captioned 1080p clips recorded on the release branch. The Notion clip runs on a made-up workspace served locally, on the token route, so your account never appears in it; signing in itself is hovered, not pressed.

Import from Notion: a made-up workspace in the tree, one page unticked, the import, its report and links, and a database as a Board with its colors. Watch the clip (52 seconds, captioned).

Import from Obsidian: a folder that is not a vault and one inside this vault are both turned away; then a real vault, with a folder unticked, its report, and links pinned where two notes share a name. Watch the clip (68 seconds, captioned).

One Import window: Import Notes from the palette, and the same choice on a new user's Bring your notes step. Watch the clip (31 seconds, captioned).

Open a vault's folder: Space F, the row button, Shift+Enter and Settings, plus the message for a vault on a drive that is not mounted. Finder itself is off screen in this clip. Watch the clip (38 seconds, captioned).

New Kanban column colors: C with a typed name, the column's menu, and the Table's chips in the same colors. Watch the clip (35 seconds, captioned).

Sidebar: mouse only with Note tabs off, the sidebar hidden and brought back on a note, then on Tasks. Watch the clip (27 seconds, captioned).

Verification

How to test locally:

  1. Run npm run dev, then press Space I (Vim on) or run Import Notes from the command palette.
  2. Choose Obsidian and pick any Obsidian vault. Untick a folder, import, and open Obsidian Import/Import Report.md. The original vault is unchanged.
  3. Choose Notion and sign in. Your workspace appears as a tree. Import a few pages and check that the folders match and the images are there.
  4. Press Space F: the vault's folder opens in your file manager.
  5. Make a New Kanban, put the cursor on a column and press C. The column takes the color, and so do its chips in the Table view.
  6. In Settings, turn Note tabs off, open a note and hide the sidebar. Before: nothing on screen brings it back. After: a button at the left of the note's header does.

Distribution channels

  • GitHub release: installers for macOS (Apple silicon and Intel DMG and zip), Windows (x64 and ARM64 installer and zip) and Linux (x64 and arm64 AppImage, deb, rpm, pacman, tar.gz), with five update manifests, from run 41705060448, whose promote-latest marked it latest once the last feed was up.
  • AUR: zennotes-bin 2.82.0-1 (AUR clone b325a53, repo 3af0519c).
  • Nix: packaging/nix/release-data.json from the update workflow (run 41707370101, bot PR #1048 closed) as 58829547; nix-build passed on main (run 41707924567).
  • nixpkgs: NixOS/nixpkgs#582818 proposes 2.81.1 -> 2.82.0, the source hash from the v2.82.0 tag tarball; waiting for review.
  • Homebrew: zennotes 2.82.0 in the tap (e17ce4b), mirrored in c05a8650.
  • Website: ZenNotes/website#110 merged at 2886e247; deployed by its own deploy job, and the live check passed.
  • zn CLI: 0.15.0 bundled (dbe0e438), with its signed manifest verified.
  • Server: ZenNotes/znserver v2.82.0 (#66, README #67) pins web-2.82.0-web.hef00e9245b876c04; Docker adibhanna/zennotes:2.82.0, 2.82, latest (amd64, arm64).
  • Boundary packages: core-2.82.0-core.h7fbea7b1c6714eb0 and web-2.82.0-web.hef00e9245b876c04, built from the tag's commit and published as pre-releases. The viewer stays at 2.81.0, since nothing a shared note draws changes.
  • Phones: iPhone 1.37.0 (build 58, which replaced build 57 before review), Waiting for Review; Android 1.1.54 (versionCode 57) live with its GitHub release, and Android 1.1.55 (versionCode 58) in Play review with its GitHub release, each carrying Play's universal APK. Both name the open vault on Home, and the iPhone app gained a long press on a database Board's column. iPhone build 58 and Android 1.1.55 also stop a fresh install's first Cloud sync from pausing on its own untouched Welcome note.

Release validation

  • Local gates on the release commit, in a clean npm ci checkout: typecheck, every test suite uncached, build:prod, the three smoke suites, npm run pack and the packaged launch check (page target, rendered, 2.82.0), and a real Finder window opened from the packaged app. Hazard scan and dash lint are clean, the audit found nothing high, and there was no failed CI since v2.81.1.
  • A candidate core was walked on an iPhone simulator, a 13-inch iPad simulator and an Android emulator before the bump, and the release branches again before the stores, with real taps on Debug builds. That found one gap, fixed in the iPhone app: a long press on a database Board's column did nothing on iOS.
  • The exact server binary with this web package was run on a scratch vault: the sidebar fix with Note tabs off on a note and on Tasks, and no import or file manager commands on the web.
  • The Notion import ran end to end on one real workspace: 63 pages, 5 databases, 129 rows and 22 files, with its structure matching. Not yet proven on real data: Notion teamspaces, link pinning and some cell formats. The Obsidian import ran on one simple real vault of 19 notes.
  • What went wrong, told plainly. On the release PR, GitHub gave macOS no runner (annotation: not acquired, capacity), and one Windows test timed out at 5,625 ms of its 5,000 on a slow runner (vault.test.ts took 30.7 s against 5.5 s on the last green run, unchanged since v2.81.1); both passed on re-run. The same macOS capacity failure hit the Packaging pushes on main, whose other five jobs were green.
  • The iPhone Cloud UI tests failed 4 of 8 on their first run, on a conflict in the QA vault on the app's own inbox/Welcome to ZenNotes.md, whose Cloud copy was an older seed. No code in this release caused it, and with the conflict cleared 7 passed and the iPad-only test was skipped. A fresh install linking to a vault with an older Welcome note can show the same conflict; that is older than this release and being fixed separately.
  • CodeQL raised four new alerts on the import code (146 to 149, three of them high). Each was read and dismissed with its reason: a table cell escape whose backslashes are already doubled earlier, a parser for Notion's own tags that filters nothing, a fixture URL in a test, and an importer writing its own report.