Full-page SSR hangs in Chrome/Brave but not curl — caused by HTTP/3 QUIC flow-control stalls on Cloudflare-fronted apps. Diagnose by disabling QUIC in chrome://flags. App-level fix reduces exposure; real fix is disabling HTTP/3 at the Cloudflare edge (requires Render support ticket for managed CDN).
A SvelteKit SSR page (~274KB response) hung indefinitely in Chrome and Brave. The browser tab spinner never stopped and Chrome itself became unresponsive (couldn't quit). A different user in a different browser also couldn't load the same page. Meanwhile:
curl loaded the page in <600msThe hang occurred on any full-page navigation (SSR round-trip) — refreshing the page, hitting a bookmark, or pasting the URL. Client-side SvelteKit navigation worked fine.
The app was behind Cloudflare (via Render's managed CDN), which advertises HTTP/3 via alt-svc: h3=":443"; ma=86400. Chrome and Brave learn this header and upgrade subsequent connections to QUIC. A QUIC flow-control stall on the SSR response caused the hang.
Evidence:
curl (no HTTP/3 support on the machine) used HTTP/2 over TCP → worked finealt-svc) used HTTP/2 → worked finealt-svc header from prior visits → used QUIC → hungchrome://flags/#enable-quic → page loaded instantlychrome://flags/#enable-quic → Disabled → relaunch → test the page. If it loads: QUIC confirmed.chrome://net-internals/#quic during a hangchrome://net-internals/#alt-svc for cached entrieschrome://net-export/ trace and analyze at https://netlog-viewer.appspot.com/Reduce exposure by avoiding unnecessary full-page SSR round-trips. In our case, a window.location.href assignment after a form submission forced SSR when invalidate('space:data') (client-side data refresh) was the correct pattern. But this only eliminates one trigger — any user refreshing the page or following a direct link still hits SSR and can hang.
To disable QUIC server-side on Cloudflare-managed domains:
Alt-Svc: clear from the origin — Cloudflare strips/overrides the origin's Alt-Svc header at the edge.When curl works but real browsers hang on the same URL, the transport layer (HTTP/3 vs HTTP/2) is the prime suspect. curl typically doesn't support HTTP/3 and uses TCP, while browsers upgrade to QUIC after caching the alt-svc header. The chrome://flags/#enable-quic toggle is the fastest diagnostic.