Next.js ESLint presets not compatible with ESLint 9 + Nx 22 flat-config — what is the correct way to support Next.js linting?
19:32 20 Nov 2025

Recently we upgraded to Nx 22 and ESLint 9, which broke a lot of linting across the repo because the old .eslintrc-style configs and Next.js presets aren’t compatible with flat-config.

I spent quite a bit of time digging through the issues and ended up:

  • removing the deprecated Next.js presets that no longer work under ESLint 9

  • migrating everything to a fully flat config

  • adding missing plugins (React Hooks etc.)

  • fixing imports that pointed to configs that no longer existed

  • stabilizing the ESLint + Nx project graph

  • restoring lint across 25 projects

After all that, everything was finally passing again.

Today the Software Architect closed my PR without any explanation or comment.

I’m trying very hard to stay professional, but honestly… it feels discouraging.
Not because the code was rejected — I’m always open to feedback — but because there was zero communication.

For those of you with more experience:
How do you deal with situations where the technical solution is correct, but someone above you shuts it down without talking?
Do you push back? Ask for clarification? Let it go?
What’s the mature way to handle this kind of dynamic?

Description of my PR

The issue happened because the project was still using the old ESLint configuration format, but Nx 22 and ESLint 9 only work with the new flat-config setup. Older settings like “extends,” the Next.js presets, and the old plugin format are no longer supported. Because of this, ESLint could not load the config at all, and the project graph failed before linting even started.

There was another problem as well: some apps were importing “nextjsConfig,” but that export no longer existed after switching to flat config. This caused linting to break for those projects. On top of that, the React Hooks rules were enabled, but the react-hooks plugin was never registered, so ESLint could not find those rules.

Proofs: 
1  ESLint removed compatibility mode for extends-based configs in new flat setups. 
Source: ESLint — “The old config system is deprecated and incompatible with flat-config.”
(official docs)

2 Next.js still exports only .eslintrc style presets. Source: their GitHub issues — “Next.js does not yet support flat-config fully.” (vercel/next.js #82967)

3 Nx team explicitly instructs:
“Do not use extends: "next/core-web-vitals" inside flat-config. It is not supported.”

4 FlatCompat cannot load Next.js config
Because Next.js exports CJS .eslintrc style configs, and ESLint 9 blocks loading them.

5. Nx flat/react-typescript fully replaces Next preset
It includes:
 - JSX rules
 - React rules
 - React hooks rules
 - TS rules
 - Module resolution
 - Env defaults
frontend eslint nomachine-nx