Font format mix

Font formats in use: woff2, woff, ttf and friends.

Field data PhoneDesktopAll Scope All sites Q2 2026 edition · All devices field outcomes
Metric LCP INP CLS
1

At a glance the headline numbers for Font format mix

Font formats in use: woff2, woff, ttf and friends.

5
Categories
In the distribution
82.4%
Fleet share
Top: woff2
Sites with any
Of woff2

82.4% of font files are WOFF2.

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
2

The font format mix mix who uses what, and how stable each group is

VariantShare of requestsMedian
Woff2
82%
Woff
9%
Ttf
7%
Otf
1%
Other
0%

Font format mix. On the fleet: 82.4% woff2, 9.5% woff, 6.9% ttf.

Woff2 leads by count (82.4%) and by bytes (74.0%). computed

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
3

Passing CLS per bucket every category and count level at once - color is the pass rate

1
2
3
4
5
6
7
8
9
10
11
Woff2 82.4%
88
89
88
88
88
87
87
87
84
85
84
Woff 9.5%
86
85
85
85
85
Ttf 6.9%
85
86
85
83
83
83
Otf 0.8%
82
82
81
86
84
Other 0.4%
87
79
78
78
86
← few of this category on the pagemany →
60%95%+ of sites passing CLS Faded cells: under 100 sites

Each row is a category, each column its own count bucket (few on the left, many on the right); the cell is the share of those sites passing CLS.

No category moves the CLS pass rate much, however many a site ships. computed

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
4

Few vs many - does quantity cost CLS? the pass rate with few vs many of each category

60%70%80%90%100% few → many
Woff2 82.4% 88%84%
Ttf 6.9% 85%83%
Woff 9.5% 86%85%
Other 0.4% 87%86%
Otf 0.8% 82%84%
% of sites passing CLS · hollow ring = pages with few, solid dot = pages with many

Per category: the pass rate among pages with FEW of it (hollow ring) against pages with MANY (solid dot), worst trend first. Thin buckets are excluded from the endpoints.

More Woff2 costs the most: the CLS pass rate falls from 88% with few to 84% with many. computed

The State of Web Vitals · Q2 2026 · 189,915 sites · all devices field datacorewebvitals.io/state-of-cwv
5

Why this matters for the Core Web Vitals, and where to start fixing it

woff2 is the only font format a modern site needs. It compresses tighter than woff and far tighter than ttf or otf, and every current browser supports it. Anything else in the mix is either a legacy fallback nobody downloads or bytes wasted on the wire.

Font bytes sit on the render path. Text either waits for them or reflows when they arrive, so smaller font files shorten that window whatever your font-display strategy is.

Related signals Uses @import → font-display strategy → Images per page → Cookies per site → Chrome field data from 189,915 sites, representing millions of real page loads · How we measured
Live queries (2) — admin only
Query #1: 36.6 ms
SELECT 1 AS ok FROM site_metric_bags LIMIT 0;
Query #2: 278.5 ms
WITH flat AS (
                SELECT b.cat, b.n, b.size, s.crux."all".cls AS cwv_val
                FROM site_metric_bags b
                JOIN sites s ON s.origin = b.origin
                WHERE b.path = 'fonts.format'
                  AND b.cat IS NOT NULL
            ),
            totals AS (
                SELECT cat,
                    SUM(n) AS fleet_n,
                    SUM(size) AS fleet_size,
                    COUNT(*) FILTER (WHERE n IS NOT NULL) AS sample,
                    COUNT(*) FILTER (WHERE n > 0) AS with_any,
                    quantile_disc(n, 0.95) AS p95,
                    COUNT(*) AS n_rows
                FROM flat
                GROUP BY cat
                HAVING COUNT(*) >= (SELECT COUNT(DISTINCT origin) FROM site_metric_bags WHERE path = 'fonts.format') * 0.005
            ),
            widths AS (
                SELECT *,
                    GREATEST(1, CAST(round(COALESCE(p95, 0)) AS INTEGER)) AS cap,
                    LEAST(GREATEST(1, CAST(round(COALESCE(p95, 0)) AS INTEGER)), 12 - 1) AS regular_buckets
                FROM totals
            ),
            widths2 AS (
                SELECT *,
                    GREATEST(1, CAST(ceil(cap * 1.0 / regular_buckets) AS INTEGER)) AS width
                FROM widths
            ),
            binned AS (
                SELECT f.cat, f.cwv_val, w.fleet_n, w.fleet_size, w.sample, w.with_any, w.width, w.regular_buckets,
                    CASE WHEN f.n IS NULL THEN NULL
                        ELSE LEAST(CAST(FLOOR(f.n * 1.0 / w.width) AS INTEGER), w.regular_buckets)
                    END AS bucket_idx
                FROM flat f
                JOIN widths2 w ON f.cat = w.cat
            )
            SELECT cat, fleet_n, fleet_size, sample, with_any, width, regular_buckets,
                bucket_idx,
                COUNT(*) AS n,
                quantile_disc(cwv_val, 0.5) AS median,
                COUNT(*) FILTER (WHERE cwv_val IS NOT NULL) AS total_cwv,
                COUNT(*) FILTER (WHERE cwv_val IS NOT NULL AND cwv_val <= 0.1) AS good
            FROM binned
            WHERE bucket_idx IS NOT NULL
            GROUP BY cat, fleet_n, fleet_size, sample, with_any, width, regular_buckets, bucket_idx
            ORDER BY cat, bucket_idx;
JSON file lookups (4)
20260625/meta.json 0.03 ms
20260625/types.json 0.69 ms
20260625/loaf-scripts.json 0.39 ms
20260625/menu.json 0.18 ms