The State of Web Vitals
Real-user Core Web Vitals on mobile and desktop across 210,902 sites, paired with what we found in their HTML, CSS, and network traces.
70.8% of sites pass all three Core Web Vitals across all devices. INP (94.7% good) and CLS (87.8% good) pass on most sites. LCP is where sites still fail: 17.5% miss the 2.5 second threshold, and most of those misses start in the HTML or on the server before the page even renders.
What still slows sites down from 210,902 real sites
17.4% of image-LCP sites put loading="lazy" on their own LCP image
When you put loading="lazy" on the LCP image, the browser waits for layout before it requests the file. Median resource load delay is 240 ms with default loading vs 417 ms with loading="lazy". On WordPress, sites without loading="lazy" on the LCP image pass LCP on 74% of sites, compared with 69% on sites that lazy-load their LCP image.
27.4% of sites reference their LCP element in a stylesheet
The preload scanner only reads HTML. When the hero image is a CSS background-image, the browser has to download and parse the stylesheet before it knows the image URL exists. Sites with the LCP element in HTML pass LCP on 85% of sites (1.5s median). Sites that put it in CSS reach 78% (1.7s), and JavaScript-injected LCP elements reach 71% (1.9s).
34.9% of sites ship Speculation Rules, led by WordPress and Wix
65.1% of sites ship no speculation rules. Of the 34.9% that do, 89% use conservative (86% of which run WordPress) and 8% use eager (99% of which run Wix). Sites on eager pass LCP on 94% of sites, compared with 71% on conservative and 87% without rules.
Sites mixing font-display: swap with blocking rules pass LCP on 78% vs 87%
Across 15.0 million @font-face rules, 49.7% set font-display: swap while 39.6% leave it at auto (which blocks text rendering up to 3 seconds). Sites that keep every text font on swap or optional pass LCP on 87% of sites. Sites that mix swap with blocking rules on the same page pass LCP on 78% and CLS on 86%.
23.7% of sites serve HTML over HTTP/3
61.7% of sites serve their main HTML document over HTTP/2, and 14.6% still use HTTP/1.1. Sites on HTTP/3 record a 533 ms median Time to First Byte, compared with 716 ms on HTTP/2. 86% of HTTP/3 sites pass LCP, against 81% on HTTP/2.
scheduler.yield() sites record 33 ms median blocking time across 77 scripts
68.3% of sites call no main-thread yielding API and load a median of 20 scripts. Sites that use scheduler.yield() (4.9% of sites) load a median of 77 scripts and record 33 ms median Total Blocking Time. Sites using requestIdleCallback() (26.8%) sit at 91 ms median TBT.
Which CMS or framework passes Core Web Vitals? ranked by sites passing LCP, INP, and CLS together
Wix (90.2%) and Shopify (87.6%) lead the CMS standings. WordPress is the most common CMS in our crawl (65,509 sites), with 62.8% passing all three Core Web Vitals. On the framework side, htmx (79.8%) and Alpine (79.4%) top the table, while Vue (63.6%) and Remix (58.7%) sit at the bottom of the top 7.
All 84 metrics we measure pick a topic to see the numbers and what to set
- Bytes by resource type →
- Compression mix →
- Cookies per site →
- CSS coverage (used vs unused) →
- DOM depth →
- DOM size →
- Font format mix →
- Font source →
- font-display strategy →
- Fonts per page →
- Iframe dimensions set →
- Iframe loading →
- Iframes per page →
- Image dimensions set →
- Image fetchpriority →
- Image format mix →
- Image loading attribute →
- Image source mix →
- Images per page →
- Media per page →
- Media source →
- Page weight & requests →
- Preloaded fonts →
- Responsive image markup →
- Script coverage (used vs unused) →
- Script initiator →
- Script loading mix →
- Script origin (1P/3P) →
- Scripts per page →
- Stylesheet initiator →
- Stylesheet loading mix →
- Stylesheet origin (1P/3P) →
- Stylesheets per page →
- Third-party domains →
- Third-party share →
- Uses @import →
How we measure, and how to query the dataset CrUX field data + Chromium crawl
210,902 sites, real Chrome users + one cold Chromium load
Pass rates and p75 timings come from the Chrome UX Report (CrUX) rolling 28-day window. To find out why a site passes or fails, we crawl each homepage in headless Chromium and record 84 technical signals from the DOM, stylesheets, scripts, Long Animation Frames, and network waterfall.
Query the State of Core Web Vitals dataset from Claude or Cursor
The Explorer and our public MCP server read the same State of Core Web Vitals dataset. Add the URL below to Cursor, Claude Desktop, or any MCP client to run get_metrics, get_histogram, and list_options filtered by CMS, framework, or CDN.
https://www.corewebvitals.io/api/state-of-cwv/mcp {
"state-of-cwv": {
"type": "http",
"url": "https://www.corewebvitals.io/api/state-of-cwv/mcp"
}
}