Nuxt 3 to 4 Migration Checker for Modules and Config
Plan a Nuxt 3 to 4 migration. Paste package.json to see which modules declare Nuxt 4 or 5, which nuxt.config options break, and the official checklist.
- Reads the npm registry
- Reads jsDelivr
- Reads api.nuxt.com
Checked
01Tool
Tool
Paste a package.json to see what each Nuxt module declares for Nuxt 4 or 5, which of your nuxt.config options the upgrade removes, and the checklist from the official guide.
02Guide
How it works
Nuxt 3 is past its end of life
Nuxt 3 no longer receives bug fixes or security patches. Nuxt 4 is the active major, and the roadmap commits to supporting it for at least six months after Nuxt 5 ships. The table further down lists the dates and the versions the checklists depend on.
The Nuxt team split the breaking changes on purpose. Nuxt 4 is a stability release that turns on by default what compatibilityVersion: 4 used to opt in to. Nuxt 5 follows with the move to Nitro v3 and further changes. A Nuxt 3 app goes through 4 first, so the checker shows the Nuxt 4 checklist before the Nuxt 5 preview.
What the checker reads
The checker parses your package.json in the browser and picks out every dependency named like a Nuxt module, plus any other dependency the module list on nuxt.com names. For each one it looks for a declared Nuxt range in three places, in this order:
dist/module.jsonon jsDelivr. A module built with Nuxt's module builder copies itsmeta.compatibilitythere. Nuxt checks that range when it loads the module and, when the running version falls outside it, disables the module with a warning in the console.peerDependencieson npm, undernuxtor@nuxt/kit. Some modules declare their range only here.- The module's listing on nuxt.com, used only when the package itself says nothing, and labelled as possibly stale. When this page was checked, nuxt.com listed
@nuxt/contentas>=3.0.0-rc.3, while the module's own module.json declared>=4.1.0 || ^3.19.0.
It reads two versions of each module: the newest one your range allows, and the latest release. When your range leaves Nuxt 4 out but the latest release declares it, the fix is a module upgrade, and the checker says which version.
Your nuxt.config goes through a TypeScript-aware parser, and keys inside $production, $development and $env overrides count as if set at the top level. Only literal values are read, so a value built from a variable shows as … rather than a guess.
A declared range is a claim, not a test
A range such as >=3.0.0 has no upper bound, so it allows Nuxt 4 and Nuxt 5 without naming either. The checker calls that an open range and counts it apart from a range that names the version. Open ranges are common in modules that predate Nuxt 4, and many of them work fine.
The reverse happens too. The roadmap lists Auth Utils, a planned core module, with Nuxt support for 4.x and 5.x, yet the nuxt-auth-utils package declares no range in its module.json or on npm. A module that declares nothing is not a module that fails; it is one you check by hand, in its changelog and its issues.
A range that leaves your target out is the one to act on first, because Nuxt disables a module whose compatibility range does not match the running version. That shows up as missing features and a console warning, not as a failed build.
The Nuxt 4 changes most likely to bite
The guide labels each change with an impact level, and the checklist keeps that order. Most of the data fetching changes sit near the bottom of it, yet they fail quietly at runtime rather than in the build, so check them first.
data and error from useAsyncData and useFetch now start as undefined rather than null:
- if (data.value === null) {
+ if (data.value === undefined) {
data is now a shallowRef, so mutating a nested property no longer updates the page. Replace the whole value, or opt back in where you need it:
const { data } = await useFetch('/api/todos', { deep: true })
Calls that share a key now share one data, error and status, so their options have to agree. The boolean dedupe values on refresh are gone as well:
- await refresh({ dedupe: true })
+ await refresh({ dedupe: 'cancel' })
The new app/ directory is the most visible change, but it is optional: Nuxt detects the old layout and keeps working with it.
Testing Nuxt 5 today
From Nuxt 4.2 you can switch most defaults to Nuxt 5 behaviour with one flag:
export default defineNuxtConfig({
future: {
compatibilityVersion: 5,
},
})
The flag covers changes such as case-sensitive routing, typed pages, the Vite Environment API and the Options API compiled out of the client bundle. It changes defaults, so an experimental option you set explicitly can hold on to today's behaviour; the checker flags each one that Nuxt 5 behaviour would change.
From Nuxt 4.6, server code can import its handler and helpers from nuxt/server, so the same file runs on Nitro v2 today and Nitro v3 under Nuxt 5:
import { defineEventHandler, getQuery } from 'nuxt/server'
export default defineEventHandler((event) => {
const { name } = getQuery<{ name?: string }>(event)
return { message: `Hello, ${name ?? 'world'}!` }
})
The Nuxt 5 upgrade guide on nuxt.com is still being written as the work lands, so treat the preview checklist as a moving target.
When starting fresh beats migrating
Migrating keeps your history and is usually the right call. Starting again from a Nuxt 4 base makes more sense when the app is small, when several of its modules declare nothing or leave Nuxt 4 out, or when you were going to replace its auth, payments or deployment anyway. Either way, sort out the modules first: one that blocks Nuxt 4 blocks both paths.
03Rates
The numbers it uses
| Milestone | When | Source |
|---|---|---|
| Nuxt 3 end of life | nuxt.com | |
| Nuxt 4 released | nuxt.com | |
| Nuxt 5 release | Q4 2026, estimated | nuxt.com |
| Nuxt 4 end of life | 6 months after Nuxt 5 ships | nuxt.com |
| compatibilityVersion: 5 available | Nuxt 4.2 | nuxt.com |
| nuxt/server imports available | Nuxt 4.6 | nuxt.com |
| Codemod version the guide pins | codemod@0.18.7 | nuxt.com |
04Questions
Questions
- When did Nuxt 3 reach end of life?
- On 31 July 2026. Since then it gets no bug fixes or security patches, and the roadmap on nuxt.com lists it as unsupported. Nuxt 4 is the active major, and the official upgrade guide covers the move.
- When is Nuxt 5 coming out?
- The roadmap on nuxt.com estimates the fourth quarter of 2026 and gives no firmer date. Nuxt 5 brings Nitro v3, and Nuxt 4 stays supported for at least six months after it ships. You can test much of its behaviour on Nuxt 4.2 or later today.
- How do I upgrade from Nuxt 3 to Nuxt 4?
- Check your modules first, then install nuxt@^4.0.0, run the codemod recipe and work through the changes in the upgrade guide. Nuxt disables a module whose compatibility range leaves out the running version and only warns in the console, so a blocked module shows up as missing features rather than a failed build.
- How do I know if a Nuxt module supports Nuxt 4?
- Read what it declares. Modules built with Nuxt's module builder ship a dist/module.json whose compatibility.nuxt is the range Nuxt checks when it loads them, and some state a nuxt peer dependency on npm instead. A range that names 4, such as ^4.0.0 or >=4.1.0, is a stronger claim than an open one like >=3.0.0. Either way it is the author's claim, so the module's changelog and issues are the real test.
- Can I test Nuxt 5 changes on Nuxt 4?
- Yes, from Nuxt 4.2. Set future.compatibilityVersion to 5 in nuxt.config and the defaults switch to Nuxt 5 behaviour, such as case-sensitive routing, typed pages and the Vite Environment API. The move to Nitro v3 is not part of the flag. From Nuxt 4.6 you can also import server handlers from nuxt/server, so the same files run on both.
- Is there a codemod for Nuxt 4?
- Yes. npx codemod@0.18.7 nuxt/4/migration-recipe runs every Nuxt 4 codemod in sequence, and the guide pins that version because of an issue in the codemod CLI. You can deselect any codemod as it runs, and each one is also listed beside its change in the guide.
05Sources
Sources
Every fact on this page was read from these pages on .
- Nuxt docs, Upgrade Guidenuxt.com/
docs/ 4.x/ getting-started/ upgrade - Nuxt docs, Roadmapnuxt.com/
docs/ 4.x/ community/ roadmap - Nuxt Kit docs, Modules (compatibility)nuxt.com/
docs/ 4.x/ api/ kit/ modules - Nuxt docs, Nuxt 5 Upgrade Guide (in development)nuxt.com/
docs/ 5.x/ getting-started/ upgrade - Nuxt module list APIapi.nuxt.com/
modules - jsDelivr, @nuxt/content module.jsoncdn.jsdelivr.net/
npm/ @nuxt/ content@latest/ dist/ module.json - npm registry, @sentry/nuxt latest manifestregistry.npmjs.org/
@sentry/ nuxt/ latest
Found something out of date? Tell us.
Nuxter
Building a SaaS on Nuxt?
Nuxter is built on Nuxt 4, so a project that starts from it begins on the far side of this migration, with sign-in, payments, email and background jobs already working on Cloudflare Workers.