23.1.0
23.1.0
nx
View on GitHubView PackagePublished: Jul 13, 2026

Release Notes

23.1.0 (2026-07-13)

šŸš€ Features

  • āš ļø angular: support angular v22 (#35851, #35910)
  • core: show a performance report at the end of every run (#36077)
  • core: support filtered targetDefaults via the nested-array shape (#36049)
  • core: re-add isCacheableTask helper (#36177)
  • core: add mouse support to the terminal UI (#35868)
  • core: scaffold create-nx-workspace into the current directory (#36134)
  • expo: support Expo SDK 56 (#35904, #35714)
  • āš ļø linter: drop eslint v8 support (#36006)
  • linter: add migration to drop typescript-eslint v8-removed rules from flat configs (#36123)
  • misc: add next 14 to 15 and react 18 to 19 upgrade paths (#36031)
  • nx-cloud: add utm tracking to clickable cloud prompt links (#36028)
  • nx-dev: show product hunt launch banner in docs (#36112)
  • nx-dev: show product hunt launch banner in docs" (#36129, #36112)
  • release: add option to force changelog generation for programmatic usage (#36242)
  • repo: enable the tsgo compiler workspace-wide (#35926, #35047, #35167)
  • rspack: support @rspack/core@2 and @rsbuild/core@2 (multi-version compliance) (#35682, #35764, #13420, #781)
  • storybook: update Storybook to support Angular 22 (#36293)
  • testing: add migration to verify typecheck after the 23.1 migration (#36106)
  • vite: add configurable ts paths build/test targets and stabilize build coordination (#34890)

🩹 Fixes

  • angular: resolve esbuild option paths relative to the workspace root (#36017, #35936)
  • angular: bump prescribed angular version to 22.0.4 (#36130)
  • angular: make nx migrate to Angular 22 leave a buildable workspace (#36183)
  • angular-rspack: surface compilation failures as build errors and release resources on teardown (#36018)
  • bundling: restore preprocessor extensions in postcss normalizeOp… (#36057, #35854)
  • bundling: prevent TS6059 when an app imports a workspace lib from source (#36217, #35017)
  • core: avoid tsconfig path false positives for sibling project roots (#35796, #35795, #35786)
  • core: do not write minimumReleaseAgeExclude during nx migrate (#36045)
  • core: do not crash nx migrate on non-semver dependency specifiers (#36051)
  • core: format AI-edited files after agentic migrations (#36064)
  • core: prefer module.registerHooks to avoid DEP0205 deprecation warning (#36081)
  • core: prevent nx migrate crash when include=optional filters out the target package (#36087)
  • core: make nx migrate honor preapproved packages and emit a valid temp workspace (#36086)
  • core: skip daemon project-graph recompute on no-op file rewrites (#36082)
  • core: prevent the TUI from auto-selecting a completed task when a batch finishes (#35833)
  • core: deregister pseudo-terminal exit handlers when tasks finish (#36115)
  • core: prevent path traversal / zip-slip in self-hosted remote cache (#36116)
  • core: respect explicit --nxCloud=skip for AI agents in create-nx-workspace (#36131)
  • core: warn when the self-hosted remote cache disables TLS verification (NXC-4593) (#36132, #36116)
  • core: throw actionable error when pnpm .modules.yaml is missing (#35666, #35635)
  • core: support ${configDir} in tsconfig path alias resolution (#36037, #35804)
  • core: prevent non-npm devEngines pin from breaking npm registry lookups (#36020, #35815)
  • core: clarify nx sync remediation messaging and surface spinner output in non-tty (#35747)
  • core: exclude direct-dependency overrides from generated package.json (#36040, #35675)
  • core: apply target defaults when project.json overrides an inferred run-commands target with different commands (#36142, #36067)
  • core: run the nx.bat wrapper for dot-nx setup on windows (#36048)
  • core: refine the end-of-run performance report recommendations (#36127, #36077)
  • core: speed up bun lockfile parsing (#36198)
  • core: set NX_CLI_SET in batch worker processes (#36214, #36210)
  • core: use standard utm params on performance-report links (#36226)
  • core: preserve comments in catalog YAML updates (#35733)
  • core: box JsonFileSet payload to keep HashInstruction small (#36247, #35248, #36244, #36152)
  • core: share workspace fileset hash results instead of deep-cloning per task (#36244, #34971, #34942)
  • core: replace per-input visited clones with undo-log scoping in hash planner (#36248, #35071, #36152, #34971, #36244, #35248, #36247)
  • core: intern hash instructions in a pool and plan with id lists (#36249, #35071, #36152, #36248)
  • core: add trailing space after performance report popup title (#36259)
  • core: prevent TUI hint popup from permanently stealing focus (#36256)
  • core: detect Codex sandbox on Linux to disable daemon and plugin isolation (#36273)
  • core: skip projects-filtered targetDefaults when resolved without a project (#36281, #36049)
  • core: size TUI bottom bar reservations to the actual help text (#36261)
  • core: defer unresolved spread tokens when merging intermediate target configurations (#36283, #36235)
  • core: omit peer dependencies when installing packages to a temp dir (#36295)
  • core: include root package.json dependencies for '.'-rooted projects (#36291, #33791, #36290)
  • core: reduce task hashing memory usage on large workspaces (#36267, #36152)
  • devkit: restore prettier v2 support in formatFiles (#36193)
  • gradle: track copy/sync and AGP merge task outputs in dependent task inputs (#36099)
  • gradle: correct change-plugin-version-0-1-23 migration to nx 23.1.0-beta.4 (#36103, #36100)
  • gradle: make project graph reports machine-portable (#36210, #35388)
  • gradle: derive dependent-task input extensions from the task model instead of scanning disk (#36211)
  • graph: prevent project details web view top from being clipped (#36154)
  • js: prevent doubled output paths in buildable library path mappings (#36138, #36079)
  • js: scope incremental type-check .tsbuildinfo per project (#36137, #36113)
  • js: preserve npm allowScripts allowlist in pruned package.json (#36016, #35931)
  • js: resolve catalog references in pruned package.json output (#35805, #35419)
  • js: restore the pre-TypeScript 6 default of loading all @types (#36163)
  • js: avoid import locator unicode position panic (#36133, #36128)
  • js: prevent Windows TS6059 rootDir errors in tsc builds (#36184, #35696)
  • js: preserve esModuleInterop default when migrating to TypeScript 6 (#36225)
  • js: keep tsconfigs compiling and config files loading under TypeScript 6 (#36245)
  • js: wait for process tree exit when stopping node executor tasks (#36230)
  • js: pin tsconfig root dir even when it matches the config directory (#36272, #3175)
  • js: pin rootDir on composite tsconfigs for ts6 (ts-jest strips composite) (#36285, #36272)
  • js: bump @swc/cli to 0.8.1 to patch critical decompress advisory (#36294)
  • linter: install angular-eslint when converting Angular configs to flat config (#36160)
  • linter: run typescript-eslint v8 rule migrations for scoped-only workspaces (#36180)
  • linter: harden the ESLint v9 flat-config migration (#36204)
  • linter: reconcile angular-eslint v22 breaking changes in flat config (#36200)
  • linter: update terminal cli regex for local-dist build (#36201, #36199)
  • maven: de-flake maven e2e by dropping -X debug forks and widening timeout (#36091)
  • misc: bump happy-dom, tmp, and form-data to patched versions (#36013)
  • misc: bump axios to 1.16.1 (#36120)
  • misc: use default import for chalk in @nx/workspace output.ts (#35523, #35521, #34111, #21201, #26667)
  • misc: remove duplicate nx init cloud-prompt telemetry event (#36145)
  • misc: export @nx/esbuild/executors entry point (#36282)
  • nx-cloud: use standard utm params on cloud prompt links (#36227, #36226)
  • nx-dev: keep mobile sidebar toggle clear of the conference banner (#36047)
  • nx-dev: run next-sitemap directly instead of via pnpm (#36054)
  • nx-dev: remove empty SaaS and Mobile template filters (#36085)
  • react: skip react 19 update for workspaces using remix v2 (#36065, #418)
  • react: reserve ports in rspack e2e test to avoid default port collisions (#36090)
  • react: bump eslint-plugin-react below 7.35 for ESLint 9 compatibility (#36161)
  • react: stop pinning eslint-plugin-react in generated projects (#36168, #36161)
  • react: validate typecheck in the React 19 migration (#36186)
  • āš ļø release: stop breaking change changelog entry from swallowing trailing PR body (#36052, #35910, #33070)
  • release: widen release e2e timeouts to absorb pre-version dlx install (#36092)
  • repo: trust wix/brew tap so macOS detox CI can install applesimutils (#36146)
  • rsbuild: bump @rsbuild/plugin-sass with @rsbuild/core for the v2 migration (#36162)
  • rspack: use contenthash for chunkFilename to prevent stale chunks (#36136, #2292, #36014)
  • testing: keep ts-jest resolving exports-only libs on typescript < 6 (#36089)
  • testing: disable justInTimeCompile for webpack Cypress component testing (#36185)
  • testing: update eslint-plugin-cypress for ESLint 9 compatibility (#36202)
  • testing: template the e2e config for fresh projects instead of ast-parsing it (#36304)
  • vite: widen vite ts-solution e2e build timeouts for cold multi-lib build (#36093)
  • vite: detect @vitejs/plugin-vue2 (vite:vue2) for vue-tsc typecheck (#36125, #36094)
  • vite: update deprecation docs link (#36070, #36053)
  • vitest: apply mode-based config consistently in the test executor (#36041, #35196)
  • vitest: support passing mode through to vitest (#35069)
  • web: run executor/plugin/generator commands with the workspace package manager (#36021, #35950)
  • webpack: prevent TS6059 when a tsc build bundles a workspace lib (#36188, #35017)

āš ļø Breaking Changes

  • angular: support angular v22 (#35851, #35910) Angular v19 is no longer supported.
  • linter: drop eslint v8 support (#36006) ESLint v8 is no longer supported. Nx requires ESLint v9 or later.

ā¤ļø Thank You

  • AgentEnder @AgentEnder
  • Aidan Temple @aidant
  • Alex Croteau @cw-alexcroteau
  • Caleb Ukle
  • Claude Opus 4.8 (1M context)
  • Craigory Coppola @AgentEnder
  • cyphercodes @cyphercodes
  • FrozenPandaz @FrozenPandaz
  • Jack Hsu @jaysoo
  • James Henry @JamesHenry
  • Jason Jean @FrozenPandaz
  • Jithin Vijayan @itsjithinv
  • jithin_vijayan
  • Jonathan Garvey @jdgarvey
  • Leosvel PĆ©rez Espinosa @leosvelperez
  • leosvelperez @leosvelperez
  • Marwan Johnstone
  • Miroslav JonaÅ” @meeroslav
  • Rayan Salhab
  • Richard Roozenboom @Roozenboom
  • Sai Asish Y @SAY-5
  • Shai Reznik @shairez
  • Steffen Neubauer @stefreak
  • Steven Nance
  • titanniya542-spec @titanniya542-spec
  • Wilson Pinto