Skip to main content

Deno 2.9.1

Release Date: July 1, 2026

OK so Deno 2.9.1 just dropped hot on the heels of 2.9.0 and we are talking July 1 — basically yesterday. This is a patch release but do not sleep on it because there is some actually juicy stuff in here, especially if you have been playing with deno desktop.

TL;DR: Desktop support got a ton of polish, bunch of Node compat fixes, and some nice LSP improvements. Let us break it down.

Desktop Mode Gets the Love It Deserves

I have been testing the desktop features since 2.9.0 and v2.9.1 fixes pretty much every rough edge I ran into. Deep-link URL schemes are now registered at bundle time (no more manual config). The default window title falls back to the app name instead of laufey_webview. And deno desktop . now actually discovers deno.json in the project dir — which it absolutely should have from day one but hey, it works now.

The macOS tray icon shows up properly in bundled .app files launched via Finder. Linux gets zstd for AppImage squashfs (smaller bundles, faster builds). And there is a new --desktop flag for deno check to type-check specifically for desktop targets. Nice touch.

Also — the SvelteKit adapter detection now errors on unsupported adapters instead of silently failing. Saved me a solid hour of debugging, so thanks for that one.

Node Compat Fixes

The node:net unix socket binding now checks permissions properly (security win). child_process spawn can pass Deno subcommands through. node:process exports report as a named export. And mock.reset() correctly resets MockTimers too — that one was driving people nuts in testing workflows.

Oh and node:sqlite keeps the attach limit capped under scoped permissions. Smart.

NPM and Install Fixes

Pre-release npm versions added via dist-tag now get pinned properly. There is a fallback for age-filtered npm dist-tags. Bin names with path separators get normalized. And the realpath for npm bin main modules is fixed too. Basically npm stuff just works better now.

Other Cool Bits

URL and URLSearchParams are now non-serializable (bye bye footgun). The LSP watches .wasm files for changes. Chrome worker debugging works in the inspector. Jupyter registers the stdin peer only after ZMTP handshake completes. And fmt finally stabilizes multi-line html/svg tagged templates — my prettier-esque heart is happy.

There is also a fix for cached 404 entries not being skipped by checksums, and shared-buffer timer expiry races losing timers. The kind of bugs you are glad someone else found first.

Upgrade with deno upgrade and get back to building. This one is worth it period.

What is New?

By continuing to use the site, you agree to the use of cookies.