Skip to content

Build1 publisher3 min readPublished

Nuxt 4.5's SSR streaming falls back to buffered rendering on six route rules

Nuxt 4.5's experimental ssrStreaming flag silently buffers any route that carries one of six rules, including cache, isr and swr. Before counting on faster pages, teams turning it on app-wide should map their route rules and any code that writes headers late.

The Engineer · Build desk

Drafted by a language model from the sources cited here and checked against its claim ledger before publication. How we use AISend a correction

What happened

  • The flag arrived in Nuxt 4.5.0 on July 18, 2026, as an explicitly experimental, opt-in setting.
  • Nuxt 3 reached end-of-life on July 31, 2026, and never got the feature; streaming exists only in 4.5.
  • Nuxt keeps crawlers off the streaming path automatically, and individual routes can opt out through routeRules.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint On any route with a cache, isr or swr rule, Nuxt 4.5 forces a choice between caching and streaming, because the two cannot run together on one route.
  • exposure Interceptors that write cookies or headers late worked under buffered rendering and become production crash paths once streaming is enabled.
  • decision A global flag turns into a route-by-route review, because the gains land only on routes free of the six rules and opt-outs are set per route.
  • cost Early adopters write config against option names that are still changing, so 4.5 streaming settings may need edits before the flag stabilises.

Two settings in one config file show the problem. A dev.to walkthrough of the release sets `experimental: { ssrStreaming: true }` and, under `routeRules`, `'/pricing': { cache: { maxAge: 60 } }` [13]. The pricing route shows zero change in Time to First Byte because Nuxt buffers it [13]. According to the author, the route rule's own documentation does not mention this, even though that is where a developer would look first [6].

The walkthrough states the design in two sentences: "SSR streaming doesn't change what Nuxt renders. It changes when the response is allowed to be final." [15] Buffered SSR renders the whole page to a string in memory. Only then does it settle the status code, headers and cookies, and it sends everything in one response [7]. Streaming renders the shell first: the root layout, the `<head>`, and anything above the first async boundary [8]. As soon as the shell is ready, Nuxt commits the status and headers, flushes them to the socket, and keeps writing the body to the open connection as components finish [8].

The author calls the six-rule fallback a consequence of that design [14]. A redirect is the easiest case to see. A redirect is a status code, and streaming commits the status the moment the shell is ready [8]. Sending redirect, cache, isr, swr, noScripts and `ssr: false` routes through the buffered renderer keeps them working as they did before 4.5 [5].

The crash has the same cause. A request interceptor that sets a cookie is ordinary code. Under streaming it can run after the headers have already gone out, and the result is ERR_HTTP_HEADERS_SENT in production [9]. Streaming does not let you "change your mind about the response after you've already sent the start of it," the author wrote [9].

"Nothing here is a Nuxt bug," the walkthrough says [12]. I agree. Committing headers early is the whole benefit of the feature, and buffering the routes that cannot tolerate early commits is a sensible default. My objection is that the fallback is silent [5].

Treat the speed figure with care. The walkthrough opens with a scenario in which homepage TTFB falls from 1.8 seconds to 40 milliseconds, a 45-fold drop [10][1]. It is an illustration, not a measurement of a production app. For a number like that to transfer, a page needs a shell that renders quickly, slow data below an async boundary, and none of the six rules [8][5]. A cached page will show no change [13].

Nuxt 4.5.0 shipped the flag on July 18, 2026, and the walkthrough was checked against 4.5.2, the current `latest` on npm [1][2]. Nuxt 3 reached end-of-life 13 days after that release and never got the feature [3][2]. The surrounding options, `botRegex` among them, are still being renamed [4]. The experimental label is accurate.

In my context, adoption would go in this order:

1. List every route carrying one of the six rules. Those routes will not get faster [5]. 2. Find every request interceptor or other code that writes a header or cookie, and confirm it runs before the shell flushes [8][9]. 3. Enable the flag, then use `routeRules` to opt out any route that still writes late. Crawlers are kept off the streaming path automatically [11].

What to watch

  • Whether Nuxt documents the six-rule fallback on the route rule pages or logs a warning when a rule disables streaming.
  • Whether a later 4.x release lets cache, isr or swr rules coexist with streaming on the same route.
  • Renames of botRegex and the other streaming options before the flag leaves experimental status.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories