Deno v2.9.1stable Released Jul 01, 2026
Impact Score: 5/10

Deno v2.9.1 โ€” Release Notes & Engineering Impact

Source available โ€” automated, not human-reviewed

Component: deno ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.

Analysis updated: 2026-11-01.

Compatibility not verified โ€” check source notes
๐Ÿ“„ .MD
โšก Executive Summary (TL;DR)

Deno v2.9.1. Source highlight: feat(check): add `--desktop` flag to type-check for deno desktop (#35644)

Who Does This Impact? (Role-Based Analysis)

๐Ÿ’ป Software Engineers & Devs

Check the source notes against the package and APIs you use before upgrading.

๐Ÿ“Š Product & Engineering Leads

Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.

โš™๏ธ DevOps & Security

Verify the target version, runtime requirements and rollback procedure in the official documentation.

โœจ New Features & Capabilities (3)

  • feat(check): add `--desktop` flag to type-check for deno desktop (#35644)
  • feat(desktop): register deep-link URL schemes at bundle time (#35466)
  • feat: update laufey to 0.5.0 (#35663)

โšก Performance & Enhancements (3)

  • perf(core/webidl): check `next` method outside of iterator loop (#35480)
  • perf(ext/fetch): fast-path Response reconstruction (#35495)
  • perf(ext/http): coalesce chunked response writes into a single write (#35523)

๐Ÿ”ง Bug Fixes & Patches (6)

  • fix(bundle): emit CSSStyleSheet for CSS raw imports (#35598)
  • fix(cache): skip checksums for cached 404 entries (#35526)
  • fix(config): don't strip workspace-member includes from deploy config (#34788)
  • fix(core): apply deferred fast-call op upgrade to the captured bootstrap clone
  • fix(core): prevent shared-buffer timer expiry race from losing timers (#35312)
  • fix(desktop): default window title to app name instead of laufey_webview
๐Ÿ“„ View Raw Release Notes (Original Developer Log)
### 2.9.1 / 2026.07.01 - feat(check): add `--desktop` flag to type-check for deno desktop (#35644) - feat(desktop): register deep-link URL schemes at bundle time (#35466) - feat: update laufey to 0.5.0 (#35663) - fix(bundle): emit CSSStyleSheet for CSS raw imports (#35598) - fix(cache): skip checksums for cached 404 entries (#35526) - fix(config): don't strip workspace-member includes from deploy config (#34788) - fix(core): apply deferred fast-call op upgrade to the captured bootstrap clone (#35630) - fix(core): prevent shared-buffer timer expiry race from losing timers (#35312) - fix(desktop): default window title to app name instead of laufey_webview (#35541) - fix(desktop): detect SvelteKit adapter-node and error on unsupported adapters (#35533) - fix(desktop): discover deno.json in the project dir for `deno desktop .` (#35660) - fix(desktop): don't delete user directories that collide with app name (#35513) - fix(desktop): repair webview and raw backends on Windows (laufey v0.4.1) (#35566) - fix(desktop): resolve launcher symlink so .deb/.rpm apps find the backend (#35632) - fix(desktop): set LAUFEY_RUNTIME_PATH in Linux app launcher (#35580) - fix(desktop): show macOS tray icon in bundled .app launched via Finder (#35626) - fix(desktop): use zstd for appimage squashfs (#35506) - fix(doc): strip blockquote > prefixes from JSDoc code blocks (#34866) - fix(ext/fetch): include path and reason when fetching a file:// URL fails (#35606) - fix(ext/node): check permissions when binding node:net unix sockets (#35564) - fix(ext/node): export report as named export from node:process (#35400) - fix(ext/node): mock.reset() should also reset MockTimers (#35588) - fix(ext/node): pass Deno subcommands through child_process spawn (#35599) - fix(ext/node): send TLS close_notify on JS stream-backed socket shutdown (#35582) - fix(ext/node_sqlite): keep attach limit capped under scoped permissions (#35232) - fix(ext/web): make URL and URLSearchParams non-serializable (#35423) - fix(fmt): stable formatting of multi-line html/svg tagged templates (#35540) - fix(inspector): support Chrome worker debugging (#35629) - fix(install): pin pre-release npm versions added via dist-tag (#35586) - fix(jupyter): register stdin peer only after ZMTP handshake completes (#35585) - fix(lib): add PerformanceObserver and PerformanceObserverEntryList types (#35640) - fix(libs/http): add missing `write_flushed` in `poll_start_fixed_response_with` (#35649) - fix(lsp): watch .wasm files for changes (#35560) - fix(node): load graph-backed TypeScript modules synchronously (#35527) - fix(npm): decode percent-encoded subpath of npm specifiers (#35505) - fix(npm): fall back for age-filtered npm dist-tags (#35561) - fix(npm): normalize bin names with path separators (#35555) - fix(npm): realpath npm bin main module (#35554) - fix(npm): show scoped-registry auth hint on tarball 404 (#35514) - fix(npm): use case-insensitive match for trust-policy-exclude (#35520) - fix(rt_desktop): reveal initial window on first paint (startup black flash) (#35620) - fix: correct property name for JSX new line configuration in schema file (#35565) - fix: resolve LAUFEY_VERSION from crate-local Cargo.lock during publish (#35507) - fix: show clear error when V8 fails to create worker threads (#32856) - perf(core/webidl): check `next` method outside of iterator loop (#35480) - perf(ext/fetch): fast-path Response reconstruction (#35495) - perf(ext/http): coalesce chunked response writes into a single write (#35523)