Releases: LBurny/notion-desktop
Release list
Notion Desktop v0.2.10
English | 中文说明
This release fixes two bugs: attachment clicks opening a spurious, random-looking tab instead of downloading, and zoom hotkeys firing even when Notion Desktop is not focused.
1. Attachments now download in place (no phantom tab)
Clicking an attachment makes the Notion page call window.open('https://www.notion.so/signed/attachment:<id>:<filename>?…'). Although the URL starts with notion.so, it responds with a 302 redirect to file.notion.so and Content-Disposition: attachment — it is a download link, not a page. The previous setWindowOpenHandler matched it by the notion.so prefix and opened it as a new in-app tab (showing leftover content from the prewarmed view, which looked random), while the file download silently proceeded in the background.
Window-open routing is now centralized in a pure classifyWindowOpen classifier with four outcomes:
- Auth popups (Google / Microsoft / Apple / OpenAI) are still allowed as real windows.
- Notion file links (
notion.so/signed/,file.notion.so,prod-files-secure.s3...) now download in place viasession.downloadURL— the native Save As dialog appears and no tab is created. - Notion page links still open in-app tabs.
- Other external links still open in the system browser.
Note: a short network round-trip (the signed-URL redirect) remains before the Save As dialog appears — the same delay as in a regular browser.
2. Zoom in / zoom out hotkeys now work only while the app is focused
Previously these two hotkeys were registered as system-wide global shortcuts: pressing them while another app was focused still zoomed Notion, and the key was consumed system-wide so other apps never received it — easy to mis-trigger. They now follow the same pattern as the tab-switch keys: registered only while the main window is focused, unregistered on blur, so other apps are unaffected. The show/hide window hotkey (default Ctrl+`) stays global so you can always summon the window from the tray.
Tests: 272 unit tests pass, including 5 new regression tests for window-open routing (one guards the ordering: /signed/ must be classified as a download before the notion.so page rule) and 3 for the hotkey registration scope (one guards "zoom keys must never be registered globally").
Notion Desktop v0.2.9
English | 中文说明
Confirms the dark-mode window border fix and cleans up the deprecated PowerShell code.
- Dark-mode border fix confirmed stable on affected machines (koffi native FFI path).
- Removed the deprecated PowerShell
Add-Typecall chain and the temporarynd-dwm.logfile logging;window-dark-mode.jsis now pure koffi.
Notion Desktop v0.2.8
English | 中文说明
Fixes the dark-mode window border issue on affected machines by replacing the fragile PowerShell Add-Type approach with koffi native FFI.
- The DWM dark-mode attribute is now set directly from the main process via koffi (N-API prebuilt, no .NET compiler / CLM dependency), eliminating the
Add-Typecompilation failure that left the 1px border white on some machines. - DWM/theme calls append to
nd-dwm.login%APPDATA%\notion-desktop\for cross-machine diagnosis.
Notion Desktop v0.2.7
English | 中文说明
Fixes the dark-mode window edge white line that still appeared on some machines running the same Windows build — the actual root cause.
- Fix: the real cross-machine root cause was not the DWM attribute number (v0.2.6's 19-fallback was a valid robustness improvement but not the cause here). It was a re-apply timing issue. When
theme.jsonalready persisteddark, the app treated the theme as dark from startup, so the earlyapplyWindowDarkModecall at window creation (before the window was fully realized) didn't take effect. Later, when Notion reporteddark(window now ready), the report was deduped as "theme unchanged" andonAppliedwas never called again — so the dark non-client area never got a second chance to apply, and the 1px white border persisted. The dev machine happened to have timing where the early call took effect, so it looked like "only works on one machine."theme-servicenow triggersonAppliedon every valid theme report (even when unchanged), so Notion'sdarkreport — arriving once the window is ready — reliably applies the dark NC area. Persistence still only happens on actual change. - Kept (from v0.2.6): DWM attribute 20→19 fallback for builds < 19041, and the no-longer-silent result reporting (
[dwm]line underND_PERF=1, with HRESULTs andColorPrevalencehint on failure).
Tests: updated the theme-dedup test and added a cross-machine white-line regression test. 271 unit tests pass.
Download Notion.Desktop.Setup.0.2.7.exe (NSIS installer, selectable install directory).
Notion Desktop v0.2.6
English | 中文说明
Fixes the dark-mode window edge white line that only worked on some machines.
- Fix: the DWM dark non-client-area attribute (used to remove the 1px white border on maximized frameless windows in dark mode) was hard-coded to attribute 20, which only exists on Windows 10 2004 (build 19041+). On older builds (1909, etc.) the call silently did nothing, so the white line reappeared on another machine. The script now tries attribute 20 first and falls back to 19 on a non-zero result, covering both builds.
- Diagnostics: the DWM call result is no longer discarded. The PowerShell script previously swallowed the return value (
| Out-Null) and any errors, so when the fix didn't work on another machine there was nothing to go on. It now writes a status line (which attribute succeeded, or both HRESULTs on failure, plus the "show accent color on window borders" setting), surfaced as a[dwm]line underND_PERF=1. Failures are no longer silent.
Note: in the rare case where Windows has "Show accent color on title bars and window borders" enabled, the border follows the system accent color and overrides this setting. ND_PERF=1 shows [dwm] ... cp=1 in that case; turn that option off (or pick a dark accent color) in Settings → Personalization → Colors.
Tests: 10 new window-dark-mode unit tests (attribute 19 fallback, return value no longer swallowed, status parsing/reporting). 270 unit tests pass.
Download Notion.Desktop.Setup.0.2.6.exe (NSIS installer, selectable install directory).
Notion Desktop v0.2.5
English | 中文说明
New tab / close tab hotkeys are now configurable, and newly opened tabs now correctly apply your style settings.
- New: "New tab" / "Close tab" hotkeys are configurable in Settings (previously hard-coded Ctrl+T / Ctrl+W). Changing a key disables the old one; the browser-equivalent keys (Ctrl+Tab, PageDown, digit positions) still work.
- Fix: style settings now apply to newly opened tabs. The preheated view re-injects the latest CSS when a tab is claimed, with a
dom-readyre-injection that also covers full-page reloads, plus a final re-injection after SPA navigation. - Tweak: the Settings and Style sub-windows now share the same default height (585), so their scroll behavior is consistent.
- Tweak: the "+ Add New Hotkey" button in the slash-command list is aligned to the command boxes and its text is centered.
Download Notion.Desktop.Setup.0.2.5.exe (NSIS installer, selectable install directory).
Notion Desktop v0.2.4
English | 中文说明
Fixes a crash when switching tabs ("Can't add a destroyed child view")
The standby view's dom-ready/did-finish-load/did-fail-load handlers stayed attached to the webContents after it was claimed and became a tab. When that tab later had a main-frame load failure (e.g. a watchdog fallback reload failed), the leftover did-fail-load called wc.close() and destroyed the tab's view; switching back to it then crashed addChildView.
Fixes (two layers):
- The standby handlers are now gated on
v !== view— once the view is claimed it's no longer the current standby, so the leftover handlers become no-ops (no more stray CSS injection / state corruption / view destruction). ensureViewnow rebuilds a destroyedrec.viewdefensively, soaddChildViewnever receives a destroyed view.
New regression tests for both paths; full suite 257 tests pass.
Download: Notion.Desktop.Setup.0.2.4.exe (NSIS installer, optional install directory).
Notion Desktop v0.2.3
English | 中文说明
Fixes a crash on Ctrl+T (new tab)
Fixed newTabInteractive is not defined crash on Ctrl+T (existed since v0.1.15; the + button via IPC was unaffected).
Download: Notion.Desktop.Setup.0.2.3.exe (NSIS installer).
Notion Desktop v0.2.2
English | 中文说明
Instant new-tab open & sidebar response
Delivers instant response for opening a new page via + and toggling ☰ sidebar on a fresh tab, via a resident warm-standby view + Notion client-side routing. Fixes the v0.2.0 double-load (watchdog now checks location.href) and destroyRec crash. Smoke-tested OK.
newTabInteractive is not defined). Fixed in v0.2.3 — please use v0.2.3 instead: https://github.com/LBurny/notion-desktop/releases/tag/v0.2.3
Download: Notion.Desktop.Setup.0.2.2.exe (NSIS installer).
Notion Desktop v0.2.1
English | 中文说明
Reverts the v0.2.0 "warm standby view" optimization
v0.2.0's optimization (a resident background "standby" view to make new tabs open instantly) proved harmful in practice and is fully reverted here. The code is identical to v0.1.15 (only the version number changed).
Why reverted
- The standby view ran with
backgroundThrottling:false, i.e. a full Notion web app kept alive permanently in the background, continuously consuming CPU/GPU — causing noticeable overall lag. - Triggering Notion's client-side router via a hidden
<a>.click()was unreliable (Notion ignores untrusted synthetic events), so the watchdog fell back to a full page reload — making new tabs slower than before. - Closing a tab crashed in
destroyRec(rec.view.webContentswas undefined).
What this release does
- Removes the standby-view module, the
spaNavigateprobe, theensureViewclaim branch, and the related warm/theme/CSS sync logic; restores the v0.1.15 tab view lifecycle (each new tab cold-loads independently). - Full suite 240 tests pass.
⚠️ Do not use v0.2.0 — install v0.2.1 instead.
A page-load / sidebar-speed optimization is still worth pursuing, but needs an approach that doesn't keep a heavy background process resident and can reliably drive Notion's SPA router — to be explored in a future version.
Download: Notion.Desktop.Setup.0.2.1.exe (NSIS installer, optional install directory).