24.0.0 (2026-10-21)
🚀 Features
- angular: support angular v22.2 (#37234, #37375)
- ⚠️ angular: remove deprecated SCAM generators (#37508)
- ⚠️ core: remove deprecated nx watch --includeDependentProjects alias (#37311)
- core: let dependsOn opt out of a continuous dependency's inputs (#37246)
- ⚠️ core: deprecate executor custom hashers (#37310)
- core: suggest available targets and closest task id on run-one errors (#35863)
- core: own socket path resolution in the native crate (#36774)
- ⚠️ core: let tasks wait for a continuous dependency to be ready (#37224)
- core: keep always inputs under ultracache and scope e2e files with @nx-depends-on (#37257)
- core: include dependencies in project-selected inputs and support @nx-depends-on in Jest (#37258)
- core: make the migrate orchestrator the default for agent-driven runs (#37362)
- core: make stat collection a per-task opt-in (#37405)
- ⚠️ core: remove the legacy target-name cache fallback (#37313)
- core: select affected tasks by default (#37433)
- core: give nx migrate --run-migration the same agent flow as full runs (#37409)
- ⚠️ core: support ?? fallbacks in Nx tokens (#37410)
- ⚠️ core: finish v24 release-tag and pnpm prune cleanups (#37446)
- core: rename ultracache ignoredReads/ignoredWrites to ignoreReads/ignoreWrites (#37417)
- core: fetch ultracache configurations by default in CI (#37448)
- core: let dev servers signal readiness instead of guessing their port (#37455)
- core: say in nx show target and nx graph how ci treats a target under ultracache (#37489)
- ⚠️ core: remove deprecated NX_MIGRATE_SKIP_REGISTRY_FETCH env var (#37507)
- core: wait for dev servers by default, with a 10-minute readiness timeout (#37515)
- ⚠️ dotnet: make the inferred restore target opt-in (#36991)
- ⚠️ gradle: remove @nx/gradle/plugin-v1 and migrate to @nx/gradle (#37325)
- gradle: hash task inputs with includeIgnored and drop the gitignore classifier (#37323)
- js: name script targets with a single nx-target-name comment (#37418)
- js: read script shebangs natively and watch by default (#37522)
- ⚠️ linter: remove deprecated setParserOptionsProject generator option (#37509)
- maven: hash build output inputs with includeIgnored filesets (#37287)
- ⚠️ misc: remove no-op createDependencies exports from first-party plugins (#37253)
- misc: add rolldown plugin, node app bundler defaults and shebang script plugins (#37400)
- ⚠️ misc: migrate removed config helpers with loadable stubs (#37156)
- misc: remove deprecated executors (#37160)
- misc: add dev server readiness to the remaining plugins (#37483)
- ⚠️ module-federation: remove nx module federation and migrate to official plugins (#37221)
- node: report readiness from generated server apps with emitReadySignal (#37490)
- ⚠️ remix: remove generators and executors in v24 (e31a37ad31)
- testing: replace "@nx-ultracache: imports" with "@nx-ignore-server-inputs" (#37419)
- testing: run generated playwright e2e against the dev server locally and a production build in CI (#37121)
- testing: run generated cypress e2e against a production build in CI (#37130)
🩹 Fixes
- angular-rspack: mark the ssr engine manifest module as having side effects (#37471, #37468)
- bundling: stop rollup plugin from scanning the workspace during graph creation (#37492)
- core: drop the Node 24 ERR_USE_AFTER_CLOSE handlers (#37314)
- core: never hash continuous tasks from ultracache configurations (#37328)
- core: load the native binding once in the hash helpers (#37326)
- core: drop the redundant watch stop from daemon shutdown (#37315)
- core: replace the open package with a native URL opener (#36450, #34502)
- ⚠️ core: remove the dependsOn 'self' / 'dependencies' magic-string shim (#37312)
- core: stop three specs flaking on temp workspace cleanup and process order (#37309)
- core: forward environment updates to restarting plugin workers (#37064)
- core: detect the invoking package manager before inherited user agents (#37021)
- core: only report recursive task invocations from ancestor processes (#36481)
- core: prevent daemon client wedge on failed reconnect (#36820)
- core: resolve externalDependencies deterministically when several versions are installed (#37327, #37324)
- core: regenerate index.d.ts for the default cache size doc comment (#37353)
- core: stop install and commit prompts from hanging nx migrate agent runs (#37307)
- core: keep includeIgnored globs out of nested projects (#37403)
- core: disconnect batch workers once they report results (#37167, #37164)
- core: run batches in waves so deferred tasks can hit the cache (#37264)
- core: show output appended to a running task in the inline TUI (#37413)
- core: support pnpm build approvals declared by custom presets and plugins (#37057)
- core: ignore pnpm store-probe temp files in the watcher and walker (#37373)
- core: retry readyWhen probes every 250 ms by default (#37424)
- core: run postinstall steps only from the workspace's nx install (#37422)
- core: handle readyWhen hosts and ports dev servers resolve at startup (#37414)
- ⚠️ core: keep inferred project names when project.json omits a name (#37365)
- core: run optional update migrations in the --include=optional pass only (#37477)
- core: install after migrations that only change catalog entries (#37478)
- core: drop an empty default configuration from the task target (#37485)
- core: let processInBackground payloads fall back to v8 serialization (#37486)
- core: prevent stale cache hits when task inputs share a hash details key (#37397)
- core: show progress for nx affected on the daemon and for each nx reset step (#37514)
- core: pass release publish commands as argv instead of shell strings (#36874)
- core: hash every task an Nx Cloud agent starts (#37528)
- core: load the native binding under module.registerHooks() loaders (#37541)
- gradle: emit valid kotlin dsl when applying the plugin to an existing allprojects block (#37512)
- js: bump oxfmt to ^0.72.0 and keep installed formatter versions (#37335)
- ⚠️ js: framework plugins defer typecheck to @nx/js/typescript (#37342, #36744)
- js: resolve swc type-check rootDir against the workspace root (#37473)
- js: validate @nx/js/typescript compiler and configName options (#37516)
- maven: split class files from resources in shared output folders (#37286)
- maven: re-attach consumer POM per batch task on Maven 4.0.0-rc-7 (#37330)
- maven: prefer the project's Maven wrapper in batch mode (#37329)
- maven: use forward slashes in project roots and paths on Windows (#37383)
- maven: give every maven target explicit inputs (#37442)
- maven: do not cache exec-maven-plugin:java (#37542)
- misc: add origin/ defaultBase for bitbucket when affected has no defaultBase (#37445)
- misc: stop generators from accepting targets on removed executors (#37475)
- misc: harden v24 migrations (#37493)
- module-federation: throw from removed mf stubs outside graph creation (#37510)
- nextjs: declare Node types for generated applications (#37019)
- nuxt: pass an explicit app root when preparing types (#37020)
- nx-cloud: serialize client bundle downloads across processes with a file lock (#36870)
- nx-cloud: keep client bundle state files out of the install directory (#37349)
- nx-dev: redirect legacy global-nx link from older nx clis (#37412, #36616)
- nx-dev: replace old nx logo in favicon assets (#37519)
- nx-plugin: keep generated e2e package managers consistent (#37022)
- release: allow filtered releases with pending version plans for other groups (#37359)
- remix: address review feedback on the v24 removal (2989ece2ac)
- repo: notify slack when the publish job does not succeed (#37321)
- repo: guard JAVA17_HOME when no JDK is installed (#37355)
- repo: stop excluding nx native binary reads from sandbox tracking (#37377)
- repo: unblock Windows and FreeBSD publish builds after @nx/maven self-build (#37379)
- testing: isolate Yarn versions and release output in nightlies (#37023)
- testing: keep the build target of converted cypress component tests (#37480)
- vitest: allow vitest 5 when angular packages peer it (#37394, #37393)
⚠️ Breaking Changes
- linter: remove deprecated setParserOptionsProject generator option (#37509)
thesetParserOptionsProjectgenerator option is
removed. UseenableTypedLintinginstead.nx migraterewrites
generator defaults that set it, but not scripts that pass
--setParserOptionsProjecttonx g. - core: remove deprecated NX_MIGRATE_SKIP_REGISTRY_FETCH env var (#37507)
NX_MIGRATE_SKIP_REGISTRY_FETCHis removed, andnx migrateignores it. To keep resolving versions and migration metadata
through a package-manager install, set
NX_MIGRATE_USE_REGISTRY_RESOLUTION=falseor
migrate.useRegistryResolution: falseinnx.json. - angular: remove deprecated SCAM generators (#37508)
the@nx/angular:scam,@nx/angular:scam-directive,
@nx/angular:scam-pipe, and@nx/angular:scam-to-standalonegenerators
and their@nx/angular/generatorsexports are removed. Use the
@nx/angular:component,@nx/angular:directive, or@nx/angular:pipe
generators instead. - core: keep inferred project names when project.json omits a name (#37365)
This affects workspaces that run Nx with
NX_ISOLATE_PLUGINS=falseorNX_USE_V8_SERIALIZER=true, or that use
the WASM build of Nx. In those workspaces, a project whose project.json
has nonamewas named after its directory. It now gets the name Nx
already gives it with default settings. That name comes from its
package.jsonname, or from another plugin such as@nx/maven. For
example,packages/foowith the package name@scope/foochanges from
footo@scope/foo. Update commands and configuration that use the
old name, such asnx build fooorimplicitDependencies. To keep the
old name, set"name": "foo"in project.json. - js: framework plugins defer typecheck to @nx/js/typescript (#37342, #36744)
@nx/js/typescriptis the onlytsctypecheck
provider, in TS solution setups and outside them.@nx/rsbuild,
@nx/remix/pluginand@nx/react/router-pluginno longer infer a
typechecktarget and droptypecheckTargetName.@nx/vite/plugin
infers one only for Vue projects (vue-tsc). Each package's 24.0.0
migration registers@nx/js/typescriptwhere it's missing. - dotnet: make the inferred restore target opt-in (#36991)
@nx/dotnetno longer infers arestoretarget. Run
dotnet restoredirectly, or set"restore": truein the plugin's
options in nx.json.
Stacked on #36981, and aimed at the 24 train. The last commit is the new
work. - core: finish v24 release-tag and pnpm prune cleanups (#37446)
- core: support ?? fallbacks in Nx tokens (#37410)
- An
outputsplaceholder whose option is0orfalseresolves to
that value instead of dropping the output. {env.*}and??fallbacks in the release settings that resolve
placeholders, such as tag patterns and commit messages, are an error
instead of literal text. DockerversionSchemes, which@nx/docker
resolves, are unchanged.- Direct-mode
nx:run-commands, the default, builds the command env the
way forked mode does.envFilereferences see the project's.env
values, and an empty shell variable no longer overrides anenvFile
value.NX_LOAD_DOT_ENV_FILESand the root.envfollow the task env,
not the Nx process, except for a command in a pseudo-terminal (see
Implementation Notes).
- An
- misc: migrate removed config helpers with loadable stubs (#37156)
Deprecated config helpers no longer configure builds.
Existing workspaces must follow the migration instructions. - core: remove the legacy target-name cache fallback (#37313)
- module-federation: remove nx module federation and migrate to official plugins (#37221)
- core: let tasks wait for a continuous dependency to be ready (#37224)
- core: deprecate executor custom hashers (#37310)
- misc: remove no-op createDependencies exports from first-party plugins (#37253)
- remix: remove generators and executors in v24 (e31a37ad31)
- gradle: remove @nx/gradle/plugin-v1 and migrate to @nx/gradle (#37325)
- core: remove the dependsOn 'self' / 'dependencies' magic-string shim (#37312)
dependsOnentries withprojects: 'self'or
projects: 'dependencies'are no longer special. Runnx repairto
rewrite them to the token form. - core: remove deprecated nx watch --includeDependentProjects alias (#37311)
nx watch --includeDependentProjectsis removed. Use
--includeDependencies.
❤️ Thank You
- AgentEnder @AgentEnder
- Cestercian @cestercian
- Charlie Croom
- Christopher Buss @christopher-buss
- Craigory Coppola @AgentEnder
- FrozenPandaz @FrozenPandaz
- Jack Hsu @jaysoo
- James Henry @JamesHenry
- Jason Jean @FrozenPandaz
- Kyle Cannon @kylecannon
- Leosvel Pérez Espinosa @leosvelperez
- meeroslav @meeroslav
- Minijus L @minijus
- Miroslav Jonaš @meeroslav
- Victor Savkin @vsavkin