Font Converter

Why WOFF2 Was Created: Brotli Compression and Web Font Performance

WOFF 1.0 used zlib compression and was a major step forward for web fonts, but Google's engineers saw an opportunity to go further. By combining a font-specific preprocessing step with Brotli compression, they achieved roughly 30% better file size reduction — a meaningful win for millions of web users on slow connections.

TL;DR - Key Takeaways

  • • WOFF 1.0 (2010) used zlib compression, achieving ~40% size reduction from raw fonts
  • • Google developed WOFF2 with Brotli compression, achieving ~30% better compression than WOFF
  • • The glyph transform preprocessor restructures font data for optimal compression
  • • WOFF2 became a W3C Recommendation in March 2018; 97%+ browser support today

Share this page to:

The Web Open Font Format (WOFF) became a W3C Recommendation in December 2012 and quickly became the standard delivery mechanism for web fonts. It wrapped TrueType and OpenType font data in a zlib-compressed container with additional metadata, cutting file sizes by around 40% compared to raw font files. For the early 2010s web, this was transformative.

But as mobile internet usage exploded and Google began its deep research into web performance, the Google Fonts team identified web fonts as one of the most significant bottlenecks affecting page load time worldwide. WOFF was good — but a purpose-built compression scheme exploiting the internal structure of font data could do considerably better.

The result was WOFF2: a format that combines a novel glyph transform preprocessing step with Brotli compression to achieve file sizes roughly 25-35% smaller than WOFF for the same font. For large CJK fonts, the improvement can exceed 35%. This article explains the technical motivations, the engineering innovations, and the standardization path that made WOFF2 the dominant web font format today.

The Limitations of WOFF

WOFF 1.0, standardized in 2012, was a significant step forward for web fonts. It used zlib — the same compression algorithm behind gzip — to compress TrueType and OpenType fonts, typically achieving 40% file size reduction from the uncompressed source. However, as the web matured and mobile usage exploded, the performance demands on web fonts increased dramatically.

Google's research showed that font files were among the largest render-blocking resources on many web pages. The median web page loaded 3-4 font files totaling 100-300 KB compressed. On 3G mobile connections common in developing markets during 2012-2015, this could add 1-3 seconds to first contentful paint. Every kilobyte saved translated directly into better user experience for millions of people.

The fundamental limitation of WOFF 1.0 was that it applied zlib to raw font table data without any preprocessing. Font data has highly predictable internal structures — glyph coordinates follow geometric patterns, metrics tables have regular shapes, and character mapping data is largely sequential — but zlib was never designed to exploit these domain-specific patterns. A compressor that understood font internals could do significantly better.

Google's engineers, led by Khaled Hosny and Rod Sheeter within the Google Fonts team, began exploring whether a font-specific compression scheme could materially improve on zlib. The key insight was that font data has predictable internal structures that a specialized preprocessor could reorganize before compression, making the resulting data stream far more amenable to general-purpose compression algorithms.

Why Preprocessing Matters

General-purpose compression algorithms work by finding repeated byte sequences. Font data stores glyph coordinates in ways that are geometrically meaningful but not byte-sequence-repetitive. By transforming coordinates into delta-encoded streams and grouping similar data together, WOFF2's preprocessor creates the kind of repetition that Brotli can exploit.

Google's Brotli Innovation

Brotli is a general-purpose compression algorithm developed by Google engineers Jyrki Alakuijala and Zoltán Szabadka, initially released in 2013 specifically for WOFF2 compression. Brotli was later generalized for HTTP content encoding and accepted by all major browsers between 2016 and 2017. For WOFF2, Google combined Brotli with font-specific preprocessing to achieve compression far beyond what either technique could accomplish alone.

The key advantage of Brotli over zlib is its use of a substantially larger context window — up to 16 MB compared to zlib's 32 KB. This allows Brotli to find and exploit repeated patterns across much longer distances in the data stream. Brotli also uses a more sophisticated context model that predicts likely byte values based on surrounding data, achieving better compression ratios at comparable or faster decompression speeds.

Brotli additionally uses a predefined static dictionary of approximately 120,000 common substrings drawn from a large corpus of web content. While this dictionary is less relevant for binary font data than for HTML and JavaScript, it contributes to Brotli's overall compression advantage. The combination of larger context windows, better modeling, and dictionary-based encoding makes Brotli approximately 20-26% more effective than zlib at equal compression levels on typical web content.

