What's Coming in Nuxt 5 Features, Improvements, and Developer Impact
Nuxt 5
Update
Nitro 3
Integration
SEO & Accessibility
Improvements
Intro
Nuxt is preparing for its next major iteration with a strategic two-release approach: Nuxt 4 (already released in July 2025) followed by Nuxt 5 (expected Q4 2025).
This staged rollout represents a fundamental shift in how the Nuxt team approaches framework evolution, prioritizing ecosystem stability while delivering cutting-edge features.
What's Coming in Nuxt 5
Article updated in August 2026. I originally published this article in autumn 2025, when Nuxt 5 was expected in Q4 2025. That date moved — by roughly a year. Rather than leave a stale prediction piece online, I have rewritten it against the current state of the ecosystem. Where the original was wrong, I say so explicitly at the end, because I would rather be corrected in public than quietly edited.
Nuxt 5 is the release that swaps out the engine. The headline change is the upgrade to Nitro 3 and H3 v2 — a move from Nitro's own abstractions to web standard Request, Response, Headers and URL primitives, with Rolldown-powered builds and the Vite Environment API underneath. That is a big enough change to justify its own major version, which is exactly the reasoning behind the two-release split. What has changed since I first wrote about this is the timing, and the fact that a surprising amount of the work has landed in 4.x minors instead.
Why Nuxt 4 and Nuxt 5?
The Nuxt core team deliberately split one large release into two stages: Nuxt 4 (released July 2025) as a stability-focused release containing everything that had been available behind compatibilityVersion: 4, and Nuxt 5 carrying the Nitro 3 upgrade and the remaining infrastructure changes.
A video created by Daniel Lichter that explains why Nuxt is releasing two major versions Nuxt 4 and short after that Nuxt 5
The stated goal was to separate breaking changes into phases that the ecosystem could actually test. In hindsight, I think this was the right call executed on a longer timeline than anyone announced — which is a fairly normal outcome for a rewrite of a server engine that also has to keep TanStack Start, Vercel Workflows and a few thousand production apps working. If you're stil on Nuxt 3, be aware it has reached it's end-of-life in 31 July 2026. No more bug fixes, no more security patches - updating to Nuxt 4 is the only one that should be on your sprint board this week! Here is a video guide by Alexander Lichter on migrating Nuxt 3 to Nuxt 4.
Nitro 3: The Engine Powering Nuxt 5
Nitro has been Nuxt's server engine since version 3, providing universal rendering capabilities, API routes, and deployment flexibility across multiple platforms. Nitro 3 isn't just an iteration—it's a fundamental rewrite, and it changes what Nitro is: the project now describes itself as a way to ship full-stack Vite apps, with Nitro acting as a Vite plugin rather than a separate build pipeline bolted on beside one. Underneath, it moves to H3 v2 and a Rolldown-based build.
Pooya Parsa, the creator of Nitro and h3, presented a significant breakthrough for full-stack development with Vite at ViteConf 2025: the ability to create complete full-stack applications with just one Nitro plugin.
One caveat before we go further: Nitro 3 is still in beta at the time of writing, and its migration guide is explicitly a living document. Nuxt 5 ships once Nitro 3 stabilises, which is also why the Nuxt 5 date has moved (more on that below). Everything here is worth reading as "how it currently works", not "how it will ship".
Cron Jobs Support: The Tasks API
The Tasks API lets you run background work without Redis or a separate job queue. You define tasks in server/tasks/ with defineTask(), then trigger them manually via API endpoints, programmatically with runTask(), or on a cron schedule in your Nitro config. In development, a CLI and a /_nitro/tasks endpoint let you list and run them directly.
Two things to know before you build on it. Tasks are still behind an experimental flag, so you have to opt in. And scheduling isn't as platform-agnostic as it sounds: Node, Bun, and Deno presets use the croner engine, Cloudflare maps onto native Cron Triggers, and Vercel onto Vercel Cron Jobs — with the wrangler and vercel.json config generated for you at build time. Other targets, Netlify included, aren't supported yet. The task definition is portable; the trigger isn't.
WebSocket Support via CrossWS
Nitro 3 integrates crossws — no relation to WebAssembly, which is a mistake I made in the first version of this article — for a unified WebSocket API across runtimes. You enable it with a feature flag and write handlers that follow normal file-based routing, with lifecycle hooks for upgrade, open, message, close, and error.
The nicer parts are the ones that usually cost you a library: pub/sub is built into the peer object, and each connection belongs to a namespace derived from the request path. A rooms/[room] route therefore gives you isolated broadcast groups for free. And if you only need server-to-client streaming, Server-Sent Events are also supported and considerably simpler to deploy.
The usual caveat still applies. Edge platforms differ in connection limits and idle timeouts, and WebSocket proxying as a route rule hasn't landed yet — verify your target before designing around it.
Featuring the Agentic Era
There's also a direction worth watching. Announcing the v3 beta in March 2026, Pooya Parsa listed "a better experience for both humans and agents" among the rewrite's goals.
This talk explores building a production-grade Vue SPA using Vite + Rolldown for modern bundling, Nitro as a lightweight server layer, and AI agents as first-class system components. We’ll cover project structure, toolchain setup, and performance tuning (HMR, cold starts, bundle output), then dive into integrating agents: defining tool interfaces, managing agent state with Pinia, streaming results into Vue components, and executing actions securely via Nitro APIs. You’ll leave with concrete patterns for wiring frontend and server together, deploying to edge/serverless, and designing applications where AI is part of the architecture—not an afterthought.
His talk paired Nitro and Rolldown/Vite with AI agents treated as first-class system components rather than an add-on. Nothing has shipped under that heading yet, so treat it as a signal about where the server layer is heading, not as a feature you can plan around.
Breaking Changes
nitropack is now nitro. Plugins, config helpers, and runtime utilities move with it: defineNitroPlugin becomes definePlugin, and utilities live under subpaths like nitro/cache and nitro/h3. Types come only from nitro/types.
Node.js 20 is the minimum, since Node 18 reached end-of-life in April 2025. Nuxt 5 itself goes further and expects Node 22.19+, because it no longer bundles jiti.
H3 v2 is the real migration cost. It's rewritten on web standards, so readBody(event) becomes event.req.json(), header helpers become the standard Headers API, createError becomes HTTPError, and defineEventHandler becomes defineHandler. Your existing server/api routes will need attention.
SWR is enabled by default for cached functions — the opposite of what earlier alphas did, and of what this article previously claimed. Set swr: false if you want callers to wait for a fresh value. The utilities are also renamed to defineCachedHandler and defineCachedFunction.
Nitro's bundled app config is removed, along with useAppConfig() on the server. Use a plain file in your server directory instead. This is Nitro's app config, not Nuxt's app/app.config.ts.
Presets were renamed and pruned: node becomes node_middleware, the Cloudflare variants collapse into cloudflare_module, vercel-edge becomes vercel with Fluid compute, and edgio is discontinued. Cloudflare bindings also moved to event.req.runtime.cloudflare.
Plan a staging pass, not a dependency bump. The upside is that most of this makes behaviour more explicit, and the move to web standards means the knowledge transfers to any framework built on Request and Response.
Performance and Rendering Pipeline Optimizations
The performance story has shifted since this article was first written: most of it is already shipping in the 4.x line rather than waiting for Nuxt 5.
SSR and Streaming Improvements
Server-side rendering in Nuxt is powered by Nitro, which generates HTML on the server before sending it to the browser. This improves Time to First Byte (TTFB), First Contentful Paint (FCP), and SEO by delivering fully rendered pages. What's changed:
SSR streaming has landed — experimentally, in Nuxt 4.5, behind experimental.ssrStreaming. Rather than buffering the whole page, Nuxt flushes the HTML shell (head, styles, preload hints, entry scripts) immediately and streams the body as Vue renders it. Streaming is disabled automatically for bots and crawlers, so search engines still get fully rendered HTML, and you can opt individual routes out via route rules.
There's a real caveat, and it's worth knowing before you enable it. Because streaming commits the status code and headers with the first byte, anything that mutates the response after rendering starts — a setResponseStatus() in a component, a cookie write in middleware — can't reach the client. Nuxt falls back to buffered rendering for routes with redirect, cache, isr, swr, or ssr: false rules, and warns in development about dropped mutations. Test it against your own response logic before shipping it broadly.
Build-layer speedups came from upstream. Nuxt 4.5 moved to Vite 8 with Rolldown-powered internals, and Rspack users got Rspack 2 on an Rsbuild pipeline. Alongside that: the island-renderer chunk is now skipped entirely if you use no islands, plugin handling is tree-shaken out of production builds, and a shared file watcher (Vite's, instead of a second one) becomes the default under compatibilityVersion: 5.
Cache control through route rules is unchanged and still the right tool — SWR, ISR, and static prerendering configured per route. Just note that cached and SWR routes bypass streaming by design.
Observability is new. Nuxt now emits diagnostics-channel traces for render, island, data, and plugin subsystems, which you can build OpenTelemetry on top of. Nuxt 5 adds Nitro-level channels to that set.
Data Fetching Strategies
An important correction to the original framing: these are not Nuxt 5 features. useAsyncData and useFetch were reworked in Nuxt 4, and you have them today:
Reactive key support — computed refs, plain refs, or getter functions as keys, with automatic refetching when they change.
Granular cache control via getCachedData, which now receives a context object telling you whether the request came from initial load, a manual refresh, or a watcher.
Singleton data fetching — all calls sharing a key share the same data, error, and status refs. Nuxt also drops the data when the last consuming component unmounts, which keeps memory from growing indefinitely.
A reactive enabled option, added in 4.5, which blocks every execution while false and cancels an in-flight request without clearing existing data. This is the clean answer to dependent and conditional queries.
What Nuxt 5 changes here is smaller and mostly about defaults: clearNuxtState resets state to its initial value instead of undefined, matching how clearNuxtData already behaves.
Built-in Accessibility (a11y) Module
The a11y module is no longer a roadmap item — @nuxt/a11y is out as a public alpha, with support for Nuxt 4.x and 5.x. It also turned out to be a different tool than this article originally predicted, so it's worth describing what actually shipped.
What the A11y Module Does
It isn't a linter. @nuxt/a11y is built on axe-core and lives in Nuxt DevTools:
Automatic scans on navigation. The module audits each page as you move through the app, checking against WCAG 2.0, 2.1, 2.2 and general best practices, then groups violations by impact level and tracks them per route.
A DevTools tab with element highlighting. Click a violation to pin and highlight the affected elements on the page with numbered badges that follow them as you scroll. Each finding comes with CSS selectors, a failure summary, and remediation guidance.
Build-time reports. During nuxt generate or prerendering, the module can write an accessibility report and — this is the useful part — exit with code 1 when violations are found. That makes it a CI gate, not just a dev-time nicety.
It runs in development only by default, so there's no production impact. You can also narrow the axe ruleset (to wcag2a and wcag2aa, for instance) if the full set is noisier than your team can act on.
Current Ecosystem Solutions
The module doesn't replace static analysis — it catches what renders, not what you wrote. eslint-plugin-vuejs-accessibility covers the other half and integrates with Nuxt's flat config:
Run both: ESLint in the editor and pre-commit, @nuxt/a11y in DevTools and CI. If you've moved to oxlint, this is one of the few places where it can't replace ESLint yet. oxlint parses the <script> blocks of an SFC but not the template, and the Oxc team has been explicit that this isn't a small gap: eslint-plugin-vue depends on its own compiler and a modified AST, and Vue templates don't expose the JavaScript bindings Oxc's rules need. Since every meaningful a11y rule is a markup rule, oxlint's accessibility coverage in Vue is currently zero. Its jsx-a11y rules apply to JSX only.
Why Accessibility Matters
Many regions require accessible websites by law — the ADA in the US, EN 301 549 and the European Accessibility Act in the EU. Beyond compliance, keyboard navigation, sufficient colour contrast, and clear focus indicators improve usability for everyone, and search engines favour the same well-structured semantic HTML that accessibility work produces.
That said, keep expectations calibrated. Automated checks catch roughly 30–40% of accessibility issues, and axe-core is no exception — it's excellent at what it can detect and blind to everything that requires judgement. Real accessibility still needs manual testing with screen readers, keyboard-only navigation, and input from users with disabilities. The module will be a helpful starting point, but not a complete solution - learn more about the European Accessibility Act, Modern Testing Tools, and Strategic Implementation within this article.
Preparing for Nuxt 5
1.
Get onto Nuxt 4 — this is no longer optional. Nuxt 3 reached end-of-life on 31 July 2026 and receives no further bug fixes or security patches. If you're still on 3.x, that's the migration to schedule first, and the upgrade guide plus the nuxt/4/migration-recipe codemods cover most of it.
2.
Turn on future.compatibilityVersion: 5 and see what breaks. This is the single most useful thing you can do, and it replaces the old advice about watching nightly builds. From Nuxt 4.2 onwards it flips a growing set of defaults to v5 behaviour — case-sensitive routing, normalised page component names, typed pages, the Vite Environment API, the Options API compiled out of the client bundle, clearNuxtState resetting to defaults — each individually revertable while you work through them.
3.
Check your Node version, and check it in CI. Not 18. Nitro 3 requires Node 20 as a floor, and Nuxt 5 goes further to 22.19+, because it no longer bundles jiti and relies on Node's native type stripping to load nuxt.config.ts. Update local environments, CI images, and whatever runtime your host is pinned to.
4.
Audit server/ against H3 v2, not just "Nitro usage". This is where the actual work is. Body helpers give way to native Request methods, header helpers to the standard Headers API, createError to HTTPError, defineEventHandler to defineHandler. While you're there, check whether you rely on Nitro's useAppConfig() (removed), on a renamed deployment preset, or on event.context.cloudflare (moved).
5.
Type-check now, on the new setup. Nuxt 4 already splits tsconfig per context — app, server, shared, node — so adopt project references and vue-tsc -b before v5 rather than during it. Nuxt 5 then adds noUncheckedSideEffectImports, enables typed pages by default, and drops baseUrl, all of which surface errors at type-check time rather than runtime.
One extra step if you publish a layer or a module: ship compiled JavaScript. Node refuses to strip types inside node_modules, so a TypeScript entrypoint can't be loaded natively however new the runtime is, and every consumer would have to install jiti to work around it.
Plan the timeline, but don't rush it. Nuxt 5 is currently estimated for Q4 2026 and ships once Nitro 3 stabilises, and Nuxt 4 is supported for at least six months after that — you are not on a deadline. There are no v5 codemods yet; the team has said its focus after 4.5 is stabilising v5 and building compatibility utilities. Incremental beats big-bang here: compatibilityVersion: 5 in a branch, one category of breakage at a time, with the H3 v2 migration budgeted as its own piece of work rather than folded into "the upgrade".
Conclusion: Embracing Nuxt's Future
Nuxt 5 represents a maturation of the framework, moving from "flexible and permissive" toward "structured and safe." Web-standard request handling, Rolldown-powered builds, and defaults that favour explicitness signal a framework ready for large-scale applications while retaining the developer experience that made Nuxt popular.
Daniel Roe details the journey and architectural decisions behind Vite's integration into Nuxt, while offering a glimpse of v4.2 featuring the Vite Environment API for faster builds and a Rust-powered CLI designed to significantly accelerate development speed.
The two-release approach has held up, if not to its original schedule. Nuxt 5 slipped from Q4 2025 to an estimated Q4 2026 because it ships when Nitro 3 stabilises — and given that Nitro 3 turned out to be a rewrite down to the HTTP layer, that delay is the strategy working rather than failing. A "big bang" upgrade would have shipped on time and broken more.
Key takeaways:
Nitro 3 is the substance of this release. Native background jobs, cross-runtime WebSockets, and web-standard APIs, with dependencies down from 321 to under 20. The breaking changes are real, and H3 v2 is where you'll spend your migration budget.
The TypeScript story split across two versions. The client/server boundary — separate configs for app, server, shared, and build-time code — arrived in Nuxt 4. Nuxt 5 adds stricter defaults on top: typed pages, checked side-effect imports, no baseUrl.
Performance work is already shipping. SSR streaming, Vite 8, leaner production output, and diagnostics-channel tracing all landed in the 4.x line. You don't have to wait for v5 to benefit.
The a11y module exists and isn't what was announced.@nuxt/a11y is an axe-core scanner in DevTools with a CI report, not a linter. Useful, and no substitute for manual testing with screen readers and keyboards. The built-in SEO module remains a roadmap item.
Migration is incremental, but not yet automated.future.compatibilityVersion: 5 lets you adopt v5 behaviour one change at a time from Nuxt 4.2 onward. There are no v5 codemods yet — the team's stated focus after 4.5 is stabilising v5 and building compatibility utilities. In my experience a mid-size production app is a matter of weeks rather than days, driven mostly by how much custom server code you have.
The ecosystem is evolving quickly, but the core team has been consistent about backward compatibility and about telling people what's coming. Nuxt 5 isn't just an upgrade — it's an investment in the long-term viability of Vue for full-stack development.
A Senior Freelance Web Developer based in Cologne/Bonn region, and every now and then I enjoy writing articles like this one to share my thoughts ... : )