Core Web Vitals has become a checklist exercise. Lazy-load images, preload fonts, move scripts to the bottom. These tick boxes. They don’t move the needle in production.
What actually moves LCP
The LCP element is almost always above the fold. Lazy-loading everything else optimises a number that was never the bottleneck. What actually moves LCP:
- Serving the hero image from the same origin as the HTML (no CDN hop)
- Pre-rendering on the edge, not at the origin
- Inlining critical CSS so the first paint doesn’t wait for a stylesheet round-trip
The CLS trap
Modern sites don’t have layout shift from images anymore — framework defaults cover that. The remaining CLS usually comes from web fonts, cookie banners, and third-party widgets loaded async. Each of those is a design decision, not an engineering one.