github nrwl/nx 24.0.0

one hour ago

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)
    the setParserOptionsProject generator option is
    removed. Use enableTypedLinting instead. nx migrate rewrites
    generator defaults that set it, but not scripts that pass
    --setParserOptionsProject to nx g.
  • core: remove deprecated NX_MIGRATE_SKIP_REGISTRY_FETCH env var (#37507)
    NX_MIGRATE_SKIP_REGISTRY_FETCH is removed, and nx migrate ignores it. To keep resolving versions and migration metadata
    through a package-manager install, set
    NX_MIGRATE_USE_REGISTRY_RESOLUTION=false or
    migrate.useRegistryResolution: false in nx.json.
  • angular: remove deprecated SCAM generators (#37508)
    the @nx/angular:scam, @nx/angular:scam-directive,
    @nx/angular:scam-pipe, and @nx/angular:scam-to-standalone generators
    and their @nx/angular/generators exports 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=false or NX_USE_V8_SERIALIZER=true, or that use
    the WASM build of Nx. In those workspaces, a project whose project.json
    has no name was named after its directory. It now gets the name Nx
    already gives it with default settings. That name comes from its
    package.json name, or from another plugin such as @nx/maven. For
    example, packages/foo with the package name @scope/foo changes from
    foo to @scope/foo. Update commands and configuration that use the
    old name, such as nx build foo or implicitDependencies. To keep the
    old name, set "name": "foo" in project.json.
  • js: framework plugins defer typecheck to @nx/js/typescript (#37342, #36744)
    @nx/js/typescript is the only tsc typecheck
    provider, in TS solution setups and outside them. @nx/rsbuild,
    @nx/remix/plugin and @nx/react/router-plugin no longer infer a
    typecheck target and drop typecheckTargetName. @nx/vite/plugin
    infers one only for Vue projects (vue-tsc). Each package's 24.0.0
    migration registers @nx/js/typescript where it's missing.
  • dotnet: make the inferred restore target opt-in (#36991)
    @nx/dotnet no longer infers a restore target. Run
    dotnet restore directly, or set "restore": true in 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 outputs placeholder whose option is 0 or false resolves 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. Docker versionSchemes, which @nx/docker
      resolves, are unchanged.
    • Direct-mode nx:run-commands, the default, builds the command env the
      way forked mode does. envFile references see the project's .env
      values, and an empty shell variable no longer overrides an envFile
      value. NX_LOAD_DOT_ENV_FILES and the root .env follow the task env,
      not the Nx process, except for a command in a pseudo-terminal (see
      Implementation Notes).
  • 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)
    dependsOn entries with projects: 'self' or
    projects: 'dependencies' are no longer special. Run nx repair to
    rewrite them to the token form.
  • core: remove deprecated nx watch --includeDependentProjects alias (#37311)
    nx watch --includeDependentProjects is removed. Use
    --includeDependencies.

❤️ Thank You

Don't miss a new nx release

NewReleases is sending notifications on new releases.