# Deno changelog > A modern, secure runtime for JavaScript and TypeScript. - Vendor: Deno - Category: Languages & Runtimes - Official site: https://deno.com - Tracked by: What's New (https://whatsnew.fyi/product/deno) - Harvested from: GitHub (denoland/deno) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### v2.9.4 - Date: 2026-07-23 - Version: v2.9.4 - Original notes: https://github.com/denoland/deno/releases/tag/v2.9.4 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.9.4 - **added** — Enable --hmr flag for React Router in desktop - **added** — Add byteLength/length parameter to Buffer.indexOf/lastIndexOf/includes in ext/node - **added** — Support raw chacha20 cipher in crypto.createCipheriv - **changed** — Upgrade V8 to 150.2.0 - **fixed** — Support --minimum-dependency-age flag in deno add/remove - **fixed** — Store Web Cache under origin data - **fixed** — Require FFI permission for native window handles in canvas - **fixed** — Reject symlinked node_modules cleanup roots - **fixed** — Bump libsui to 0.16.4 to fix Windows resource SizeOfImage - **fixed** — Allow dynamic imports during cached module evaluation in core - **fixed** — Bound error graph conversion in core - **fixed** — Enforce JSON requests in FsModuleLoader - **fixed** — Handle malformed error constructors in core - **fixed** — Stop rejected dynamic imports before loading in core - **fixed** — Make BrowserWindow bindings typeable in desktop - **fixed** — Preserve binding wrappers after lazy op upgrade in desktop - **fixed** — Strip runtime extension from app name in desktop - **fixed** — Cancel async sends after close in ext/napi - **fixed** — Scope callback info per invocation in ext/napi - **fixed** — Apply backpressure to http2 stream writes ###### 2.9.4 / 2026.07.23 - feat(desktop): enable `--hmr` for React Router (#35900) - feat(ext/node): add a byteLength/length parameter to Buffer.indexOf/lastIndexOf/includes (#35872) - feat(ext/node): support raw chacha20 cipher in crypto.createCipheriv (#36016) - feat: upgrade V8 to 150.2.0 (#36098) - fix(add): support --minimum-dependency-age flag in deno add/remove (#36099) - fix(cache): store Web Cache under origin data (#36145) - fix(canvas): require FFI permission for native window handles (#36080) - fix(clean): reject symlinked node_modules cleanup roots (#36190) - fix(compile): bump libsui to 0.16.4 to fix Windows resource SizeOfImage (#36242) - fix(core): allow dynamic imports during cached module evaluation (#36258) - fix(core): bound error graph conversion (#36070) - fix(core): enforce JSON requests in FsModuleLoader (#36137) - fix(core): handle malformed error constructors (#36071) - fix(core): stop rejected dynamic imports before loading (#36136) - fix(desktop): make BrowserWindow bindings typeable (#35907) - fix(desktop): preserve binding wrappers after lazy op upgrade (#36065) - fix(desktop): strip runtime extension from app name (#36060) - fix(ext/napi): cancel async sends after close (#36077) - fix(ext/napi): scope callback info per invocation (#36076) - fix(ext/node): apply backpressure to http2 stream writes (#36044) - fix(ext/node): don't leave 0-byte .heapsnapshot files near the heap limit (#36113) - fix(ext/node): implement worker_threads.locks via Web Locks (#35963) - fix(ext/node): node:sqlite backup() and deserialize() argument validation (#36127) - fix(ext/node): retry DNS query when its per-attempt timeout fires (#35955) - fix(ext/node): stop http2 file reads on stream close (#36061) - fix(ext/web): handle failed webtransport datagram setup (#36067) - fix(ext/webidl): implement `async_sequence` for `ReadableStream.from` (#35976) - fix(fetch): bound multipart part headers (#36096) - fix(fmt): keep embedded CSS custom property indentation stable (#35949) - fix(fs): require sys permission for umask (#36222) - fix(http): preserve trust proxy environment setting (#36073) - fix(init): validate temporary node_modules parent (#36142) - fix(jupyter): report codemirror_mode as a string (#36241) - fix(loader): reject non-JSON modules for JSON imports (#36135) - fix(napi): synchronize external string finalizers (#36078) - fix(net): clean up cancellation resources on early errors (#36229) - fix(net): limit WebTransport handshake frame buffering (#36068) - fix(node_http2): clean up destroyed sessions (#36043) - fix(node_resolver): handle CJS filesystem path edge cases (#36112) - fix(node_stream): handle Web Stream adapter errors (#36193) - fix(npm): avoid following lock poll symlinks (#36192) - fix(npm): download tarballs from the configured registry instead of registry.npmjs.org (#36187) - fix(npm): reject symlinked package materialization dirs (#36191) - fix(outdated): keep type-only dependencies in the lockfile (#36140) - fix(pack): support file paths longer than the tar name field (#36105) - fix(permissions): escape bidi controls in prompts (#36195) - fix(process): avoid collisions in Windows stdio pipe names (#36081) - fix(publish): constrain generated source rewrites (#36109) - fix(release): insert into versions.json in semver order (#36097) - fix(rt): isolate extracted native addons (#36144) - fix(runtime): bridge console to the inspector regardless of --inspect flag (#35795) - fix(runtime): give worker isolate threads the stack size we report (#36114) - fix(test): escape control characters in test names (#36196) - fix(tests): make npm test registry tolerate a bad advisories request body (#36138) - fix(tls): resolve sni requests concurrently (#36062) - fix(update): don't downgrade lockfile when npm cache is stale (#35904) - fix(webtransport): avoid url parse panic (#36066) - fix(webtransport): validate certificate dates (#3606 _[Truncated at 4000 characters — full notes: https://github.com/denoland/deno/releases/tag/v2.9.4]_ ### v2.9.3 - Date: 2026-07-15 - Version: v2.9.3 - Original notes: https://github.com/denoland/deno/releases/tag/v2.9.3 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.9.3 - **added** — Add `deno add --no-save` and `--save-optional` options - **added** — Add `--min-dep-age` alias - **added** — Support aarch64-pc-windows-msvc target for deno compile - **added** — Add `http2MaxHeaderListSize` option to `Deno.createHttpClient` - **fixed** — Preserve raw imports in watch mode during bundling - **fixed** — Don't hold SurfaceData mutable borrow over window resize in canvas - **fixed** — Reject out-of-range minimum dependency ages in config - **fixed** — Block user ext imports after resolution - **fixed** — Deactivate idle TTY write handles - **fixed** — Restrict extension loaders to internal modules - **fixed** — Root slow op string coercions - **fixed** — Don't let op_desktop_send_error_report target caller-supplied URLs - **fixed** — Don't panic recycling cancelled record on native response in ext/http - **fixed** — Don't free threadsafe function on abort while refs remain in ext/napi - **fixed** — Don't resurrect a released threadsafe function in acquire in ext/napi - **deprecated** — Add deprecation warning for Duplex.toWeb({ type }) DEP0201 - **fixed** — Guard sqlite deserialize during callbacks in ext/node - **fixed** — Handle UTF-16 assert source positions in ext/node - **fixed** — Handle sqlite conversion failures in ext/node ###### 2.9.3 / 2026.07.15 - feat(cli): `deno add --no-save` and `--save-optional` (#36039) - feat(cli): add --min-dep-age alias (#35914) - feat(compile): support aarch64-pc-windows-msvc target (#36004) - feat(ext/fetch): add `http2MaxHeaderListSize` option to `Deno.createHttpClient` (#33194) - fix(bundle): preserve raw imports in watch mode (#36040) - fix(canvas): don't hold SurfaceData mut borrow over window resize (#35993) - fix(config): reject out-of-range minimum dependency ages (#36051) - fix(core): block user ext imports after resolution (#36012) - fix(core): deactivate idle TTY write handles (#35886) - fix(core): restrict extension loaders to internal modules (#36013) - fix(core): root slow op string coercions (#36018) - fix(desktop): don't let op_desktop_send_error_report target caller-supplied URLs (#35940) - fix(ext/http): don't panic recycling cancelled record on native response (#36053) - fix(ext/napi): don't free threadsafe function on abort while refs remain (#36032) - fix(ext/napi): don't resurrect a released threadsafe function in acquire (#36054) - fix(ext/node): add deprecation warning for Duplex.toWeb({ type }) DEP0201 (#35972) - fix(ext/node): guard sqlite deserialize during callbacks (#36023) - fix(ext/node): handle UTF-16 assert source positions (#36029) - fix(ext/node): handle sqlite conversion failures (#36024) - fix(ext/node): respect base64 buffer ranges (#36030) - fix(ext/process): don't double-close extra stdio pipe handles on Windows (#36005) - fix(lsp): respect lint rule exclusion for no-slow-types diagnostics (#35924) - fix(node): stop active read on stream close to avoid leaking Socket/TCPWrap (#35898) - fix(node_http2): keep header validation enabled (#36042) - fix(node_http2): validate serialized headers (#36041) - fix(npm): don't fetch registry info for deprecated packages under --cached-only (#35903) - fix(npm): normalize path in BYONM read permission check (#35882) - fix(pm): hint about minimumDependencyAge when no version is old enough (#35890) - fix(release): only strip Mach-O signature for x86_64-apple-darwin (#35902) - fix(release): strip Mach-O signature before patchver on apple targets (#35897) - fix(runtime): guard usage op output buffers (#36020) - fix(serde_v8): handle deserialization exceptions (#36021) - fix(web): guard encodeInto fallback result buffer (#36019) - fix(web): support Event subclasses with readonly toStringTag (#35920) - fix(worker): remove imported ops during bootstrap (#36014) - fix: don't print duplicate parse diagnostics (#35933) - perf(ext/crypto): batch randomUUID generation (#35953) - perf(ext/fetch): remove quadratic line buffering in EventSource (#35881) - perf(ext/node): cache compiled glob matchers + bump bundled minimatch to 10.2.5 (#35873) - perf(ext/node): fast path fs cp (#35856) - perf(ext/node): right-size small socket reads instead of pinning the 64KB slab (#35779) - perf(ext/node): speed up sqlite.StatementSync.all() and run() (#35863) - perf(ext/web): avoid copy-back in op_base64_atob large path (#35862) ### v2.9.2 - Date: 2026-07-08 - Version: v2.9.2 - Original notes: https://github.com/denoland/deno/releases/tag/v2.9.2 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.9.2 - **added** — Autodetect React Router framework in desktop - **added** — Enable --hmr for Vite and Nuxt in desktop - **added** — Run HMR by framework dev server in desktop - **added** — Window opacity and transparency APIs in desktop - **added** — Wire --exclude-unused-npm through to compile in desktop - **added** — Implement v8.setHeapSnapshotNearHeapLimit in ext/node - **added** — Honor OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT in ext/telemetry - **added** — Start inspector server on SIGUSR1 - **added** — Implement getTestContext() in node:test - **added** — Support wildcard patterns in minimumDependencyAge.exclude - **fixed** — Don't interleave errors with Check lines in a workspace - **fixed** — Bump libsui to 0.16.1 to survive eu-strip in flatpak - **fixed** — Bump libsui to 0.16.3 to fix segfault under gVisor/Cloud Run - **fixed** — Don't drain microtasks in mod_evaluate_sync mid-evaluation - **fixed** — Count a branch-junction line as covered when either arm runs - **fixed** — Don't count V8 block-boundary gaps as branches - **fixed** — Don't let a trailing comment change a line's hit count - **fixed** — Disable config discovery and refresh the cached CLI version in deploy - **fixed** — Attribute bind calls to the registering window id in desktop - **fixed** — Honor desktop.backend from deno.json in desktop ###### 2.9.2 / 2026.07.08 - feat(desktop): autodetect React Router framework (#35557) - feat(desktop): enable `--hmr` for Vite and Nuxt (#35851) - feat(desktop): run HMR by framework dev server (#35722) - feat(desktop): window opacity and transparency APIs (#35646) - feat(desktop): wire --exclude-unused-npm through to compile (#35740) - feat(ext/node): implement v8.setHeapSnapshotNearHeapLimit (#35694) - feat(ext/telemetry): honor OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT (#35068) - feat(inspector): start inspector server on SIGUSR1 (#35738) - feat(node): implement getTestContext() in node:test (#35678) - feat: support wildcard patterns in minimumDependencyAge.exclude (#35746) - fix(check): don't interleave errors with "Check" lines in a workspace (#35687) - fix(compile): bump libsui to 0.16.1 to survive eu-strip in flatpak (#35699) - fix(compile): bump libsui to 0.16.3 to fix segfault under gVisor/Cloud Run (#35701) - fix(core): don't drain microtasks in mod_evaluate_sync mid-evaluation (#35707) - fix(coverage): count a branch-junction line as covered when either arm runs (#35858) - fix(coverage): don't count V8 block-boundary gaps as branches (#35767) - fix(coverage): don't let a trailing comment change a line's hit count (#35741) - fix(deploy): disable config discovery and refresh the cached CLI version (#35754) - fix(desktop): attribute bind calls to the registering window id (#35654) - fix(desktop): honor desktop.backend from deno.json (#35815 - fix(desktop): pin @std/http in generated Vite SPA entrypoint + add hermetic compile test (#35676) - fix(desktop): rename launcher to so it self-loads the runtime (#35709) - fix(desktop): run framework build step before bundling output (#35603) - fix(desktop): surface compiled-app startup errors instead of exiting silently (#35567) - fix(dprint): exclude `tools/lzld` submodule (#35778) - fix(ext): throw DataCloneError when posting non-serializable values (#35604) - fix(ext/cache): implement Cache.keys() (#35455) - fix(ext/fetch): reject transport failures with Node's "fetch failed" shape (#35618) - fix(ext/http): error non-Uint8Array response streams (#35783) - fix(ext/http): honor explicit content-length header on HEAD responses (#35728) - fix(ext/http): point legacy abort warning at docs.deno.com/go link (#35713) - fix(ext/napi): add uv_cond_* polyfills for native addons (#35536) - fix(ext/net): abort pending Deno.connect during DNS resolution (#35729) - fix(ext/node): allow adopting inherited extra stdio TCP fds (#35805) - fix(ext/node): don't panic when main module path has invalid percent-encoding (#35534) - fix(ext/node): don't schedule a pause in inspector.waitForDebugger() (#35796) - fix(ext/node): flush StringDecoder in cipher final() for stream ciphers (#35800) - fix(ext/node): mark TLSWrap dead on teardown before tls_conn check (#35706) - fix(ext/node): report all active resources from process.getActiveResourcesInfo (#35532) - fix(ext/node): require --allow-net=unix for node:net unix sockets (#35835) - fix(ext/node): support fd 3 pipes in spawned Deno children (#34133) - fix(ext/signals): unregister handler when SignalStream is dropped (#35832) - fix(ext/web): resolve pending BYOB read when teeing a byte stream that closes (#35828) - fix(fmt): format Astro inline scripts as TypeScript (#35852) - fix(fs): support pre-1970 (negative) timestamps in FsStat (#35517) - fix(inspector): close WebSocket connections when the runtime is torn down (#35791) - fix(install): don't panic on jsr specifier with a tag like @latest (#35605) - fix(install): don't write through hardlinks when copying package files (#35735) - fix(install): make setup cache packages hash deterministic (#35825) - fix(install): resolve lifecycle script dependency bins against the hoisted layout (#35762) - fix(install): support uninstalling multiple global packages (#29352) - fix(lint): don't error on non-analyzable package _[Truncated at 4000 characters — full notes: https://github.com/denoland/deno/releases/tag/v2.9.2]_ ### v2.9.1 - Date: 2026-07-01 - Version: v2.9.1 - Original notes: https://github.com/denoland/deno/releases/tag/v2.9.1 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.9.1 - **added** — Add --desktop flag to type-check for deno desktop - **added** — Register deep-link URL schemes at bundle time - **changed** — Update laufey to 0.5.0 - **fixed** — Emit CSSStyleSheet for CSS raw imports - **fixed** — Skip checksums for cached 404 entries - **fixed** — Don't strip workspace-member includes from deploy config - **fixed** — Apply deferred fast-call op upgrade to the captured bootstrap clone - **fixed** — Prevent shared-buffer timer expiry race from losing timers - **fixed** — Default window title to app name instead of laufey_webview - **fixed** — Detect SvelteKit adapter-node and error on unsupported adapters - **fixed** — Discover deno.json in the project dir for deno desktop . - **fixed** — Don't delete user directories that collide with app name - **fixed** — Repair webview and raw backends on Windows - **fixed** — Resolve launcher symlink so .deb/.rpm apps find the backend - **fixed** — Set LAUFEY_RUNTIME_PATH in Linux app launcher - **fixed** — Show macOS tray icon in bundled .app launched via Finder - **fixed** — Use zstd for appimage squashfs - **fixed** — Strip blockquote > prefixes from JSDoc code blocks - **fixed** — Include path and reason when fetching a file:// URL fails ###### 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) ### v2.9.0 - Date: 2026-06-25 - Version: v2.9.0 - Original notes: https://github.com/denoland/deno/releases/tag/v2.9.0 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.9.0 - **added** — Add --declaration flag to bundle subcommand to generate rolled-up .d.ts files - **added** — Add deno link and deno unlink subcommands - **added** — Add deno watch subcommand - **added** — Add deno list subcommand to list declared dependencies - **added** — Add deno desktop subcommand - **added** — Auto-migrate pnpm-workspace.yaml on resolution failure - **added** — Provide a node on PATH when Node.js is not installed - **added** — Persist Web Storage/KV in a per-app data directory for compiled applications - **added** — Add configurable coverage thresholds - **added** — Add --compress flag for self-extracting app bundles in desktop - **added** — Add Linux .deb and .rpm installer output formats for desktop - **added** — Add Windows .msi installer output format for desktop - **added** — Autodetect Vite framework in desktop - **added** — Support remaining modern WebCrypto algorithms - **added** — Implement Happy Eyeballs for Deno.connect and Deno.connectTls - **added** — Implement node:test mock.module - **added** — Implement node:test mock.timers - **added** — Implement Web Locks API - **added** — Add sortNamedImports and sortNamedExports options to formatter - **added** — Infer formatter config from .editorconfig - **changed** — Use lax-css for CSS, SCSS, and Less formatting - **changed** — Use lax-markup for HTML, XML, SVG, and components formatting - **changed** — Use lax-sql for SQL formatting - **changed** — Default UI backend to webview in desktop - **changed** — Disable Deno.serve automatic compression by default - **changed** — Bump reported process.version to v26.3.0 - **added** — Allow disabling serve compression - **added** — Create node_modules for workspace members - **added** — Seed deno.lock from bun.lock, package-lock.json, pnpm-lock.yaml, and yarn.lock - **added** — Warn on package.json engines mismatch - **added** — Auto-resolve git merge conflicts in deno.lock - **added** — Add inferred type request to LSP - **added** — Implement Node-API version 10 - **added** — Install JSR dependencies into node_modules via npm-compat registry - **added** — Add publishing-trust ranking and no-downgrade trust policy for npm - **added** — Add request_builder_hook for fetch token and cdn-loop headers - **added** — Add --if-present flag to deno task - **added** — Add --jobs/--concurrency flag to deno task - **added** — Add input-based caching with files/output/env for tasks - **added** — Set npm_execpath, npm_node_execpath and npm_command for package.json scripts - **added** — Add --changed and --related flags to deno test - **added** — Add --shard flag to split a test run across machines - **added** — Add Deno.test.each for parameterized tests - **added** — Add retry and repeats options to Deno.test - **added** — Add built-in snapshot testing via t.assertSnapshot - **added** — Show sub-millisecond test durations - **added** — Support CSS module imports with { type: "css" } - **added** — Add deno remove --global as alias for deno uninstall --global - **added** — Add preferPackageJson deno.json setting - **added** — Stabilize --unsafe-proto flag - **added** — Enable default minimum dependency age - **added** — Stabilize links field in deno.json - **added** — Stabilize bare node built-in resolution - **added** — Support ignore option in Deno.watchFs - **added** — Support navigator.userAgentData - **fixed** — Treat npm .d.ts as CommonJS based on package.json - **fixed** — Always register isolate to prevent silent foreground task drop - **fixed** — Handle async op promise id wraparound - **fixed** — Make uv_compat ready queues thread-safe - **fixed** — Preserve custom .stack getters in error/test formatter - **fixed** — Unwrap global exports in Wasm ESM integration - **fixed** — Don't panic in coverage summary reporter without a common root - **fixed** — Merge coverage for modules loaded with different hash/search params - **fixed** — Use JSR latest for deploy CLI - **fixed** — Add Wayland support for CEF and webview backends in desktop - **fixed** — Add Bluetooth usage descriptions to macOS Info.plist - **fixed** — Add macOS desktop Info.plist keys - **fixed** — Correct libdenort unpack path with non-executable extension - **fixed** — Hide bundled libc++ symbols so the desktop runtime can be dlopen'd on Linux - **fixed** — Use native Wayland instead of XWayland on Wayland systems - **fixed** — Allow deriving AES-OCB keys - **fixed** — Clamp X448 scalar per RFC 7748 - **fixed** — Pad JWK to multiple of 8 bytes for AES-KW wrap - **fixed** — Keep content-encoding and content-length on decompressed responses - **fixed** — Require --allow-net for Unix proxy in createHttpClient - **fixed** — Truncate should not follow a terminal symlink - **fixed** — Apply automatic compression for zero-arg serve handlers - **fixed** — Close active WebSockets on Deno.serve shutdown - **fixed** — Validate remote KV URL when opening the connection ###### 2.9.0 / 2026.06.25 Read more: http://deno.com/blog/v2.9 - feat(bundle): add --declaration flag to generate rolled-up .d.ts files (#33838) - feat(cli): add `deno link` and `deno unlink` subcommands (#34359) - feat(cli): add `deno watch` subcommand (#35301) - feat(cli): add deno list subcommand to list declared dependencies (#34972) - feat(cli): auto-migrate pnpm-workspace.yaml on resolution failure (#34993) - feat(cli): provide a `node` on PATH when Node.js is not installed (#34969) - feat(compile): persist Web Storage/KV in a per-app data directory (#34618) - feat(coverage): add configurable coverage thresholds (#35056) - feat(desktop): --compress for self-extracting app bundles (#35420) - feat(desktop): add Linux .deb and .rpm installer output formats (#35296) - feat(desktop): add Windows .msi installer output format (#35378) - feat(desktop): autodetect Vite framework (#35470) - feat(desktop): default UI backend to webview (#35442) - feat(ext/crypto): support remaining modern WebCrypto algorithms (#35223) - feat(ext/http): deprecation warning for legacy request abort (#34397) - feat(ext/net): implement Happy Eyeballs for `Deno.connect` and `Deno.connectTls` (#31726) - feat(ext/node): implement node:test mock.module (#35329) - feat(ext/node): implement node:test mock.timers (#33946) - feat(ext/web): web locks api (#31166) - feat(fmt): add sortNamedImports and sortNamedExports options (#33313) - feat(fmt): infer config from .editorconfig (#34071) - feat(fmt): use lax-css for CSS, SCSS, and Less (#35160) - feat(fmt): use lax-markup for HTML, XML, SVG, and components (#35174) - feat(fmt): use lax-sql for SQL formatting (#35161) - feat(http): allow disabling serve compression (#35253) - feat(http): disable Deno.serve automatic compression by default (#35486) - feat(install): create node_modules for workspace members (#34970) - feat(install): seed deno.lock from bun.lock (#35394) - feat(install): seed deno.lock from package-lock.json (#35330) - feat(install): seed deno.lock from pnpm-lock.yaml (#35346) - feat(install): seed deno.lock from yarn.lock (#35350) - feat(install): warn on package.json engines mismatch (#34225) - feat(lockfile): auto-resolve git merge conflicts in deno.lock (#34726) - feat(lsp): add inferred type request (#35099) - feat(napi): implement Node-API version 10 (#35270) - feat(node): bump reported process.version to v26.3.0 (#34747) - feat(npm): install jsr deps into node_modules via npm-compat registry (#35029) - feat(npm): publishing-trust ranking and no-downgrade trust policy (#34927) - feat(runtime): add request_builder_hook for fetch token and cdn-loop headers (#35088) - feat(task): add --if-present flag to deno task (#35315) - feat(task): add --jobs/--concurrency flag to deno task (#35318) - feat(task): input-based caching with files/output/env (#34509) - feat(task): set npm_execpath, npm_node_execpath and npm_command for package.json scripts (#35317) - feat(test): add --changed and --related flags to deno test (#35199) - feat(test): add --shard flag to split a test run across machines (#35057) - feat(test): add Deno.test.each for parameterized tests (#34938) - feat(test): add retry and repeats options to Deno.test (#35053) - feat(test): built-in snapshot testing via t.assertSnapshot (#35139) - feat(test): show sub-millisecond test durations (#35200) - feat(unstable): CSS module imports (with { type: "css" }) (#35093) - feat: `deno desktop` subcommand (#33441) - feat: `deno remove --global` as alias for `deno uninstall --global` (#35327) - feat: add "preferPackageJson" deno.json setting (#35392) - feat: add stable --unsafe-proto flag (#34738) - feat: enable default minimum dependency age (#35458) - feat: stabilize "links" field in deno.json (#34996) - feat: stabilize bare node built-in resolution (#33316) - feat: support `ignore` option in `Deno.watchFs` (#31582) - feat: support navigator.userAgentData (#34743) - fix(check _[Truncated at 4000 characters — full notes: https://github.com/denoland/deno/releases/tag/v2.9.0]_ ### v2.8.3 - Date: 2026-06-11 - Version: v2.8.3 - Original notes: https://github.com/denoland/deno/releases/tag/v2.8.3 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.8.3 - **added** — Suggest DENO_TLS_CA_STORE when encountering untrusted TLS certificates - **added** — Support --env-file in dependency and registry subcommands - **added** — Support watch mode in deno compile - **added** — Support globs in links configuration - **added** — Implement SubtleCrypto.supports() static method - **added** — Support ML-DSA JWK import/export - **added** — Support priority in RequestInit for fetch - **added** — Auto-instrument node:http2 with OpenTelemetry - **added** — Notify control socket when node:http server starts serving - **added** — Honor OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT in telemetry - **added** — Honor OTEL_SPAN_EVENT_COUNT_LIMIT in telemetry - **added** — Support OTEL_TRACES_SAMPLER in telemetry - **added** — Add JSON trailing comma config to formatter - **added** — Add localPath to npm packages in deno info --json - **added** — Support --minimum-dependency-age flag in deno info - **added** — Add Debug code lens for test steps in LSP - **added** — Add Deno.test ignore and only code actions in LSP - **added** — Add deno x --ignore-scripts flag - **added** — Add bump-version -c to handle deno.json and package.json in same directory - **fixed** — Accept npm version ranges on the command line in deno add ###### 2.8.3 / 2026.06.11 - feat(cli): suggest DENO_TLS_CA_STORE on untrusted TLS certificate (#34756) - feat(cli): support --env-file in dependency and registry subcommands (#34843) - feat(compile): support watch mode (#34860) - feat(config): support globs in links (#34849) - feat(ext/crypto): implement SubtleCrypto.supports() static method (#34903) - feat(ext/crypto): support ML-DSA JWK import/export (#34914) - feat(ext/fetch): support `priority` in `RequestInit` (#34716) - feat(ext/node): auto-instrument node:http2 with OpenTelemetry (#34510) - feat(ext/node): notify control socket when node:http server starts serving (#34949) - feat(ext/telemetry): honor OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT (#34787) - feat(ext/telemetry): honor OTEL_SPAN_EVENT_COUNT_LIMIT (#34795) - feat(ext/telemetry): support OTEL_TRACES_SAMPLER (#34764) - feat(fmt): add JSON trailing comma config (#33383) - feat(info): add localPath to npm packages in `deno info --json` (#34806) - feat(info): support --minimum-dependency-age flag (#34762) - feat(lsp): add "Debug" code lens for test steps (#34742) - feat(lsp): add Deno.test ignore and only code actions (#34861) - feat(lsp): diagnose import map files (#34864) - feat(lsp): provide hover info for import map resolutions (#34854) - feat(lsp): report `deno doc --lint` diagnostics (#34733) - feat(lsp): show no-slow-types diagnostics for JSR packages (#34740) - feat(outdated): warn about packages skipped due to registry errors (#34974) - feat(test): forward shebang permissions into `deno test --doc` (#35052) - feat(workspace): auto-discover external deno.json import maps (#34803) - feat(x): add deno x --ignore-scripts (#34952) - feat: `bump-version -c` to handle deno.json + package.json in same dir (#34770) - fix(add): accept npm version ranges on the command line (#34799) - fix(bundle): apply node-style CJS interop on all platforms (#34939) - fix(bundle): don't panic when esbuild binary is busy or unavailable (#34845) - fix(bundle): instantiate .wasm imports instead of emitting raw bytes (#34923) - fix(bundle): rename sourcemap for HTML entrypoints (#34901) - fix(bundle): respect `--check` and run the type checker (#33514) - fix(cache): retry locked cache database instead of deleting it (#34873) - fix(check): honor ts suppressions for unresolved imports (#34163) - fix(check): ignore doc comment dynamic imports (#34888) - fix(check): surface unresolved imports in .d.ts entrypoints (#34168) - fix(check): treat .d.ts in ESM-supporting npm packages as ESM (#34613) - fix(clean): keep cleaning when cache files are locked and report holders (#34946) - fix(clean): support `deno clean --dry-run` without --except (#34846) - fix(cli): accept allow-import for deno add (#35019) - fix(cli): check worker's own permissions for dynamic asset imports (#34707) - fix(cli): collect re-exported names for `deno test --doc` injection (#33511) - fix(cli): don't let --env-file set Deno's own runtime control vars (#35032) - fix(cli): don't suggest non-existent subcommand-flag combinations (#34810) - fix(cli): generate type-only doc-test imports under verbatimModuleSyntax (#33508) - fix(cli): include the typed name in unrecognized subcommand error (#34882) - fix(cli): strip trailing CR from args so CRLF shebangs work (#34968) - fix(compile): prune managed npm snapshot to graph-reachable packages (#34741) - fix(compile): resolve bare npm imports in --bundle worker sources (#34967) - fix(compile): run forked child's module instead of entrypoint (#34687) - fix(compile): support fs.fstatSync on vfs (#34892) - fix(console): %c colors with same red component as previous color (#34784) - fix(core): don't set ERR_MODULE_NOT_FOUND code on module linking errors (#34800) - fix(core): externalize lazy loaded sources (#34936) - fix(core): silence too_many_arguments on Callable trait method (#33475) - fix(core): use isolate_unchecked accessors for fast `&v8::Isolate` args (#33474) _[Truncated at 4000 characters — full notes: https://github.com/denoland/deno/releases/tag/v2.8.3]_ ### v2.8.2 - Date: 2026-06-03 - Version: v2.8.2 - Original notes: https://github.com/denoland/deno/releases/tag/v2.8.2 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.8.2 - **added** — Add ChaCha20-Poly1305, SHAKE, cSHAKE, TurboSHAKE, and SHA-3 HMAC cryptographic algorithms - **added** — Add ML-DSA (FIPS 204) post-quantum signatures - **added** — Implement ML-KEM (FIPS 203) post-quantum KEM - **added** — Add environment and global proxy support for node:http and node:https - **added** — Support DENO_SERVE_ADDRESS override in node:http servers - **added** — Add autocomplete for jsr:, npm:, and node: in deno.json(c) imports in LSP - **added** — Add --env-file flag support to deno task - **added** — Support exclusion groups in task name wildcards - **added** — Add --bundle flag to deno compile - **changed** — Rewrite Jupyter kernel in JS and drop zeromq and runtimelib dependencies - **changed** — Improve --bundle dependency resolution in deno compile - **changed** — Scope --bundle npm embed to packages actually reached - **changed** — Bump deno_task_shell to 0.33.0 - **changed** — Unfurl import specifiers in Wasm modules during publish - **fixed** — Handle version tags like @latest in deno add for JSR packages - **fixed** — Replace panic with error when deno.json discovery fails - **fixed** — Skip decorator pass when module has no decorators in bundle - **fixed** — Use node-style CJS interop for the Deno platform in bundle - **fixed** — Skip WAL journal mode on WSL-1 in cache - **fixed** — Make node:stream/web types alias the globals ###### 2.8.2 / 2026.06.03 - feat(compile): improve --bundle dependency resolution and add --minify (#34536) - feat(compile): scope --bundle npm embed to packages actually reached (#34532) - feat(ext/crypto): add ChaCha20-Poly1305, SHAKE, cSHAKE, TurboSHAKE, SHA-3 HMAC (#34417) - feat(ext/crypto): add ML-DSA (FIPS 204) post-quantum signatures (#34448) - feat(ext/crypto): implement ML-KEM (FIPS 203) post-quantum KEM (#34447) - feat(ext/node): env/global proxy support for node:http and node:https (#34257) - feat(ext/node): support DENO_SERVE_ADDRESS override in node:http servers (#34662) - feat(jupyter): rewrite kernel in JS, drop zeromq/runtimelib deps (#34083) - feat(lsp): autocomplete jsr:/npm:/node: in deno.json(c) imports (#34724) - feat(publish): unfurl import specifiers in Wasm modules (#34549) - feat(task): support --env-file flag (#34508) - feat(task): support exclusion groups in task name wildcards (#34506) - feat(unstable): add --bundle flag to `deno compile` (#34527) - feat: bump deno_task_shell to 0.33.0 (#34642) - fix(add): handle version tags like `@latest` in `deno add` for JSR packages (#32859) - fix(add): replace panic with error when deno.json discovery fails (#34517) - fix(bundle): skip decorator pass when module has no decorators (#34489) - fix(bundle): use node-style CJS interop for the Deno platform (#34533) - fix(cache): skip WAL journal mode on WSL-1 (#34499) - fix(cache_dir): EnsureCachedStrategy must surface cached redirects (#34563) - fix(check): make node:stream/web types alias the globals (#34606) - fix(check): resolve npm packages without types when type checking (#34551) - fix(cli): suppress bug-report banner on broken pipe print panics (#34552) - fix(cli/task): run recursive workspace tasks in parallel (#34512) - fix(compile): allow process.chdir() into the VFS (#34610) - fix(compile): bundle workers separately under --bundle (#34531) - fix(compile): cover CJS-deep imports under --bundle (#34534) - fix(compile): create code cache when importing JSON or Wasm modules (#34614) - fix(compile): detect svelte-adapter-deno build output (#34535) - fix(compile): don't surface graph errors for --include files (#34568) - fix(compile): embed workspace package.json files in the VFS (#34530) - fix(compile): enable ANSI colors on Windows in compiled binaries (#34701) - fix(compile): handle CJS and native addons in --bundle (#34529) - fix(compile): respect npm registry sub-paths when flattening node_modules (#34575) - fix(compile): support workers loaded from blob URLs (#34574) - fix(compile): transpile TypeScript imported at runtime (#34616) - fix(config): hook up verbatimModuleSyntax for the emit pipeline (#34495) - fix(config): make config auto-discovery skip the same errors on every platform (#34558) - fix(config): surface invalid "exports" map in linked/workspace packages (#34473) - fix(config): warn instead of erroring when start dir is not a workspace member (#34458) - fix(config): warn instead of erroring when workspace member dir is missing (#34511) - fix(core): TLA hang on dyn import when async dep triggers lazy ESM load (#34469) - fix(core): preserve WebAssembly streaming callback across new contexts (#34679) - fix(crypto): correct X448 PKCS#8 handling (#34578) - fix(doc): don't lint private-type-ref for cross-package types (#34339) - fix(doc): handle non-ASCII doc lint diagnostics (#34626) - fix(ext/console): degrade gracefully when getKeys throws (#24980) (#34464) - fix(ext/fetch): implement missing Request properties (#34607) - fix(ext/fetch): preserve static request body length (#34546) - fix(ext/ffi): match V8 stack-arg layout in turbocall trampoline on Apple silicon (#34561) - fix(ext/fs): error when copyFile source and destination are the same file (#34718) - fix(ext/fs): retry without FILE_FLAG_BACKUP_SEMANTICS on Windows when driver rejects it (#34686) - fix(ext/fs): surface non-UTF-8 file names fr _[Truncated at 4000 characters — full notes: https://github.com/denoland/deno/releases/tag/v2.8.2]_ ### v2.8.1 - Date: 2026-05-27 - Version: v2.8.1 - Original notes: https://github.com/denoland/deno/releases/tag/v2.8.1 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.8.1 - **removed** — Revert polyfill of module.enableCompileCache and companions - **added** — Support browser field map in package.json for bundle - **fixed** — Read package.json sideEffects field in bundle - **fixed** — Provide clearer error when importing .node addon via ESM - **fixed** — Prevent panic when --config path cannot be converted to URL - **fixed** — Allow host objects to round-trip through core.deserialize - **fixed** — Keep lazy_loaded_esm sources across concurrent loads - **fixed** — Check resolved IPs against net deny list in fetch and websocket - **fixed** — Set TLSSocket.authorized to false when client presents no certificate - **fixed** — Accept array forms of cert/key/pfx in createSecureContext - **added** — Add missing node:util APIs getSystemErrorMap, transferableAbortSignal, and transferableAbortController - **fixed** — Allow omitting arguments in base64Slice - **fixed** — Attach register as static on Module - **fixed** — Do not throw NotFound for fs.exists - **fixed** — Drop extra positional arguments in promisified fs.promises - **fixed** — Emit error event for fs.watch open failures - **fixed** — Enforce minimum Miller-Rabin rounds in checkPrime - **fixed** — Extract cert/key from pfx in tls SecureContext - **fixed** — Prevent panic on node:sqlite aggregate method - **fixed** — Require env permission for process.loadEnvFile - **fixed** — Reset req.reusedSocket on transparent retry - **fixed** — Support PKCS#12 MACs other than SHA-1 - **fixed** — Tolerate non-AsyncWrap handles in _getNewAsyncId - **fixed** — Wake runtime after direct serve dispatch - **fixed** — Emit NodeWorker.attachedToWorker for late workers in inspector - **fixed** — Don't invoke Proxy traps in util.inspect - **removed** — Remove automatic @deno/shim-deno injection in pack - **fixed** — Lazy-loaded globals should shadow on inherited [[Set]] - **fixed** — Walk ancestor node_modules/.bin in BYONM mode for task - **fixed** — Preserve newlines after multi-line block comments in transpile - **fixed** — Restore brotli in CompressionFormat for dom/webworker libs - **fixed** — Use zstd-compress bsdiff delta patches in upgrade - **fixed** — Allow --inspect=localhost:0 to resolve hostnames - **fixed** — Fix panic in deno test --parallel - **fixed** — Support npm: specifiers in --preload and --import - **changed** — Reuse keep-alive timer in node:http server ###### 2.8.1 / 2026.05.27 - Revert "fix(ext/node): polyfill module.enableCompileCache and companions" (#34190) (#34348) - feat(bundle): support `browser` field map in package.json (#34407) - fix(bundle): read package.json sideEffects field (#34406) - fix(cli): clearer error when importing .node addon via ESM (#34361) - fix(config): don't panic when --config path can't be converted to URL (#34351) - fix(core): allow host objects to round-trip through core.deserialize (#34380) - fix(core): keep lazy_loaded_esm sources across concurrent loads (#34353) - fix(ext/fetch,ext/websocket): check resolved IPs against net deny list (#34236) - fix(ext/node): TLSSocket.authorized=false when client presents no cert (#34381) - fix(ext/node): accept array forms of cert/key/pfx in createSecureContext (#34379) - fix(ext/node): add missing node:util APIs getSystemErrorMap, transferableAbortSignal, transferableAbortController (#34372) - fix(ext/node): allow omitting arguments in base64Slice (#34318) - fix(ext/node): attach register as static on Module (#34305) - fix(ext/node): do not throw NotFound for fs.exists (#34244) - fix(ext/node): drop extra positional args in promisified fs.promises.* (#34347) - fix(ext/node): emit 'error' event for fs.watch open failures (#34398) - fix(ext/node): enforce minimum Miller-Rabin rounds in checkPrime (#34391) - fix(ext/node): extract cert/key from pfx in tls SecureContext (#34383) - fix(ext/node): prevent panic on `node:sqlite` aggregate method (#34385) - fix(ext/node): require env permission for process.loadEnvFile (#34350) - fix(ext/node): reset req.reusedSocket on transparent retry (#34376) - fix(ext/node): support PKCS#12 MACs other than SHA-1 (#34342) - fix(ext/node): tolerate non-AsyncWrap handles in _getNewAsyncId (#34413) - fix(http): wake runtime after direct serve dispatch (#34387) - fix(inspector): emit NodeWorker.attachedToWorker for late workers (#34377) - fix(node/util): don't invoke Proxy traps in util.inspect (#34373) - fix(pack): remove automatic @deno/shim-deno injection (#34411) - fix(runtime): lazy-loaded globals should shadow on inherited [[Set]] (#34405) - fix(task): walk ancestor node_modules/.bin in BYONM mode (#34364) - fix(transpile): preserve newlines after multi-line block comments (#34357) - fix(types): restore brotli in CompressionFormat for dom/webworker libs (#34349) - fix(upgrade): zstd-compress bsdiff delta patches (#34354) - fix: allow --inspect=localhost:0 to resolve hostnames (#34230) - fix: panic in deno test --parallel (#34378) - fix: support npm: specifiers in --preload and --import (#34346) - perf(ext/node): reuse keep-alive timer in node:http server (#34302) ### v2.8.0 - Date: 2026-05-22 - Version: v2.8.0 - Original notes: https://github.com/denoland/deno/releases/tag/v2.8.0 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.8.0 - **added** — Accept `deno audit fix` as alias for `deno audit --fix` - **added** — Add --watch flag to deno check - **added** — Add `deno bump-version` subcommand - **added** — Add `deno why` subcommand - **added** — Support workspaces in `deno bump-version` - **changed** — Default to npm registry for unprefixed packages in add/install - **added** — Add progress bar for deno compile - **added** — Support module.registerHooks() in compiled binaries - **added** — Add `Deno.core.loadExtScript()` for lazy-loaded scripts - **added** — Add async module resolution support via ModuleResolveResponse - **added** — Support lazy_loaded_esm modules via import statements - **added** — Add synthetic_esm extension DSL and node:worker_threads canary - **added** — Emit Network.* inspector events for fetch() - **added** — Add ESM import() support for module.registerHooks() - **added** — Add createHistogram to node:perf_hooks - **added** — Implement node:wasi - **added** — Implement module.registerHooks() API for CommonJS - **added** — Implement node:module SourceMap API - **added** — Support NODE_EXTRA_CA_CERTS - **added** — Add gRPC protocol support for OTLP exporter ###### 2.8.0 / 2026.05.22 Read more: http://deno.com/blog/v2.8 - feat: accept `deno audit fix` as alias for `deno audit --fix` (#34273) - feat: add --watch flag to deno check (#34224) - feat: add `deno bump-version` subcommand (#30562) - feat: add `deno why` subcommand (#32908) - feat: support workspaces in `deno bump-version` (#33689) - feat(add/install): default to npm registry for unprefixed packages (#33246) - feat(compile): add progress bar for deno compile (#33874) - feat(compile): support module.registerHooks() in compiled binaries (#33853) - feat(core): add `Deno.core.loadExtScript()` for lazy-loaded scripts (#33739) - feat(core): add async module resolution support via ModuleResolveResponse (#32432) - feat(core): support lazy_loaded_esm modules via import statements (#33873) - feat(core): synthetic_esm extension DSL + node:worker_threads canary (#34038) - feat(ext/fetch): emit Network.* inspector events for fetch() (#34220) - feat(ext/node): ESM import() support for module.registerHooks() (#33763) - feat(ext/node): add createHistogram to node:perf_hooks (#34003) - feat(ext/node): buffer Network.* bodies for inspector body-fetch commands (#34201) - feat(ext/node): convert node:url/util/zlib to synthetic_esm (#34041) - feat(ext/node): emit Network.* inspector events for node:http (#34231) - feat(ext/node): expose inspector.isEnabled() via process.binding('inspector') (#34203) - feat(ext/node): implement Network CDP domain for inspector (#32707) - feat(ext/node): implement NodeRuntime.notifyWhenWaitingForDisconnect (#34204) - feat(ext/node): implement module.registerHooks() API for CommonJS (#33733) - feat(ext/node): implement node:module SourceMap API (#32890) - feat(ext/node): implement node:wasi (#34089) - feat(ext/node): implement postMessageToThread cross-thread messaging (#34015) - feat(ext/node): implement vm.SourceTextModule with microtaskMode afterEvaluate support (#33603) - feat(ext/node): make Network.* CDP events fire under plain --inspect (#34270) - feat(ext/node): restore module.registerHooks (#34081) - feat(ext/node): support KeyObject structured clone over MessagePort (#34229) - feat(ext/node): support NODE_EXTRA_CA_CERTS (#33148) - feat(ext/node): support sending dgram.Socket handles over IPC (#33863) - feat(ext/telemetry): add gRPC protocol support for OTLP exporter (#30365) - feat(ext/web): support structured clone for Blob and File (#33827) - feat(ext/websocket): emit Network.* inspector events for WebSocket (#34222) - feat(install): add --os and --arch flags for cross-platform npm installs (#32785) - feat(install): added --prod to skip dev deps and @types (#33248) - feat(install): default to npm for `deno install -g` unprefixed packages (#34290) - feat(npm): add `catalog:` protocol for centralized dependency versions in workspaces (#32947) - feat(npm): add hoisted node_modules linker mode (#32788) - feat(npmrc): support min-release-age (#33983) - feat(task): prefix output lines with task name when running in parallel (#33805) - feat(test): add timeout option to Deno.test() (#33815) - feat(types): add Math.sumPrecise and Intl.Locale.prototype.variants (#34287) - feat(unstable): Geometry Interfaces Module Level 1 (#27527) - feat(unstable): support TC39 import defer proposal (#32360) - feat(x): add --package/-p flag for specifying package separately from binary (#32855) - feat: OffscreenCanvas (#29357) - feat: add --package-json flag to deno add/install/remove/uninstall (#33199) - feat: add `deno ci` subcommand (#34235) - feat: add `deno pack` command to create npm tarballs (#32139) - feat: add `deno transpile` subcommand (#32691) - feat: disable "no-process-global", "no-node-globals" lint rules by default (#33247) - feat: disable ops and resources sanitizers by default in deno test (#33250) - feat: framework detection for deno compile (#33164) - feat: implement `deno audit --fix` (#32909) - feat: include node lib _[Truncated at 4000 characters — full notes: https://github.com/denoland/deno/releases/tag/v2.8.0]_ ### v2.7.14 - Date: 2026-04-28 - Version: v2.7.14 - Original notes: https://github.com/denoland/deno/releases/tag/v2.7.14 - Permalink: https://whatsnew.fyi/product/deno/releases/v2.7.14 - **added** — Add fs.Utf8Stream to ext/node - **added** — Add delta updates via bsdiff patches to upgrade process - **fixed** — Treat CSS same-document fragment URLs as external in bundle - **fixed** — Add missing CacheStorage.keys() and Cache.keys() methods - **fixed** — Don't exclude workspace members from deploy file patterns in config - **fixed** — Exclude transformer-injected helpers from coverage - **fixed** — Remove background from operators in dark mode code blocks in doc - **fixed** — Provide clearer error when Deno.bundle is called in compiled binary - **fixed** — Throw TypeMismatchError for non-TypedArray in getRand in ext/crypto - **fixed** — Don't mutate caller's options in Deno.createHttpClient - **fixed** — Use byte ReadableStream for Node Readable request bodies in ext/fetch - **fixed** — Normalize Deno.watchFs paths so events drop ./ segments - **fixed** — Implement napi_async_init and napi_async_destroy in ext/napi - **fixed** — Default Deno.listenDatagram hostname to 0.0.0.0 in ext/net - **fixed** — Accept X.509v1 server certs in tls.createServer in ext/node - **fixed** — Accept string mode in fs.mkdir and fs.mkdirSync in ext/node - **fixed** — Add Server BlockList, asyncDispose, and misc net improvements in ext/node - **fixed** — Add _idleStart and _idleTimeout to Timeout in ext/node - **fixed** — Align crypto random* validation with Node in ext/node - **fixed** — Align fs.truncate / ftruncate argument validation with Node in ext/node ###### 2.7.14 / 2026.04.28 - feat(ext/node): add fs.Utf8Stream - feat(upgrade): delta updates via bsdiff patches (#33274) - fix(bundle): treat CSS same-document fragment URLs as external (#33492) - fix(cache): add missing CacheStorage.keys() and Cache.keys() methods (#33275) - fix(config): don't exclude workspace members from deploy file patterns (#33562) - fix(coverage): exclude transformer-injected helpers from coverage (#33481) - fix(doc): remove background from operators in dark mode code blocks (#33267) - fix(ext/bundle): clearer error when Deno.bundle is called in compiled binary (#33503) - fix(ext/crypto): throw TypeMismatchError for non-TypedArray in getRand (#33470) - fix(ext/fetch): don't mutate caller's options in Deno.createHttpClient (#33497) - fix(ext/fetch): use byte ReadableStream for Node Readable request bodies (#33432) - fix(ext/fs): normalize Deno.watchFs paths so events drop ./ segments (#33490) - fix(ext/napi): implement napi_async_init and napi_async_destroy (#33282) - fix(ext/net): default Deno.listenDatagram hostname to 0.0.0.0 (#33496) - fix(ext/node): accept X.509v1 server certs in tls.createServer (#33505) - fix(ext/node): accept string mode in fs.mkdir and fs.mkdirSync (#33409) - fix(ext/node): add Server BlockList, asyncDispose, and misc net improvements (#33417) - fix(ext/node): add _idleStart and _idleTimeout to Timeout (#33604) - fix(ext/node): align crypto random* validation with Node (#33456) - fix(ext/node): align fs.truncate / ftruncate argument validation with Node (#33418) - fix(ext/node): align module.builtinModules / getBuiltinModule with Node (#33404) - fix(ext/node): align node:module behavior with Node (#33482) - fix(ext/node): align node:test `it`/`describe` with Node, enable passing compat tests (#33593) - fix(ext/node): align util.styleText with Node (#33547) - fix(ext/node): allow `https.Agent()` without `new`, enable passing compat tests (#33601) - fix(ext/node): async fs.stat/lstat throwIfNoEntry + deprecate fs.Stats (#33436) - fix(ext/node): attach input URL to ERR_INVALID_FILE_URL_PATH (#33398) - fix(ext/node): attach path/syscall to fs.lstat / realpath / link errors (#33446) - fix(ext/node): brand-check SecureContext._external accessor (#33569) - fix(ext/node): cache hash digest so it survives stream.pipeline (#33440) - fix(ext/node): cancelling Readable.toWeb(req) no longer destroys the socket (#33570) - fix(ext/node): close fd on error in http2 stream respondWithFile (#33614) - fix(ext/node): correct buffer-length check in `Readable._fromList` decoder branch (#33624) - fix(ext/node): defer drain in http2 shutdownWritable so pushStream after end() works (#33619) - fix(ext/node): drain pending TLS cleartext in enc_write_cb (#33378) - fix(ext/node): emit Buffer for http2 'goaway' opaqueData (#33502) - fix(ext/node): emit DEP0031 deprecation warning for ecdh.setPublicKey( (#33468) - fix(ext/node): emit DEP0182 deprecation for short AES-GCM auth tag (#33469) - fix(ext/node): emit HPE_INVALID_TRANSFER_ENCODING for CL+chunked respo (#33488) - fix(ext/node): emit StatWatcher 'stop' event asynchronously (#33448) - fix(ext/node): emit TimeoutNaNWarning for invalid timer durations (#33472) - fix(ext/node): emit http2 frameError on send failure with translated HTTP/2 error code (#33631) - fix(ext/node): emit stream-level PROTOCOL_ERROR in node:http2 - fix(ext/node): emit tlsClientError instead of crashing on TLS init failure (#33429) - fix(ext/node): enable test-als-defaultvalue-original (AsyncLocalStorage default value) (#33464) - fix(ext/node): encode http2 headers as Latin-1 to fix response splitting (#33531) - fix(ext/node): encode more chars in url.pathToFileURL() (#33397) - fix(ext/node): enforce HTTP/2 server header list size limits (#33494) - fix(ext/node): enforce http2 maxSessionInvalidFrames limit (#33515) - fix(ext/node): expose http2 sensitive headers receive _[Truncated at 4000 characters — full notes: https://github.com/denoland/deno/releases/tag/v2.7.14]_