For WOFF2 specifically, the gains are even larger because the font-specific preprocessing step transforms the data into a form that Brotli can compress exceptionally well. The combination of the glyph transform (described in the next section) and Brotli results in WOFF2 files that are typically 25-30% smaller than equivalent WOFF files. For some fonts — particularly those with large glyph sets like CJK fonts — the improvement can exceed 35%.

Brotli vs zlib at a Glance

zlib (used in WOFF 1.0)

  • • Context window: 32 KB
  • • Algorithm: DEFLATE (LZ77 + Huffman)
  • • Year introduced: 1996
  • • Decompression speed: Very fast
  • • Static dictionary: No

Brotli (used in WOFF2)

  • • Context window: Up to 16 MB
  • • Algorithm: LZ77 + Huffman + context modeling
  • • Year introduced: 2013
  • • Decompression speed: Fast
  • • Static dictionary: ~120K common substrings

The WOFF2 Glyph Transform

The secret weapon of WOFF2 is its glyph transform preprocessing step. Before Brotli compression is applied, WOFF2 restructures the TrueType glyph data (the 'glyf' table) to be more compressor-friendly. This transformation is the single most important technical innovation in WOFF2, accounting for roughly half of its improvement over WOFF 1.0.

In a standard TrueType font, each glyph's outline data is stored as a sequence of contours, where each point contains a flag byte (indicating whether the point is on-curve or off-curve), an x-coordinate, and a y-coordinate. These three data types are interleaved in memory for each point, then repeated for each contour, then repeated for each glyph. This organization makes sense for random access but is terrible for compression, because flags, x-coordinates, and y-coordinates have very different statistical distributions.

The WOFF2 glyph transform separates glyph data into parallel streams: one stream for all flags across all glyphs, one for all x-coordinates, one for all y-coordinates, and one for composite glyph information. This separation groups similar data together, creating much longer runs of statistically similar bytes that Brotli can model and compress far more efficiently.

The transform also applies delta encoding to glyph coordinates. Rather than storing the absolute x and y position of each point, WOFF2 stores the difference between consecutive point positions. Because font outlines typically consist of smooth curves with gradually changing coordinates, these deltas are usually small numbers clustered near zero — exactly the kind of data that compresses exceptionally well.

Additionally, WOFF2 applies transforms to the 'loca' table (which indexes the position of each glyph in the 'glyf' table) and the 'hmtx' table (horizontal metrics). These tables have highly predictable patterns that delta encoding can exploit. All of these preprocessing steps are perfectly lossless — the original font data can be reconstructed exactly from the WOFF2 representation.

The Transform Pipeline

  1. 1. Separate glyph streams — Flags, x-coords, y-coords, and composite data split into independent byte streams
  2. 2. Delta encode coordinates — Store differences between consecutive points instead of absolute values
  3. 3. Transform loca table — Apply delta encoding to glyph offset index
  4. 4. Transform hmtx table — Separate and delta-encode advance widths and left side bearings
  5. 5. Apply Brotli — Compress the transformed, stream-separated data with Brotli at maximum compression

Compression Comparison: WOFF vs WOFF2

Real-world testing shows consistent and significant advantages for WOFF2 across font types. The following figures are representative measurements for popular fonts widely used in web design. Results can vary based on font complexity, glyph count, and the number and type of OpenType features included.

FontTTF (source)WOFFWOFF2WOFF2 vs WOFF
Roboto Regular168 KB88 KB64 KB-27%
Open Sans Regular217 KB104 KB72 KB-31%
Noto Sans Japanese4.5 MB3.2 MB2.1 MB-34%
Source Code Pro181 KB97 KB70 KB-28%

The decompression speed of WOFF2 is an important practical consideration. Brotli decompression is computationally more demanding than zlib decompression. However, Google's measurements showed that on typical mobile devices — even modest ones common in 2014-2016 — Brotli decompression of a font file takes only a few milliseconds. The network time saved by smaller files far outweighs the additional decompression time, even on low-powered mobile hardware.

On a 3G connection with a 1 Mbps download speed, saving 24 KB on a font file (as with Open Sans above) saves approximately 192 milliseconds of download time. The additional 2-3 ms of Brotli decompression time is negligible in comparison. On modern LTE and 5G connections, the decompression overhead is further dwarfed by other latency factors.

