# Deno v2.9.0 — Release & Upgrade Intelligence
- **Product:** Deno (https://deno.com)
- **Version:** v2.9.0
- **Released:** Jun 25, 2026
- **Impact Score:** 5/10
- **Breaking Changes:** Not verified
- **Canonical Analysis:** https://changelogs.us/deno/updates/v2.9.0/

## Executive Summary (TL;DR)
Deno v2.9.0. Source highlight: Read more: http://deno.com/blog/v2.9

## New Features
- feat(bundle): add --declaration flag to generate rolled-up .d.ts files
- 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)

## Improvements
- perf(core): reduce snapshotted cppgc op member templates (#35298)
- perf(core): skip source ASCII checks in release runtime setup (#35186)
- perf(ext/crypto): port WebCrypto from JS to Rust (#34966)
- perf(ext/web): port console/inspect to Rust (cppgc object wrap) (#35087)
- perf(macos): enable chained fixups to cut pre-main startup (~0.8ms) (#35409)
- perf(runtime): lazy-load node:buffer and node:timers globals (#35373)

## Bug Fixes
- fix(check): treat npm .d.ts as CJS based on package.json (#35166)
- fix(core): always register isolate to prevent silent foreground task drop
- fix(core): don't cache WebIDL sequence keys in thread-local v8::Eternal
- fix(core): handle async op promise id wraparound (#35126)
- fix(core): make uv_compat ready queues thread-safe (#35175)
- fix(core): preserve custom .stack getters in error/test formatter (#35246)
