Nuxt 3 End of Life: Upgrade to Nuxt 4.6

· vuejs, Development

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: useSession stores 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 with experimental.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 dev panel, plus new commands such as nuxt curl and nuxt 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:

  1. 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.
  2. Follow the official upgrade guide for the 3 to 4 changes, ideally on a branch with the test suite green before you start.
  3. 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 init is gone: new projects start with npm create nuxt@latest. Update any scaffolding scripts or docs.
  • Mixing helpers: auto-imported defineEventHandler, getQuery and readBody are still h3's. Mixing them with nuxt/server imports in the same handler raises NUXT_E8012. Pick one per file.
  • h3 differences when you move a handler to nuxt/server: sendRedirect returns the response instead of sending it, createError takes status and statusText, and headers go through event.res.headers.
  • Typed $fetch, if you opt in: a Date returned by a handler becomes a string at the call site, and hand-written route type augmentations need rewriting.
  • Nuxt 2 and @nuxt/bridge are 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.