23.0.0
23.0.0
nx
View on GitHubView PackagePublished: Jun 16, 2026

Release Notes

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 prompt field 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 --include to 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 allWorkspaceFiles from 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 mcp to 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 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' in dependsOn entries (#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/plugin entry point has been removed; use @nx/dotnet. The included migration updates nx.json automatically. 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) The setupFile option of the @nx/jest:jest executor and the skipSetupFile option of the @nx/jest:configuration generator 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 deprecated initTasksRunner export is removed from the nx package. Consumers should use runDiscreteTasks / runContinuousTasks instead. 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:ngrx generator has been removed. Use @nx/angular:ngrx-root-store for root state and @nx/angular:ngrx-feature-store for 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:move generator is removed. Use @nx/workspace:move (or its mv alias) instead.
  • angular: remove deprecated @nx/angular/module-federation entry point (#35512) The @nx/angular/module-federation entry point is removed. Update imports to use @nx/module-federation/angular instead. The update-23-0-0-update-with-module-federation-import migration handles this automatically when running nx 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