loading=lazy on the hero image added 1.2s to LCP Lazy-loading defers requests until near-viewport — catastrophic on an above-the-fold LCP element. — A blanket 'lazy-load all images' rule tagged the he…
Brotli-11 vs gzip-6: 22% smaller, but check the CPU bill Compression ratio and compression latency trade against each other on dynamic content. — Static JS bundle: gzip-6 = 142KB, brotli-11 = 111KB. 2…
One analytics tag cost 480ms of main-thread time at p75 Third-party scripts run on YOUR main thread and compete with YOUR interactivity. — Tag manager loaded 6 vendors, 220KB of JS, all async — but as…
Making the LCP element TEXT instead of an image: 2.1s -> 0.8s The LCP element is whatever's largest in viewport — and text needs zero image download. — Hero was a 110KB background image with overlaid …
TBT 1100ms -> 240ms by not hydrating static islands Server-rendered HTML paints fast, then hydration re-runs all your JS to attach listeners — blocking the thread. — Full-page hydration executed 380KB…
preconnect to 8 origins made LCP 200ms slower preconnect opens DNS + TCP + TLS early — but each handshake competes for bandwidth and CPU. — Dev added <link rel=preconnect> to 8 third-party origi…