All posts
Jun 2, 2026·8 min

Upgrading a real app to Next 16 + React 19

Next.jsReact

Upgrading to Next 16 and React 19 is mostly painless if your app is already on the App Router — but a few sharp edges drew blood.

React 19 tightened `cloneElement` ref typing and form `action` return types. Both were one-line fixes once the compiler pointed at them.

Next 16 removed `next lint` in favour of the ESLint CLI with flat config, and next-themes moved its types to the package root. The new react-compiler lint rules are noisy but worth reading.

The lesson, as always: upgrade often in small steps, keep the type-checker green, and read the migration guide before the stack trace reads it to you.