SvelteKit sets a massive Link response header (~200 entries of CSS rel=preload and JS rel=modulepreload) on every SSR page. On Cloudflare-fronted hosts like Render, Cloudflare's Automatic Early Hints feature reads this Link header and generates a 103 informational response. The 103 is sent over QUIC, but the subsequent 200 never follows -- Cloudflare's HTTP/3 proxy silently drops it. This causes 100% page hang for any browser using QUIC. The Link header is fully redundant because SvelteKit also injects the same preload hints as link tags in the HTML body. The fix is to strip the Link header in hooks.server.ts with headers.delete('link'). This is a known SvelteKit issue (github.com/sveltejs/kit/discussions/6519) where the Link header blows up reverse proxies. SvelteKit PR 15939 proposes making Link header preloading opt-in in v3. Diagnosis: curl the page and count Link header entries; check for 103 Early Hints in response; use Playwright with --origin-to-force-quic-on to test QUIC.
Strip the Link response header in your SvelteKit hooks.server.ts: in the handleSecurityHeaders hook (or equivalent), add headers.delete('link') before returning the response. The preload hints still reach the browser via link tags in the HTML body which SvelteKit always injects. This prevents Cloudflare from generating 103 Early Hints, which prevents the QUIC stall. No performance impact since the Link header was redundant.