Convert WOFF2 to WOFF (Building a Real Legacy Browser Fallback)
Why this conversion changes the compression wrapper instead of the font itself, and how to publish both files without making modern browsers download both.
- Add a file Choose or drop it here
- Pick the format Change it whenever needed
- Download the result After conversion completes
WOFF2 and WOFF Carry the Same Sort of Font, but Take Different Routes Across the Web
Both WOFF and WOFF2 are web-font containers built around the table-based sfnt structure used by TrueType and OpenType fonts. They exist so a browser can fetch a font through CSS without treating that download as a normal desktop installation. WOFF 1.0 became a W3C Recommendation on 13 December 2012; WOFF2 became one in March 2018. The difference is not that WOFF contains “older letters” or that WOFF2 supports a different alphabet. It is chiefly the way the same kinds of font tables are organized and compressed for transfer. A correct WOFF2-to-WOFF conversion first recovers the font data and then puts it in the older WOFF container, so the shapes, mappings, and OpenType features that were present in the source can remain the same.
This conversion has a narrow but real reason: a site may need to serve an old browser that understands WOFF but predates WOFF2. It is not a reason to replace WOFF2 as the first choice for modern traffic. The WOFF 1.0 specification says its purpose is CSS @font-face, and says a WOFF file must not be treated as an installable desktop font. A WOFF fallback should therefore sit beside the WOFF2 source in the site assets, not be installed as a replacement for a TTF or OTF. The useful question is not “which extension is best?” but “which browser version still appears in the audience, and does it need the fallback?”
The Exact Wrapper Change From a Brotli Stream to Per-Table zlib Data
A WOFF2 file begins with wOF2 and stores the concatenated font-data stream using Brotli. Before that stream is compressed, WOFF2 may apply special reversible transforms to glyf, loca, and hmtx tables. For every other table, the usual null transform sends the original table data straight to Brotli. WOFF1 starts with the different signature wOFF and uses a 44-byte header followed by a table directory. Each directory row records a table tag, offset, compressed length, original length, and the original checksum. Its specification requires zlib-compatible compression for a table that is compressed, rather than one whole Brotli stream for the complete font data.
Converting from WOFF2 to WOFF therefore has two clean stages: decode the WOFF2 data and reverse any transforms, then write a WOFF directory and zlib-compress each eligible sfnt table. It should not alter the typeface itself. WOFF1 even requires a tool to leave a table uncompressed when compression would make that individual table the same size or larger; a WOFF file with a compLength greater than its origLength is invalid. That exact rule explains why a valid WOFF is not simply “every table zipped.” It also means that file size depends on the actual mix of names, outlines, layout data, and already-compressed tables, so no honest converter can promise one fixed percentage increase over WOFF2.
Concrete Trade-Offs When a Modern Web Font Receives a WOFF Fallback
- Gain — coverage for pre-WOFF2 browsers: the fallback can reach engines that understand WOFF 1.0 but do not implement the WOFF2 decoder.
- Preserve — font behavior: once WOFF2 transforms are reversed, the same sfnt tables can be wrapped in WOFF, so existing character maps and layout tables do not need to be redesigned.
- Lose — Brotli's compact delivery stream: WOFF1 uses zlib table-by-table, while WOFF2 uses Brotli and can exploit optional transforms for glyph, location, and metrics data.
- Gain — a known MIME type split: the formats have distinct media types,
font/woff2andfont/woff, which helps a server describe the downloaded resource accurately. - Risk — doubled storage, not doubled font downloads: publishing both files costs server storage, but a properly ordered CSS source list lets a supporting browser pick one usable resource.
- Lose — WOFF2-only wrapper data: WOFF2 metadata is Brotli-compressed and its private block is part of that wrapper; WOFF has its own separate metadata and private-data rules, not a byte-for-byte wrapper copy.
Which Browser Generations Benefit From Keeping Both Web-Font Files
The W3C WOFF2 implementation report records the practical start points: Chrome 36, Chrome for Android 36, Firefox 39, Edge 14, Safari 10 on Sierra or later, and iOS Safari 10.2. A browser older than one of those points may still have WOFF support, making the WOFF copy useful. For ordinary current browsers, WOFF2 should remain first because it was designed as WOFF1's improved successor and uses Brotli. The decision should be based on actual traffic, required devices, or an explicitly supported legacy environment. Adding WOFF for a browser population that does not exist adds an extra asset to maintain without changing what most visitors see.
Put both formats in one @font-face rule and identify them accurately. A clear pattern is src: url('brand.woff2') format('woff2'), url('brand.woff') format('woff');. A browser evaluates the list and chooses a source whose format it supports; it does not need to download both merely because two URLs are listed. The W3C WOFF2 specification says WOFF1 and WOFF2 have different Internet media types and may be used in parallel, which is exactly the job this source list performs. Keep the family name, weight, style, stretch, and unicode-range descriptors identical for matching files; otherwise a browser can treat them as different faces and a fallback can appear to be a font mismatch rather than a format fallback.
Real Deployment Failures That a WOFF Copy Does and Does Not Fix
If an old browser silently falls back to a system font, a WOFF file can solve the problem only when the browser understands WOFF but not WOFF2. It will not fix a missing file, a blocked cross-origin request, a wrong CSS path, or a source font whose glyph was removed during subsetting. Start with the browser network panel: a 404 response means the URL is wrong, while a blocked cross-origin response means the font host must send a suitable CORS response for the requesting site. Also check the response type. The registered WOFF1 type is font/woff and the WOFF2 type is font/woff2; modern browsers often recover from an old generic type, but a correctly configured server removes one variable from the diagnosis.
Another reported-looking failure is “the WOFF file is larger, so the conversion must have failed.” That conclusion is backwards. WOFF2 uses a single Brotli-compressed data stream and may encode structure-aware transforms, while WOFF1 uses zlib for individual tables and may leave unhelpful tables raw. A larger WOFF is normal even when all glyphs work. Conversely, a tiny WOFF is not automatically good: WOFF requires valid offsets, four-byte table alignment, correct original checksums, and matching decompressed lengths. If text changes shape after the fallback, compare the actual files' name, cmap, GSUB, and GPOS tables; the usual cause is that different weight, subset, or generation settings were used, not that zlib altered an outline.
The Two WOFF Generations Compared Beyond Their File Extensions
| Feature | WOFF2 | WOFF 1.0 |
|---|---|---|
| Signature | wOF2, 0x774F4632 | wOFF, 0x774F4646 |
| W3C Recommendation | March 2018 | 13 December 2012 |
| Main font-data compression | One Brotli stream | zlib per compressed table |
| Special table transforms | Optional glyf, loca, hmtx transforms | None defined; tables remain original form |
| Modern browser start points | Chrome 36, Firefox 39, Edge 14, Safari 10 | Useful as the older fallback format |
| Registered media type | font/woff2 | font/woff |
Answers to Practical WOFF2-to-WOFF Fallback Questions
Will turning WOFF2 into WOFF change my font outlines?
It should not. A correct converter reverses WOFF2's compression and optional table transforms, then repackages the same sfnt data in WOFF 1.0. If the visible result differs, compare the source subset, weight, and OpenType tables used to create each file.
Why is the WOFF fallback larger?
WOFF2 uses Brotli for its font-data stream and can transform TrueType glyph-related tables before compression. WOFF uses zlib-compatible compression one table at a time, so it normally cannot match that packaging efficiency.
Do modern browsers download both WOFF2 and WOFF?
Not when both are alternatives in one correctly written src list. A modern browser selects the WOFF2 source it supports; the WOFF URL is there for a browser that cannot use the first source.
Can a WOFF fallback fix a CORS error?
No. CORS is a server-permission issue, not a font-format issue. Configure the font host to permit the site that requests the file, then test the network response for both URLs.
Should I install the new WOFF on Windows or macOS?
No. WOFF was specified for fonts linked to web documents and not for desktop installation. Convert to a suitable TTF or OTF only when you have a licensed reason to use the font outside the website.