Nuxt 3 End of Life: Upgrade to Nuxt 4.6
Table of contents
If one of your projects still runs Nuxt 3, it is now running on unsupported software. According to endoflife.date, Nuxt 3's maintenance ended on July 31, 2026, and the last 3.x release is 3.21.11. Meanwhile, Nuxt 4.6 shipped on October 5 with a new server API, sessions, a rebuilt typed $fetch and Vue Vapor support. I use Nuxt on the front of several Laravel projects, so here is my take on the Nuxt 3 end of life and how I plan the upgrade.
What Nuxt 3 end of life means
End of life doesn't stop your site from working tomorrow. It means no more fixes, including security fixes. That matters for Nuxt in particular, because it runs code on your server, not just in the browser.
The July security releases are a good reminder. The Nuxt team published security patch releases (4.5.1 and 3.21.10) for server-side issues and recommended upgrading as soon as possible. The next issue of that kind will only be fixed in Nuxt 4. If you run SSR, server routes or cached pages, staying on Nuxt 3 is a risk that grows every month.
What's new in Nuxt 4.6
The release post lists a lot. The parts I find most useful in real projects:
nuxt/server: a new import source for server handlers, middleware and utilities, built on web standards. Code that imports from it doesn't depend on h3 or Nitro directly, and the post says it should run unchanged on Nuxt 5, which moves to Nitro v3 and h3 v2. Existing h3 imports keep working.- Sessions:
useSessionstores data sealed in a cookie, derived from a new root secret,runtimeConfig.appSecret(NUXT_APP_SECRET). Builds never generate this secret for you, so set it in production. - Typed
$fetch, rebuilt: opt-in on Nuxt 4 withexperimental.routeTypedFetch, and the default in Nuxt 5. It also checks request bodies, queries and headers, and avoids the old "type instantiation is excessively deep" errors on large apps. - Vue Vapor: supported in interop mode with Vue 3.6. You opt individual components in, the rest stays on the virtual DOM.
- Nuxt CLI v4: an interactive
nuxt devpanel, plus new commands such asnuxt curlandnuxt task.
Upgrading from Nuxt 3 to Nuxt 4
The jump from 3 to 4 is the real work; going from an older 4.x to 4.6 is small. My order of operations:
- Node first. Nuxt CLI v4 needs a recent Node: the release note gives
^22.22.3 || ^24.15.0 || >=26.0.0. Update your local machines, CI and the server (or Forge site) before anything else. - Follow the official upgrade guide for the 3 to 4 changes, ideally on a branch with the test suite green before you start.
- Upgrade the packages, then rebuild:
npx nuxt upgrade --dedupe
npm run build
npm run preview
Then click through the pages that matter: home, a listing, a detail page, any form that posts to a server route, and the login if you have one.
The breaking changes to check
From the 4.6 release notes, the ones worth a search in your codebase:
nuxt initis gone: new projects start withnpm create nuxt@latest. Update any scaffolding scripts or docs.- Mixing helpers: auto-imported
defineEventHandler,getQueryandreadBodyare still h3's. Mixing them withnuxt/serverimports in the same handler raisesNUXT_E8012. Pick one per file. - h3 differences when you move a handler to
nuxt/server:sendRedirectreturns the response instead of sending it,createErrortakesstatusandstatusText, and headers go throughevent.res.headers. - Typed
$fetch, if you opt in: aDatereturned by a handler becomes astringat the call site, and hand-written route type augmentations need rewriting. - Nuxt 2 and
@nuxt/bridgeare no longer supported at all.
Nuxt with a Laravel backend
On my Laravel + Nuxt projects, the API stays in Laravel and Nuxt mostly renders pages and proxies a few calls. For that setup the upgrade is mainly about Node, the build and SSR, and the new server API is optional: I would only move a server route to nuxt/server when I touch it anyway. Sessions are interesting for small sites without a separate API, less so when Laravel Sanctum already handles authentication. If you also run TypeScript, my notes on TypeScript 7 in Laravel + Vue projects still apply: keep vue-tsc on a compatible TypeScript version.
Conclusion
Nuxt 3 has been end of life since July 31, 2026, and Nuxt 4.6 is a good target: a clearer server API, sessions, faster typed $fetch and a path to Nuxt 5. Update Node first, follow the upgrade guide on a branch, run npx nuxt upgrade --dedupe, and check the few h3 and typing changes before you deploy. Read the Nuxt 4.6 release post for the full list.