CJK Font Gains

The compression advantage of WOFF2 is largest for CJK (Chinese, Japanese, Korean) fonts, which contain thousands of glyphs. Noto Sans Japanese, for example, achieves a 34% reduction versus WOFF — saving over 1 MB per font file. For sites serving East Asian languages, WOFF2 adoption has a particularly significant performance impact.

Standardization and Browser Adoption

The WOFF2 specification was developed within the W3C WebFonts Working Group. Google submitted the initial draft in 2014, with the specification authored by Tal Leming, Erik van Blokland, and David Kuettel, with significant technical contributions from the Google Fonts engineering team. The standardization process was relatively fast compared to other web standards, reflecting the clear technical superiority of the format and the absence of major competing proposals.

Jul 2014

Chrome 36 became the first browser to support WOFF2, shipping simultaneously with the initial W3C working draft of the specification.

Jun 2015

Firefox 39 added WOFF2 support, bringing the second major browser on board and beginning the transition to WOFF2 as the primary web font format.

Sep 2016

Safari 10 added WOFF2 support on macOS Sierra and iOS 10, completing coverage of all major Apple platforms.

Aug 2016

Microsoft Edge 14 supported WOFF2 from its initial version. Internet Explorer never received WOFF2 support before its retirement.

Mar 2018

WOFF2 W3C Recommendation — the format achieved full standardization status, marking it as a mature, stable web standard ready for universal deployment.

Internet Explorer never received WOFF2 support. For several years (2014-2018), web developers maintaining sites with significant IE traffic needed to serve both WOFF2 and WOFF 1.0 fallbacks. As of 2026, Internet Explorer's global usage has dropped below 0.5%, making WOFF2-only delivery safe for virtually all web projects. The remaining unsupported browsers are primarily legacy IE installations in specific enterprise environments.

WOFF2 in Practice Today

As of 2026, WOFF2 is the definitive web font format. Google Fonts has served WOFF2 by default since 2016, and major font services including Adobe Fonts, Fontshare, Bunny Fonts, and others all serve WOFF2 as the primary format. The question for most web developers is no longer "should I use WOFF2?" but "how do I use WOFF2 optimally?"

WOFF2 Best Practices in 2026

  • Serve WOFF2 only: With 97%+ browser support, WOFF 1.0 fallbacks are unnecessary for the vast majority of projects. Remove legacy WOFF entries from your CSS to reduce complexity.
  • Use unicode-range subsetting: Serve only the character ranges your content actually uses. Latin-only sites don't need CJK glyphs. Google Fonts does this automatically; self-hosted fonts should use tools like pyftsubset or glyphhanger.
  • Preload critical fonts: Use <link rel="preload"> to fetch your primary body font before the browser discovers it in CSS. This eliminates flash of invisible text (FOIT) on fast connections.
  • Use font-display: swap or optional: swap shows a system font fallback immediately; optional uses the system font if the web font isn't cached. Both approaches eliminate layout shift better than the default behavior.
  • Prefer variable fonts: A single WOFF2 variable font file can replace 6-12 static weight files. Roboto Variable is under 200 KB and replaces the entire Roboto family. When variable fonts are available, they almost always reduce total font payload.
  • Set correct MIME type: Serve WOFF2 files with Content-Type: font/woff2. Some older server configurations use application/font-woff2, which is technically incorrect but browser-tolerated.

The combination of WOFF2's excellent compression and variable font technology represents the current frontier of efficient web font delivery. A single WOFF2 variable font file can contain an entire type family — all weights, widths, and optical sizes — in less space than several static WOFF2 files. This dramatically reduces HTTP requests and total transfer size for sites using rich typographic systems.

Future developments may include per-glyph subsetting (serving only the exact characters used on each page, computed at request time) and improved compression through machine learning-based predictions of font data patterns. But for the foreseeable future, WOFF2 will remain the standard — a format whose careful engineering in 2013-2014 continues to pay dividends in faster web experiences for billions of users.

Convert Your Fonts to WOFF2

Put WOFF2's compression to work for your project. Convert TTF, OTF, and other formats to WOFF2 instantly — free, unlimited, no registration required.

Start Converting Now
Sarah Mitchell

Written & Verified by

Sarah Mitchell

Product Designer, Font Specialist

WOFF2 History FAQs

Common questions about WOFF2 development and compression