23.0.0 (2026-06-16)
🚀 Features
- ⚠️ angular: remove deprecated @nx/angular/module-federation entry point (#35512)
- ⚠️ angular: remove deprecated move generator (#35513)
- ⚠️ angular: remove deprecated ngrx generator (#35567)
- angular: deprecate convert-to-with-mf generator (#35862)
- angular: deprecate SCAM generators (#35887)
- ⚠️ bundling: drop legacy typescript plugin and align rollup buildLibsFromSource default (#35516)
- ⚠️ bundling: remove SVGR option and provide withSvgr migration (#35611)
- bundling: add Vite 7 -> 8 migrations (#35614)
- core: add support for '...' as a spread token when merging target config (#34285)
- core: show target uses task graph + filter broken dependsOn during normalization (#35367)
- core: add --mode and --multi-major-mode flags to nx migrate (#35497)
- core: support
promptfield in migration entries (#35638) - core: rename nx watch --includeDependentProjects to --includeDependencies (#35699)
- core: support filtered array-shape targetDefaults with projects and source (#35340)
- core: enable native Node.js TypeScript stripping by default (#35608)
- core: add shell tab-completion (bash, zsh, fish, powershell) (#34951)
- core: add agentic mode to nx migrate --run-migrations (#35718)
- core: add a migrate configuration section to nx.json (#35831)
- core: feed migration docs to agents in nx migrate (#35835)
- core: avoid redundant rematch in findMatchingConfigFiles (#35793, #35792)
- ⚠️ core: rename CreateNodes V2 types to canonical OG names (#35386, #32951)
- core: support prompt-only and hybrid migrations in Nx Console UI (#35822, #35718, #3153)
- core: add JSON schema for migrations.json files (#35888)
- core: add migrations for createNodesV2 -> createNodes rename (#35893, #35386)
- core: extend
nx migrate --includeto any package that supports optional updates (#35905) - core: report analytics events for the nx migrate flow (#35937)
- core: revert array-shape targetDefaults support pending redesign and reapplication (#36005, #35340, #35711, #35752, #35991)
- ⚠️ detox: deprecate the @nx/detox build and test executors (#35529)
- devkit: migrate
@nx/devkit/src/...deep imports (#35541, #34946) - ⚠️ devkit: deprecate the standalone parameter of addProjectConfiguration (#35883)
- gradle: stream batch task results to nx as they finish (#35487)
- js: support pnpm 11.2.2 (#35772)
- linter: allow prompt-only entries in migration nx-plugin-checks (#35700, #35638)
- linter: deprecate ESLint v8 support (#35819)
- ⚠️ misc: remove Tailwind CSS setup-tailwind generators (#35049)
- ⚠️ misc: remove deprecated stylesheet options from generators (#35103)
- misc: drop Node 20 support and bump @types/node (#35591)
- ⚠️ misc: deprecate executors with inferred-plugin replacements (#35576, #35517)
- ⚠️ misc: remove deprecated js option from component generators (#35616, #29111)
- misc: convert prompt generator migrations to use prompt field (#35688)
- ⚠️ misc: drop deprecated webpack plugin re-exports + v23 polish (#35659)
- misc: add --trustThirdPartyPreset flag to skip confirmation prompt (#35827, #35826)
- misc: remove migrations prior to v21 in preparation for v23 (#35909, #30839, #32904, #35900)
- misc: multi-version support compliance for detox, expo, react-native, and remix (#35885)
- misc: prompt analytics earlier in init flow (#35922)
- module-federation: deprecate old generators and add new consumer/provider generators (#35825)
- ⚠️ nextjs: deprecate withNx function (#35861)
- nx-dev: track docs analytics for code copy, LLM prompt, YouTube (#35526)
- nx-dev: add docs top banner for ai monorepos conference (#35956)
- nx-dev: support optional artwork in the promo banner card (#35992)
- ⚠️ release: drop deprecated releaseTag* flat properties and update v23 defaults (#35694)
- ⚠️ testing: deprecate the @nx/cypress:cypress executor (#35531, #35529)
- testing: bump cypress to 15.14 + remove stale Vite 8 guard (#35613)
- testing: add migration for Jest 30 snapshot guide link (#35629)
- ⚠️ testing: remove deprecated skipSetupFile and setupFile jest options (#35588)
- ⚠️ vite: remove vitest support in favor of @nx/vitest (#35517)
- ⚠️ vite: deprecate the nxViteTsPaths and nxCopyAssetsPlugin helpers (#35664)
- ⚠️ webpack: deprecate webpack/rspack config compose helpers (#35867)
🩹 Fixes
- angular: disable vitest watch by default (#35493)
- angular: multi-version support compliance (#35587)
- angular: only add @oxc-project/runtime on the vitest-analog path (#35734)
- angular: bump zoneJsVersion to ~0.16.0 to align with Angular v21 (#35799)
- angular-rspack: keep root-scoped assets out of per-locale i18n emit (#35621)
- angular-rspack: exclude eslint config from tailwind v4 source scan (#35663)
- angular-rspack: apply multi-version compliance to @nx/angular-rspack(-compiler) (#35806)
- angular-rspack: dispose stylesheet bundler so one-shot builds exit (#35869)
- bundling: include tsconfig solution input for rollup (#35476)
- bundling: include tsconfig solution input for webpack (#35477, #35476)
- bundling: multi-version support compliance for @nx/esbuild (#35768)
- core: remove redundant
allWorkspaceFilesfrom the project graph pipeline (#34425) - core: prevent spinner flicker when sync applying (#35445)
- core: exclude hyperfine env vars from daemon env reflection (182273670a)
- core: provide actionable feedback when running migrations and pre-install fails with npm peer dep errors (#33961, #33942)
- core: consider virtual trees in multiGlobWithWorkspaceContext (#35447, #31805, #35373, #32588)
- core: surface ./nx --version stderr and force devDeps install (#35469)
- core: keep continuous children alive when nx:noop orchestrator completes (#35388)
- core: start TUI event reader synchronously in enter() to prevent stdin race (#35465, #34619, #34144)
- core: use require for global to local Nx handoff so Windows drive paths work (#35478)
- core: prevent daemon shutdown from cache-poisoned in-process nx loads (#35482, #35444, #34463, #34111)
- core: add provenance check in nx console status path (#35485)
- core: skip target-defaults synthesis when defaults are incompatible with the specified target (#35486)
- core: native watcher rewrite + daemon hardening for daemon-on e2e (#35204, #14, #19, #12, #13)
- core: remove access control header from graph app (#35494)
- core: preserve hydrateFileMap back-compat for cached nx-cloud workers (#35502, #34425)
- core: correctly classify same-second in-place updates in macOS watcher (#35514)
- core: restore deprecated allWorkspaceFiles on WorkspaceFileMap (#35518, #34425, #35502)
- core: ensure verbose logs go to stderr and daemon logs are properly decorated (#34358)
- core: show flaky-task count in run summary (#35491)
- core: unique telemetry user_id; expose workspace_id dimension (#35553)
- core: use workspace root for package manager detection in script targets (#35550, #35116)
- core: update minimatch to 10.2.5 (#35569, #34660)
- core: restore use-legacy-versioning shim for @nx/js@21 ensurePackage path (#35574)
- core: isolate NX_PARALLEL env var in parallel-related specs (#35579)
- core: bump axios to 1.16.0 for all packages (#35568)
- core: skip handleimport miss path when nx key packages are absent (#35596)
- core: use gethostuuid(3) instead of ioreg on macOS (#35599)
- core: isolate cache env vars in splitArgs spec (#35584)
- core: enable node's native v8 compile cache support (#35415, #20454)
- core: error with helpful error instead of looping nx invocations (#34820)
- core: support skipped batch tasks end-to-end and fix TUI double logs (#35617)
- core: keep TUI task selection on the in-progress section (#35640)
- core: drain in-flight notify events in daemon force_flush_pending (#35646, #35630)
- ⚠️ core: drop legacy 'self'/'dependencies' magic strings in dependsOn (#35648, #4017)
- core: correct TUI sidebar viewport height off-by-one (#34682)
- core: allow
nx mcpto run outside of an Nx workspace (#35655) - core: warn before installing unknown npm packages as preset (#35644)
- core: freshness-gate daemon recompute + per-OS force-flush grace (#35650, #35646)
- core: improve nx migrate multi-major flag handling and feedback (#35673, #35497, #35444)
- core: use native graceful process tree shutdown (#33655, #32438)
- core: warn instead of silently dropping legacy 'self'/'dependencies' dependsOn values (#35687, #35648)
- core: preserve input order in createNodes plugin results (#35595)
- ⚠️ core: remove deprecated initTasksRunner API (#35708, #29993)
- core: do not drop target defaults in 23.0.0 array migration (#35711)
- core: restore nx/src/index entrypoint for Nx Cloud client compatibility (#35712, #35708)
- core: resolve local plugin subpath imports from source (#35631)
- core: treat undefined task parallelism as parallel when scheduling (#35736)
- core: handle object form of bin field in getPrettierPath (#35680)
- core: detect vscode copilot ai agent (#35757)
- core: allow local plugin subpath imports without custom conditions (#35751, #35631)
- core: always set task.cache as an explicit boolean (#35778)
- core: update brace-expansion and yaml (#35790)
- core: allow nx build scripts in generated pnpm-workspace.yaml (#35564)
- core: update tmp to 0.2.6 due to CVE-2026-44705 (#35813)
- core: correct nx migrate commit-tally undercount and consolidate outcome state (#35820)
- core: read pod cgroup limits instead of node limits in resource metrics (#35622, #35665)
- core: forward full task graph to batch executors under DTE (#35859)
- core: support local plugins using NodeNext .js import specifiers (#35834)
- core: gate nx migrate first-party/third-party modes to Nx v23+ targets (#35830)
- core: correct 'occured' typo to 'occurred' in error messages (#35852)
- core: use workspace package manager when fetching migrations via install (#35866)
- core: disallow nx migrate --interactive for Nx v23+ targets (#35874)
- core: pre-authorize agentic handoff writes and consult the user before failing a step (#35889)
- core: respect --no-interactive across all nx migrate prompts (#35884)
- core: keep daemon alive when a recompute's plugin load fails (#35705, #35650)
- core: respect NX_PREFER_TS_NODE over native type stripping (#35892)
- core: respect package manager minimum release age in nx migrate (#35902)
- core: show agentic migration prompt descriptions only for the focused choice (#35908)
- core: allow analytics requests through Claude Code sandbox network filter (#35949)
- core: exclude NX_CLOUD_ env vars from daemon env reflection (#35961)
- core: degrade cooldown-blocked dist-tags within their own channel (#35967)
- core: override shell-quote to ^1.8.4 to patch GHSA-w7jw-789q-3m8p (#35974)
- core: re-hash batch tasks with deps outputs after execution (#35980, #34798)
- core: do not fail local plugin lookup when workspace has no root tsconfig (#35969, #35631, #35751, #35970)
- core: handle --help for commands that bypass workspace handling (#35989, #32662)
- core: allow {projectRoot} after the start of an output when project is at the workspace root (#35993, #26244, #35839)
- core: read and replay cached failures when NX_CACHE_FAILURES is enabled (#35997, #35901)
- detox: generate valid JSON in .detoxrc for non-expo apps (bde1f18cef)
- devkit: drop build-base outputs override (#35542, #34946)
- devkit: only rewrite deep-import paths in real import sites (#35566, #35541, #35565, #3131)
- devkit: exclude dist from jest module path scan (#35615)
- dotnet: correct output paths for Web SDK and centralized dist setups (#35398)
- dotnet: include Directory.. files in inputs (#35738)
- dotnet: declare obj output for publish/pack and track vitest dep spec tsconfig input (#35858)
- ⚠️ dotnet: graduate @nx/dotnet — drop experimental banner and the /plugin export (#35895)
- gradle: exclude batch-runner from jest haste-map crawl (#35501)
- gradle: exclude project-graph from jest module path scan (#35609)
- gradle: support Windows file paths (#35184, #34987)
- gradle: add transitive:true to all tasks (#35677)
- gradle: pin generated e2e project toolchain to installed JDK (#35703)
- gradle: make project graph configuration hash deterministic (#35972)
- gradle: exclude incremental-compilation .bin files from task inputs (#35975)
- js: include extended tsconfigs from project references in typecheck inputs (#35457)
- js: strip glob from inferred outputs before resolving as path (#35463, #35452)
- js: reference vitest.config in eslint dep-checks for vitest libs (#35460, #33670, #35450)
- js: include transitive workspace deps in pruned pnpm lockfile (#35532, #35347, #34655)
- js: build to local dist and use nodenext (#35538)
- js: add backwards-compatible ./src/internal export shim for conformance@4/5 (#35710, #11347)
- js: always register transpiler for registerTsProject so subsequent require(file) will work (#35735)
- js: fall back to npm publish when bun publish fails with auth error (#35756)
- js: multi-version support compliance (#35725)
- js: support auto mode for non-pnpm lock files in affected detection (#35141, #34937)
- js: handle already-published version errors in release-publish executor (#35782, #35235)
- js: use TypeScript readConfigFile instead of JSON.parse in resolvePathsBaseUrl (#35539, #34965, #35537, #35824)
- js: align tsconfig include and exclude inputs inference with TypeScript behavior (#35876)
- js: correct inferred tsbuildinfo output path when rootDir is set (#36011)
- linter: detect root lint target added in same generator run (#35296, #23147, #34531)
- linter: prevent ENOENT crash in getRelativeImportPath for unresolvable paths (#35007, #13872, #34066, #30491, #16716, #35006, #21889, #32190)
- linter: improve convert-to-flat-config output fidelity (#35330)
- linter: only rewrite workspace-package peer deps to workspace:* (#35423, #35318, #33417)
- ⚠️ linter: migrate @nx/eslint and @nx/eslint-plugin to local dist build (#35720)
- linter: multi-version support compliance for @nx/eslint and @nx/eslint-plugin (#35811, #35806)
- maven: skip attached artifacts that fail to materialize in batch record (#35473)
- maven: serialize Maven 4 build state recording (#35555)
- maven: widen runCLI timeout for --no-batch maven.test.ts cases (#35589)
- misc: exclude stories and specs from tailwind content scanning (#35470)
- misc: resolve pnpm catalog: refs in version lookups (#35459, #35453)
- misc: adopt PluginCache across createNodes plugins to prevent flaky cache parse errors (#35544)
- misc: vite migration import fix and ai doc corrections (#35647)
- misc: stop inferring
projects: 'self'independsOnentries (#35686) - misc: skip
$escaping in file paths on windows (#35692) - misc: multi-version compliance for @nx/express, @nx/node, and @nx/nest (#35807)
- misc: publish migration prompt files and report the real migrate fetch error (#35886)
- misc: multi-version support compliance for rollup, webpack, and module-federation (#35860)
- misc: rename createNodesV2 value usages in v23 migration, not just imports (#35930)
- misc: declare continuous on inferred executor targets (#35941)
- misc: fix gitlab ci workflow for new repos and merge requests (#34237)
- module-federation: bound static remote proxy port check to avoid nx serve hang (#35996, #33871, #33909)
- nextjs: use cached project graph in withNx (#35475, #34518, #32880)
- nextjs: multi-version support compliance (NXC-4395) (#35870)
- node: include tsconfig input in node-app esbuild scaffold (#35466)
- nx-dev: document nested CLI subcommands beyond two levels (#35519)
- nx-dev: short-circuit bot probes in framer rewrite edge function (#35527)
- nx-plugin: plugin lint checks should use dependentTasksOutputFiles (#35755)
- react: withSvgr migration preserves other properties (#35484)
- react: multi-version support compliance (NXC-4399) (#35872)
- react-native: fix TS2742 build error and retarget rollup/webpack migrations to beta.24 (#35896)
- release: handle short and full project names in commit scopes (#34219)
- release: restore packages/devkit/package.json after release (#35598, #34946)
- release: skip expensive changelog operations when changelogs are disabled (#35405)
- release: scope fallback to project history for new packages (#35323)
- release: require docker config for docker versioning (#35841)
- release: scope ambiguous-scope check to active release group's projects (#35745, #35744)
- remix: correct migration implementation path for flat-build packages (#35899, #35893)
- repo: resolve graph-client build-client sandbox violations (#35522)
- repo: drop node 26 from nightly matrix until playwright/yauzl fix (#35626, #40724, #168)
- repo: run dotnet restore before publish (#35771)
- repo: run dotnet restore before macos e2e job (#35774)
- repo: rename publish VERSION env var to avoid MSBuild leak (#35849)
- repo: set workspace-plugin type to module to silence Node strip-types warning (#35880)
- ⚠️ repo: migrate remaining first-party plugins to local dist build (M2-M5) (#35785, #34946, #35743)
- repo: use import type for type-only @nx/devkit imports in copy-a… (#35897)
- repo: increase FreeBSD publish VM memory to prevent OOM (#35914)
- repo: correct config path in update-repos scripts and use next migrate CLI (#35968, #35915)
- rsbuild: infer build outputs from distPath.root directly (#35707)
- rspack: multi-version support compliance for @nx/rspack and @nx/rsbuild (#35676)
- storybook: multi-version support compliance (#35770)
- testing: convert executor-based jest.config.ts and preserve type-only imports (#35286, #34593)
- testing: pin jest to ~30.3.0 to avoid jest-runtime 30.4 RN incompat (#35618)
- testing: handle absolute cypress screenshotsFolder/videosFolder paths (#35624)
- testing: correct paths and reserve ports across flaky React MF e2e tests (#35633, #34148, #32948, #35325)
- testing: multi-version support compliance for @nx/playwright (#35642)
- testing: exclude dist and out-tsc from default jest module path scan (#35619)
- testing: multi-version support compliance for @nx/cypress (#35670)
- testing: correct yargs-parser import in getJestProjectsAsync (#35672, #35654)
- ⚠️ testing: migrate @nx/jest to local dist build (#35713)
- testing: publish @nx/vitest, @nx/cypress, @nx/playwright, @nx/vite from local dist (#35743)
- testing: enforce jest 29-30 multi-version compliance for @nx/jest (#35758)
- testing: give remix integrated e2e tests headroom for npm install (#35998)
- vite: enforce multi-version support windows for @nx/vite and @nx/vitest (#35671)
- vite: improve vitest 4 migration to better handle vitest workspace config (#35940)
- vue: multi-version support compliance for @nx/vue and @nx/nuxt (#35845)
- webpack: add webpack tooling to devDependencies in the v23 migration (#35944)
⚠️ Breaking Changes
- dotnet: graduate @nx/dotnet — drop experimental banner and the /plugin export (#35895)
** the@nx/dotnet/pluginentry point has been
removed; use@nx/dotnet. The included migration updatesnx.json
automatically.Related Issue(s)
N/A - repo: migrate remaining first-party plugins to local dist build (M2-M5) (#35785, #34946, #35743)
- devkit: deprecate the standalone parameter of addProjectConfiguration (#35883)
- webpack: deprecate webpack/rspack config compose helpers (#35867)
- core: rename CreateNodes V2 types to canonical OG names (#35386, #32951)
- nextjs: deprecate withNx function (#35861)
- vite: deprecate the nxViteTsPaths and nxCopyAssetsPlugin helpers (#35664)
- testing: remove deprecated skipSetupFile and setupFile jest options (#35588)
ThesetupFileoption of the@nx/jest:jestexecutor
and theskipSetupFileoption of the@nx/jest:configurationgenerator
are removed. - misc: drop deprecated webpack plugin re-exports + v23 polish (#35659)
- linter: migrate @nx/eslint and @nx/eslint-plugin to local dist build (#35720)
- testing: migrate @nx/jest to local dist build (#35713)
- core: remove deprecated initTasksRunner API (#35708, #29993)
** The deprecatedinitTasksRunnerexport is removed
from thenxpackage. Consumers should userunDiscreteTasks/
runContinuousTasksinstead.Related Issue(s)
Internal: NXC-4307 - release: drop deprecated releaseTag* flat properties and update v23 defaults (#35694)
- misc: remove deprecated js option from component generators (#35616, #29111)
- core: drop legacy 'self'/'dependencies' magic strings in dependsOn (#35648, #4017)
- bundling: remove SVGR option and provide withSvgr migration (#35611)
- misc: deprecate executors with inferred-plugin replacements (#35576, #35517)
- angular: remove deprecated ngrx generator (#35567)
The@nx/angular:ngrxgenerator has been removed. Use
@nx/angular:ngrx-root-storefor root state and
@nx/angular:ngrx-feature-storefor feature state instead. - vite: remove vitest support in favor of @nx/vitest (#35517)
- bundling: drop legacy typescript plugin and align rollup buildLibsFromSource default (#35516)
- testing: deprecate the @nx/cypress:cypress executor (#35531, #35529)
- detox: deprecate the @nx/detox build and test executors (#35529)
- angular: remove deprecated move generator (#35513)
The@nx/angular:movegenerator is removed. Use
@nx/workspace:move(or itsmvalias) instead. - angular: remove deprecated @nx/angular/module-federation entry point (#35512)
The@nx/angular/module-federationentry point is
removed. Update imports to use@nx/module-federation/angularinstead.
Theupdate-23-0-0-update-with-module-federation-importmigration
handles this automatically when runningnx migrate. - misc: remove deprecated stylesheet options from generators (#35103)
- misc: remove Tailwind CSS setup-tailwind generators (#35049)
❤️ Thank You
- Abdullah Alaqeel @aqeelat
- Adam Keenan @adamk33n3r
- AgentEnder @AgentEnder
- AI-JamesHenry @AI-JamesHenry
- Alex
- Alex Croteau @cw-alexcroteau
- Amp
- Artur @arturovt
- beeman
- Benjamin Cabanes @bcabanes
- Benjamin Staneck @Stanzilla
- Charlie Croom
- Claude
- Claude Opus 4.6
- Claude Opus 4.8 (1M context)
- Copilot @Copilot
- Craigory Coppola @AgentEnder
- FrozenPandaz @FrozenPandaz
- Jack Hsu @jaysoo
- Jack Stevenson
- Jason Jean @FrozenPandaz
- jaysoo @jaysoo
- Justin McLellan @jmclellan-crexi
- Leosvel Pérez Espinosa @leosvelperez
- leosvelperez @leosvelperez
- llwt @llwt
- Louie Weng @lourw
- Max Kless
- MaxKless @MaxKless
- Minh Lê @DucMinhNe
- Miroslav Jonaš @meeroslav
- Olawuni Olagoke @olagokemills
- Optischa @Optischa
- Rares Matei
- rarmatei @rarmatei
- Sharon Lougheed
- ShwethaSundar
- Steven Nance
- Thiago Zanluca @zanlucathiago
- Thomas Dekiere @thdk