WOFF2 vs TTF: how I measured 13 fonts
This is the material behind the article WOFF2 vs TTF: which file belongs on your site. I took 13 fonts from the macOS system font folder in September 2026 and converted each one to WOFF2 to see how much smaller it gets.
What I looked at
For every font I recorded the original file size, the size of a full WOFF2 made with fontTools, and the size of the same original compressed with plain Brotli at quality 11. The WOFF2 is a straight conversion: no subsetting, no hint removal and no pinned axes, so the only change is the format.
The plain Brotli file lets you split the compression gain from the format gain. Each record also notes the outline type (TrueType glyf or CFF), whether the font is static or variable, the glyph count and whether it had a DSIG table.
I then loaded Georgia as TTF and as its own WOFF2 in Chrome on macOS, drew two test strings on a canvas and compared the width and the pixels.
Every reduction uses the same formula: (baseline bytes − output bytes) / baseline bytes × 100, where the baseline is either the original or the plain Brotli file.
Results
| Font | Outlines | Original (B) | WOFF2 (B) | Reduction | WOFF2 vs Brotli |
|---|---|---|---|---|---|
| Arial Unicode | glyf | 23,278,008 | 11,357,648 | 51.2% | +12.1% |
| SF Pro (variable) | glyf | 8,333,964 | 2,757,524 | 66.9% | +0.8% |
| Georgia | glyf | 379,588 | 110,840 | 70.8% | +15.0% |
| Verdana | glyf | 186,188 | 78,648 | 57.8% | +13.2% |
| Times New Roman | glyf | 824,920 | 361,816 | 56.1% | +10.4% |
| Courier New | glyf | 684,624 | 310,384 | 54.7% | +11.7% |
| Noto Sans Lycian | glyf | 4,556 | 2,200 | 51.7% | +14.1% |
| Noto Sans Phoenician | glyf | 6,252 | 3,476 | 44.4% | +7.8% |
| Noto Sans Thaana | glyf | 18,792 | 8,200 | 56.4% | +9.8% |
| Noto Sans Javanese | CFF | 86,944 | 38,828 | 55.3% | −0.0% |
| Noto Sans Tifinagh | CFF | 24,956 | 13,304 | 46.7% | −0.7% |
| Noto Sans Canadian Aboriginal | CFF | 41,468 | 23,788 | 42.6% | +0.9% |
| Noto Sans Siddham | CFF | 94,408 | 50,092 | 46.9% | +0.9% |
A positive value in the last column means the WOFF2 is smaller than plain Brotli of the same original. Across all 13 fonts WOFF2 cut the file by 42.6–70.8%, with a median of 54.7%.
In the browser check Georgia drew identically in both formats: 429.805 px wide at 28 px and 328.633 px wide at 16 px, with 0 differing canvas pixels in both strings. The strings covered Polish diacritics, the euro sign, an en dash, an ellipsis, ligatures and kerning pairs.
One mistake I removed
My first run also included Athelas.ttc and showed a 94.5% reduction. A .ttc file is a collection of four faces, and the WOFF2 held only one of them, so I was comparing a 2.3 MB collection with a 127 KB single face. I dropped it from the set, because a collection has no single face to compare against. The article opens with this mistake for that reason.
What this data can't tell you
- These are file bytes. Loading time, LCP, CLS and energy use are outside this data.
- The Brotli comparison is offline, so it leaves out response headers, transfer timing and decode cost. Check your transferred bytes in DevTools.
- Subsetting and hint removal are separate steps, and I measured neither.
- The browser check is one browser on one platform, with two strings at two sizes. It covers part of a font's features, so run it on your own fonts too.
- I had one variable font, SF Pro, so its result is a single observation.
Files
file-size-results.json: every font with its sizes, outline type, glyph count and a shortened SHA-256 of the input filebrowser-check.json: the Georgia width and pixel comparisonmeasure.py: the script that makes the WOFF2 and Brotli files and writes the results
The font files themselves are licensed by their suppliers, so they aren't in the pack.
To run it again on a Mac, install fonttools[woff] (I used fontTools 4.65.0, Brotli 1.2.0 and Python 3.14; the browser check ran in Chrome 152) and run python3 measure.py. Another macOS release ships other font versions, so your byte counts will differ slightly.