Bonjour webperf folks! A packed feed again this week:
* Tools & Data
Max Ostapenko published a public MCP server for the HTTP Archive Tech Report at https://lnkd.in/dTzRZNcy with no API key needed. You can now query CWV distributions, adoption, page weight breakdowns by tech, geo and rank in plain language. His own examples are worth the read: Next.js scores 15 points below React on mobile CWV, Nuxt 11 below Vue, Astro grew +371% in 25 months, SvelteKit ships the least median JS.
👉 [EN] https://lnkd.in/dzR3YfN6
* Web Platform & APIs
Cloudflare will ship Compression Dictionary Transport in beta on April 30. On two near-identical JS bundles simulating two deployments, they go from 272 kB uncompressed to 92.1 kB in gzip to 2.6 kB in dcz, down 97% on the wire!
👉 [EN] https://lnkd.in/d_wRHc8a
Scott Jehl published part 2 of the series on native HTML video and audio lazy loading, the practical guide. Syntax is <video loading="lazy" src="..." controls>, always set width/height to avoid CLS, and the loading="lazy" autoplay playsinline muted combo is the killer feature: browsers only start autoplay when the video enters the viewport. Behind a flag in Chrome 147, default in Chrome 148 (May 5). The JS pattern of generating <video> on scroll can finally retire 👐.
👉 [EN] https://lnkd.in/dw4dEWsp
* Practical reads
Amanda Vilela publishes a short, actionable INP checklist sorted by level of effort: keep the DOM under ~1500 nodes, use content-visibility: auto with contain-intrinsic-size, animate only transform and opacity, avoid layout thrashing, debounce vs throttle the right events, audit third-party scripts.
👉 [EN] https://lnkd.in/d_4fnf6a
Harry Roberts documents a subtle gotcha: once you declare a font-family on an element, the declaration stands on its own. If the single value fails to load, the browser falls back to its default (Times), not to an inheritable font-family up the tree. His tip: always write a complete font-family stack at every declaration. Small rule, big impact on FOUT/FOIT perception.
👉 [EN] https://lnkd.in/d3Zh8bgq
Zach Leatherman rebuilds the same image comparison component several times across web history at State of the Browser 2026. His framing concept: the "interactive dead zone", the gap between when a component is first visible and when it's actually usable. SPAs close it by frontloading everything. SSR widens it by shipping HTML that looks interactive but isn't yet. His proposal: Web Components plus progressive enhancement, using :defined / :not(:defined) to style a usable fallback until the JS registers.
👉 [EN] https://lnkd.in/d5uJHAfa
Have a great week!
The problem isn’t useEffect… it’s how we use it. For a long time, it was the “go-to” solution for data fetching in React. And yes, it works. But scaling that pattern in real-world apps often leads to repetitive, hard-to-maintain, and error-prone code. That’s where tools like React Query change the game. One important thing to highlight: React Query doesn’t just simplify your code — it shifts your mindset around server state. Instead of thinking: “When do I fetch the data?” You start thinking: “How do I keep my data in sync?” And that unlocks key benefits: Less imperative logic, more declarative thinking Better user experience (fewer unnecessary loading states) Smarter real-time data handling That said, it’s not a silver bullet: For small apps or very simple cases, useEffect is still perfectly valid. The real skill as a developer isn’t replacing tools… It’s knowing when to use each one.