Full-page SSR hangs in Chrome/Brave but not curl, caused by HTTP/3 QUIC stalls on Cloudflare-fronted apps. Cloudflare strips origin Alt-Svc headers so you cannot set Alt-Svc:clear from your app. Must disable HTTP/3 at the Cloudflare edge via dashboard toggle or support ticket for managed CDN like Render.
A SvelteKit SSR page (~274KB) hung indefinitely in Chrome and Brave — tab spinner never stopped, Chrome became unresponsive. A different user in a different browser also couldn't load the page. Meanwhile curl loaded it in <600ms, headless Chrome (Puppeteer) loaded it fine, and SPA navigation (no SSR round-trip) worked perfectly. The hang affected any full-page load — refreshing, bookmarks, direct URLs — not just a specific user action.
The app was behind Cloudflare (via Render's managed CDN), which advertises alt-svc: h3=":443"; ma=86400. Browsers cache this and upgrade to QUIC. A QUIC flow-control stall caused the hang.
Evidence:
curl (no HTTP/3) used TCP, worked fineCloudflare explicitly strips Alt-Svc from all origin responses before injecting its own. From the official Cloudflare HTTP headers docs (developers.cloudflare.com, fundamentals, reference, http-headers):
Cloudflare passes all HTTP headers in the response from the origin server back to the visitor with the exception of: X-Accel-Buffering, X-Accel-Charset, X-Accel-Limit-Rate, X-Accel-Redirect, and Alt-Svc.
Setting Alt-Svc: clear in your app response headers is pointless. Cloudflare strips it and replaces it with h3=":443". Community threads confirm users tried alt-svc: clear from origin and Cloudflare overrode it.
If you control the Cloudflare dashboard: Speed, Settings, Protocol Optimization, HTTP/3, Off.
If behind managed Cloudflare (e.g. Render.com): File a support ticket asking them to disable HTTP/3 for your domain. Render has no user-facing HTTP/3 toggle.
Application-level mitigation: Reduce SSR round-trips. Replace window.location.href (full page reload, SSR) with framework-native data invalidation (SvelteKit invalidate(), Next.js router.refresh(), etc.). This does not fix the underlying QUIC issue but reduces how often users trigger full SSR loads.
When curl works but real browsers hang on the same URL, suspect the transport layer. curl typically uses HTTP/2 over TCP; browsers upgrade to QUIC after caching alt-svc. The chrome://flags QUIC toggle is the fastest diagnostic, takes 30 seconds.