Web Open Font Format (WOFF) 1.0
Original web font wrapper for TrueType and OpenType fonts
In Simple Terms
WOFF (Web Open Font Format) is a compressed web font format with 99%+ browser support including IE9+. Uses zlib compression (40% smaller than TTF).WOFF2 is the newer, better choice (30% smaller than WOFF). Use WOFF as fallback for browsers that don't support WOFF2 (pre-2014 browsers).For modern sites: Serve WOFF2 first, WOFF fallback. Format order in @font-face matters—list WOFF2 before WOFF.
WOFF Format at a Glance
Developer
W3C WebFonts Working Group (2009-2012)
File Extension
.woff
MIME Type
font/woff, application/font-woff
Type
Compressed web wrapper for sfnt fonts (TTF/OTF)
Platform Support
All modern browsers; legacy support fallback
Primary Use
Fallback web fonts for older browser compatibility
Choose your target format below
All conversions preserve font quality and metadata
In this article
What is Web Open Font Format (WOFF)?
Web Open Font Format (WOFF) is a compressed font container format developed specifically for web use. WOFF wraps existing TrueType or OpenType fonts in a standardized package optimized for web delivery, providing better compression than raw font files while preserving all original typographic capabilities.
Core Characteristics
WOFF is fundamentally a transport format rather than a new font technology:
- Container format: Wraps TTF or OTF fonts without modifying glyph data
- zlib compression: Compresses each font table individually for reduced file size
- Metadata support: Optional XML metadata for licensing and attribution
- Web-optimized: Designed specifically for @font-face delivery
- Browser decompression: Automatically inflated to TTF/OTF in memory
How WOFF Works
When a browser encounters a WOFF font, it performs the following steps:
- Downloads the compressed .woff file
- Validates the WOFF header and table directory
- Decompresses each font table using zlib
- Reconstructs the original sfnt font structure in memory
- Uses the font exactly as if it were the original TTF/OTF
This means WOFF fonts have identical rendering, hinting, and OpenType feature support to their source fonts—the only difference is the compressed delivery mechanism.
Current Status
While WOFF achieved universal browser support and transformed web typography from 2010-2016, it has been largely superseded by WOFF2, which offers significantly better compression through Brotli encoding. Today, WOFF serves primarily as a fallback format for older browsers, with WOFF2 as the primary web font format.
Modern Usage
For new web projects in 2025, use WOFF2 as your primary format and include WOFF only if you need to support Internet Explorer 11 or very old mobile browsers. WOFF2 provides 30% better compression and is supported by all modern browsers.
Format History
The Web Open Font Format (WOFF) emerged from years of frustration with web typography limitations and represents a crucial stepping stone in the evolution of fonts on the web. Its story is one of industry collaboration, technical compromise, and the recognition that the web needed its own font delivery mechanism.
The Dark Ages of Web Typography (1996-2008)
For over a decade, web designers faced severe typography constraints that limited creative expression and brand consistency:
The "Web Safe Fonts" Problem
- Limited choices: Only ~12 fonts available across Windows and Mac (Arial, Times New Roman, Georgia, Verdana, etc.)
- No brand fonts: Companies couldn't use their corporate typefaces online
- Design constraints: Typography was reduced to font stacks and fallback lists
- Platform differences: Fonts rendered differently across operating systems
- Creative workarounds: Designers resorted to image replacement, Flash, or sIFR hacks
The CSS2 specification (1998) included @font-face, but without a standardized font format for the web, browsers implemented it inconsistently or not at all. The result was a fractured landscape where custom fonts were effectively impossible.
Early Web Font Attempts (1996-2008)
Several attempts to solve web typography preceded WOFF:
| Technology | Year | Approach | Why It Failed |
|---|---|---|---|
| TrueDoc | 1996 | Bitstream's portable font format | Limited browser support, proprietary |
| EOT | 1997 | Microsoft's embedded OpenType | IE-only, complex DRM, vendor lock-in |
| Raw TTF/OTF | 2006 | Safari allows desktop fonts | Font piracy concerns, no optimization |
| SVG Fonts | 2001 | XML-based vector fonts | Poor performance, large files, limited adoption |
| sIFR/Cufón | 2004-2008 | Flash or Canvas font replacement | Slow, not selectable text, accessibility issues |
Each solution had fatal flaws: proprietary formats created vendor lock-in, raw font files raised piracy concerns, and workarounds like Flash text were slow and inaccessible. The industry needed a standard that balanced font foundry concerns with developer needs.
The @font-face Renaissance (2008-2009)
In 2008, Safari 3.1 began supporting @font-face with raw TrueType and OpenType fonts, followed by Firefox 3.5 in 2009. This watershed moment proved that web fonts were technically feasible, but several problems remained:
Technical Issues
- Large file sizes (no compression)
- Slow download times on 2000s broadband
- No metadata or licensing info in font files
- Desktop fonts not optimized for web delivery
- CORS and same-origin policy complications
Business Issues
- Font foundries feared widespread piracy
- Licensing unclear for web use
- No way to restrict fonts to specific domains
- Desktop font sales potentially cannibalized
- Need for new licensing models
WOFF Development Begins (2009)
In April 2009, Mozilla's Jonathan Kew, Type Supply's Tal Leming, and FontFont's Erik van Blokland began developing WOFF as a pragmatic solution to web font delivery:
WOFF Design Goals
- Compression: Reduce file sizes for faster delivery
- Metadata: Embed licensing, vendor, and copyright information
- Universal compatibility: Work across all browsers and platforms
- Preserves font data: No modification to original TrueType/OpenType tables
- Clear web-only usage: Signal to users that fonts are for web, not desktop installation
- Simple transformation: Easy conversion from existing TTF/OTF fonts
WOFF was explicitly designed as a "container" rather than a new font format. It wraps existing TTF or OTF fonts in a compressed envelope with metadata, making it clear these are web resources while preserving all the original font's typographic capabilities.
W3C Standardization (2009-2012)
The WOFF specification was submitted to the W3C WebFonts Working Group for standardization:
| Date | Milestone | Significance |
|---|---|---|
| April 2009 | WOFF proposal submitted | Initial specification drafted |
| July 2010 | First Working Draft published | Public review begins |
| August 2010 | Firefox 3.6 ships WOFF support | First major browser implementation |
| December 2010 | Chrome 6.0 adds WOFF support | WebKit adoption accelerates |
| March 2011 | IE9 includes WOFF support | Microsoft joins web fonts standard |
| December 2012 | WOFF 1.0 becomes W3C Recommendation | Official standard status achieved |
Browser Adoption and Market Impact (2010-2013)
WOFF's universal browser support created an explosion in web typography:
- Google Fonts (2010): Launched with WOFF as primary format, democratizing web fonts
- Typekit (acquired 2011): Web font service boom, Adobe acquires for $30M+
- Font foundries adapt: Major type foundries create web font licensing programs
- Design Renaissance: Websites finally achieve typographic parity with print
- @font-face ubiquitous: CSS font loading becomes standard practice
WOFF Browser Support Timeline
| Browser | Version | Release Date | Impact |
|---|---|---|---|
| Firefox | 3.6 | Aug 2010 | First implementation |
| Chrome | 6.0 | Dec 2010 | WebKit adoption |
| Internet Explorer | 9.0 | Mar 2011 | Microsoft endorsement |
| Safari | 5.1 | Jul 2011 | iOS support follows |
| Opera | 11.10 | Apr 2011 | Complete coverage |
By 2013, WOFF support was effectively universal across modern browsers, achieving what no previous web font format had managed: cross-browser, cross-platform consistency without proprietary extensions.
Performance Limitations and WOFF2 Development (2013-2014)
Even as WOFF succeeded, performance concerns emerged:
WOFF Compression Limitations
- zlib compression: Good but not optimal for font data
- Per-table compression: Missed cross-table compression opportunities
- Mobile performance: File sizes still significant on cellular networks
- No preprocessing: TrueType tables stored as-is, not optimized
- Typical reduction: ~40% smaller than raw TTF/OTF (good but not great)
Google's analysis of web font performance in 2013 showed that better compression could significantly improve page load times. This led to the development of WOFF2, which uses Brotli compression and preprocessing to achieve 30% better compression than WOFF.
WOFF2 Transition and WOFF's Decline (2014-Present)
WOFF2's superior compression and efficiency gradually displaced WOFF as the primary web font format:
| Period | WOFF Status | Industry Trend |
|---|---|---|
| 2010-2014 | Dominant | Primary web font format |
| 2014-2016 | Mature | WOFF2 begins adoption |
| 2016-2019 | Fallback | WOFF2 becomes primary, WOFF secondary |
| 2020-Present | Legacy Support | Only for old browser compatibility |
Current Status and Best Practices (2025)
WOFF remains supported but is no longer recommended for modern development:
When to Use WOFF
- Supporting IE11 (end-of-life 2022)
- Legacy browser requirements
- As fallback with WOFF2 primary
- Existing infrastructure dependencies
When to Use WOFF2
- All new web projects (2025)
- Performance-critical applications
- Mobile-first design
- Modern browser targets only
Modern @font-face Pattern
@font-face {
font-family: 'WebFont';
/* WOFF2 for modern browsers (90%+ compatibility) */
src: url('font.woff2') format('woff2'),
/* WOFF as fallback (legacy support) */
url('font.woff') format('woff');
font-display: swap; /* Improve perceived performance */
}WOFF's Legacy and Lessons
WOFF's contribution to web typography cannot be overstated:
Technical Achievements
- Solved cross-browser font delivery
- Balanced compression with simplicity
- Metadata framework for licensing
- Foundation for WOFF2 improvements
- Clear separation of web vs. desktop fonts
Cultural Impact
- Ended the "web safe fonts" era
- Enabled web font services ecosystem
- Convinced foundries to embrace web licensing
- Democratized professional typography
- Improved web design quality universally
Historical Perspective
WOFF succeeded where TrueDoc, EOT, and SVG fonts failed because it solved a real problem without creating new ones. By wrapping existing fonts rather than inventing a new format, WOFF gained rapid adoption. By standardizing through W3C rather than remaining proprietary, it achieved universal browser support. And by providing just enough compression to matter without overcomplicating the specification, it delivered immediate value while leaving room for future improvement. WOFF2 eventually superseded it, but WOFF's design philosophy—pragmatic, open, and focused—remains the blueprint for successful web standards.
While WOFF may now serve primarily as a fallback format, its role in transforming web typography from a creative desert into a rich design medium cannot be overstated. Every beautiful typeface you see on the modern web stands on WOFF's shoulders.
Technical Specifications
Compression Method
WOFF employs zlib (DEFLATE) compression on a per-table basis:
- zlib/DEFLATE algorithm: Standard compression used in ZIP files and PNG images
- Per-table compression: Each OpenType table compressed independently
- Typical compression ratio: 40-50% reduction from original TTF/OTF size
- Decompression speed: Fast enough for real-time browser use
File Structure
| Component | Size | Description |
|---|---|---|
| WOFF Header | 44 bytes | Signature, flavor, length, numTables, reserved, totalSfntSize |
| Table Directory | 20 bytes per table | Tag, offset, compLength, origLength, origChecksum |
| Font Tables | Variable | Compressed sfnt tables (glyf, cmap, head, etc.) |
| Extended Metadata | Optional | XML metadata for licensing and attribution |
| Private Data | Optional | Vendor-specific data |
WOFF Header Details
Header Structure
| Field | Type | Value |
|---|---|---|
| signature | UInt32 | 0x774F4646 ("wOFF") |
| flavor | UInt32 | 0x00010000 (TrueType) or "OTTO" (CFF) |
| length | UInt32 | Total WOFF file size |
| numTables | UInt16 | Number of font tables |
Metadata Block
WOFF supports optional XML metadata for licensing and attribution:
Metadata Example
<?xml version="1.0" encoding="UTF-8"?>
<metadata version="1.0">
<uniqueid id="com.example.fontvendor.myfont.v1.2.3"/>
<vendor name="Font Vendor" url="https://example.com"/>
<credits>
<credit name="Designer Name" role="Designer"/>
</credits>
<description>
<text lang="en">A beautiful web font</text>
</description>
<license url="https://example.com/license">
<text lang="en">Licensed for web use only</text>
</license>
</metadata>WOFF File Structure
Container Architecture
WOFF acts as a compressed container for sfnt-based fonts (TrueType and OpenType):
Processing Flow
- Creation: Original TTF/OTF font tables extracted
- Compression: Each table compressed individually with zlib
- Packaging: WOFF header and directory created
- Distribution: Smaller .woff file served via @font-face
- Browser loading: Browser downloads and validates WOFF header
- Decompression: Tables decompressed back to original sfnt format
- Rendering: Font used exactly as original TTF/OTF would be
Preserved Font Tables
All original OpenType tables are preserved without modification:
- Required tables: cmap, glyf/CFF, head, hhea, hmtx, loca (TrueType), maxp, name, post
- Optional tables: GSUB, GPOS, kern, gasp, GDEF, etc.
- OpenType features: All ligatures, alternates, and layout features intact
- Hinting: TrueType hinting instructions preserved
- Kerning: Both kern table and GPOS kerning maintained
Key Principle
WOFF is transport, not transformation. The browser inflates WOFF back into the exact original font in memory. All layout logic, OpenType features, and rendering behavior come from the source font, not from WOFF itself.
Typography Features and Capabilities
WOFF does not add or remove typographic features—it simply delivers the source font's capabilities to the browser. Whatever OpenType features exist in the original TTF or OTF font remain available.
OpenType Feature Support
If the source font includes OpenType features, they can be activated via CSS:
CSS OpenType Features Example
@font-face {
font-family: 'MyWebFont';
src: url('/fonts/MyWebFont.woff2') format('woff2'),
url('/fonts/MyWebFont.woff') format('woff');
font-weight: 400;
font-style: normal;
font-display: swap;
}
/* Enable ligatures */
.text-with-ligatures {
font-family: 'MyWebFont', sans-serif;
font-feature-settings: 'liga' 1, 'dlig' 1;
}
/* Use old-style figures */
.text-with-oldstyle {
font-variant-numeric: oldstyle-nums;
/* Equivalent to: font-feature-settings: 'onum' 1; */
}
/* Small caps */
.small-caps {
font-variant-caps: small-caps;
/* Equivalent to: font-feature-settings: 'smcp' 1; */
}
/* Contextual alternates */
.fancy-text {
font-feature-settings: 'calt' 1, 'salt' 1;
}Variable Fonts in WOFF
WOFF can contain variable fonts with all their interpolation axes:
Variable Font Example
@font-face {
font-family: 'MyVariableFont';
src: url('font-variable.woff2') format('woff2'),
url('font-variable.woff') format('woff');
font-weight: 100 900; /* Weight range */
font-stretch: 75% 125%; /* Width range */
}
h1 {
font-family: 'MyVariableFont';
font-weight: 750;
font-variation-settings: 'wdth' 110, 'wght' 650;
}Usage and Applications
Historical Usage (2010-2016)
During its peak, WOFF was the primary web font format:
- Self-hosted web fonts: Primary format for font hosting
- Web font services: Google Fonts, Typekit, Font Squirrel served WOFF
- Responsive web design: Enabled custom typography in fluid layouts
- Corporate branding: Companies could finally use brand fonts online
- Icon fonts: Font Awesome and similar icon fonts distributed as WOFF
Current Usage (2025)
WOFF now serves primarily as a compatibility fallback:
- Legacy browser support: Fallback for IE11 and older mobile browsers
- Graceful degradation: Secondary format after WOFF2
- Legacy infrastructure: Older webfont kits and CDNs
- Compatibility layers: Ensuring fonts work on maximum browsers
When to Use WOFF vs WOFF2
| Scenario | Format Choice | Reason |
|---|---|---|
| New project (2025) | WOFF2 primary, WOFF fallback | WOFF2 smaller, faster, universally supported |
| Modern browsers only | WOFF2 only | 97%+ browser support, best performance |
| IE11 support required | Both WOFF2 and WOFF | IE11 needs WOFF fallback |
| Legacy maintenance | Keep existing WOFF | Don't break what works |
Advantages and Disadvantages
Advantages
- Universal browser support: Works in every browser since 2011
- Good compression: 40-50% smaller than raw TTF/OTF
- Preserves font quality: No loss of glyphs or OpenType features
- Metadata support: Can embed licensing and attribution info
- Simple conversion: Easy to create from existing fonts
- Fast decompression: zlib decompresses quickly in browsers
- Well-documented: W3C standard with clear specification
Disadvantages
- Inferior to WOFF2: 30% larger files than WOFF2
- Slower download: Larger file sizes impact page load
- Not installable: Web-only, cannot be used as desktop font
- Per-table compression: Misses global optimization opportunities
- No preprocessing: Doesn't optimize TrueType tables like WOFF2
- Legacy format: Primarily maintained for backward compatibility
- Conversion overhead: Requires build step from source fonts
Performance Impact
On mobile devices with limited bandwidth, the 30% size difference between WOFF and WOFF2 is significant. A 100KB WOFF file becomes 70KB in WOFF2, saving 30KB—which can mean 150-300ms faster download on 3G connections. Multiply this across multiple font weights and you save seconds of load time.
WOFF vs Other Font Formats
Understanding WOFF's position relative to other web font formats:
| Format | Compression | File Size | Browser Support | Use Case |
|---|---|---|---|---|
| WOFF | zlib | Medium | Universal (2011+) | Legacy fallback |
| WOFF2 | Brotli | Small | Modern (97%+) | Primary web font |
| TTF | None | Large | Universal | Desktop, source font |
| OTF | CFF (optional) | Medium-Large | Universal | Desktop, source font |
| EOT | LZW | Medium | IE only | Obsolete (IE6-8) |
File Size Comparison
Real-world compression comparison using Roboto Regular:
Roboto Regular File Sizes
| Format | File Size | vs TTF | vs WOFF |
|---|---|---|---|
| TTF | 168 KB | — | — |
| WOFF | 89 KB | -47% | — |
| WOFF2 | 68 KB | -60% | -24% |
For detailed comparisons, see our WOFF vs WOFF2 comparison or WOFF vs TTF comparison.
Working with WOFF Files
Creating WOFF Files
Convert TTF or OTF source fonts to WOFF using various tools:
Command-Line Conversion
# Using sfnt2woff
sfnt2woff MyFont.ttf
# Using fonttools (Python)
pyftsubset MyFont.ttf --output-file=MyFont.woff --flavor=woff
# Using woff2 tools (convert to WOFF2, then WOFF if needed)
woff2_compress MyFont.ttf
woff2_decompress MyFont.woff2 MyFont-temp.ttf
sfnt2woff MyFont-temp.ttf
# Batch conversion
for font in *.ttf; do
sfnt2woff "$font"
doneUsing WOFF in CSS
Modern @font-face Pattern
/* Optimal font loading strategy */
@font-face {
font-family: 'CustomFont';
/* WOFF2 for 97%+ of users (modern browsers) */
src: url('/fonts/CustomFont.woff2') format('woff2'),
/* WOFF fallback for IE11 and old mobile */
url('/fonts/CustomFont.woff') format('woff');
font-weight: 400;
font-style: normal;
font-display: swap; /* Show fallback text immediately */
}
/* Multiple weights example */
@font-face {
font-family: 'CustomFont';
src: url('/fonts/CustomFont-Bold.woff2') format('woff2'),
url('/fonts/CustomFont-Bold.woff') format('woff');
font-weight: 700;
font-style: normal;
font-display: swap;
}
body {
font-family: 'CustomFont', -apple-system, BlinkMacSystemFont,
'Segoe UI', system-ui, sans-serif;
}Font Loading Optimization
Improve perceived performance with proper font loading strategies:
Preload Critical Fonts
<!-- In HTML <head> -->
<link rel="preload"
href="/fonts/CustomFont.woff2"
as="font"
type="font/woff2"
crossorigin>
<link rel="preload"
href="/fonts/CustomFont-Bold.woff2"
as="font"
type="font/woff2"
crossorigin>
<!-- CSS -->
<style>
@font-face {
font-family: 'CustomFont';
src: url('/fonts/CustomFont.woff2') format('woff2'),
url('/fonts/CustomFont.woff') format('woff');
font-display: swap;
}
</style>Subsetting WOFF Fonts
Reduce file size by including only needed glyphs:
Using pyftsubset
# Latin characters only
pyftsubset MyFont.ttf \
--unicodes="U+0020-007F,U+00A0-00FF" \
--output-file=MyFont-Latin.woff \
--flavor=woff
# Specific text content
pyftsubset MyFont.ttf \
--text-file=content.txt \
--output-file=MyFont-Subset.woff \
--flavor=woff
# Keep OpenType features
pyftsubset MyFont.ttf \
--unicodes="U+0020-007F" \
--layout-features="*" \
--output-file=MyFont-Features.woff \
--flavor=woffConverting WOFF to Other Formats
# WOFF to TTF (extract original font)
woff2sfnt MyFont.woff
# WOFF to WOFF2 (via TTF intermediate)
woff2sfnt MyFont.woff > MyFont-temp.ttf
woff2_compress MyFont-temp.ttf
# Using fonttools
ttx -f MyFont.woff # Creates MyFont.ttx (XML)
ttx -f -o MyFont.ttf MyFont.ttx # Convert back to TTFFor easy conversions without command-line tools, use our Font Converter Tool which supports batch processing and multiple output formats.
Frequently Asked Questions
Should I still use WOFF in 2025?
Use WOFF only as a fallback alongside WOFF2. If you need to support Internet Explorer 11 or very old mobile browsers, include both formats in your @font-face declaration with WOFF2 first. For modern-browser-only projects, use WOFF2 exclusively—it has 97%+ browser support and offers 30% better compression.
What's the difference between WOFF and WOFF2?
Both wrap TrueType/OpenType fonts for web delivery, but they use different compression:
- WOFF: Uses zlib compression, ~40% smaller than TTF/OTF
- WOFF2: Uses Brotli compression with preprocessing, ~60% smaller than TTF/OTF (30% better than WOFF)
- Browser support: WOFF works in IE9+; WOFF2 works in all modern browsers
- Recommendation: Use WOFF2 as primary format, WOFF as legacy fallback
Can I use WOFF fonts on desktop applications?
No, WOFF is a web-only format. Operating systems and desktop applications cannot install or use WOFF fonts directly. For desktop use, convert WOFF back to TTF or OTF using tools like fonttools or woff2sfnt. However, the original TTF/OTF source font is preferable if available, as it hasn't been through the compression/decompression cycle.
Does WOFF support variable fonts?
Yes, WOFF can contain variable fonts. Since WOFF is just a container for TTF/OTF fonts, if the source font is a variable font with OpenType variation tables (fvar, gvar, etc.), those tables are preserved in the WOFF wrapper. Browsers that support variable fonts will utilize all interpolation axes when the font is loaded, just as they would with the original TTF/OTF variable font.
How do I convert TTF to WOFF?
Use command-line tools or online converters:
- sfnt2woff:
sfnt2woff MyFont.ttf - fonttools:
pyftsubset MyFont.ttf --flavor=woff --output-file=MyFont.woff - Online: Use our Font Converter Tool for easy conversion
Note: Also create WOFF2 versions for optimal performance—they're 30% smaller than WOFF.
Why is my WOFF font not loading in the browser?
Common causes and solutions:
- CORS issues: Ensure proper Access-Control-Allow-Origin headers if hosting fonts on a CDN
- Wrong MIME type: Server should serve WOFF with
font/woffMIME type - Incorrect path: Verify the URL in
src:points to the actual font file - Corrupted file: Re-convert from the original TTF/OTF source
- Browser cache: Hard refresh (Ctrl+F5) to clear cached files
Check browser DevTools Network tab to see if the font file is actually being requested and what status code is returned.
Ready to Work with WOFF Fonts?
Convert any font format to WOFF with our free online converter
Related Resources
Related Font Formats

Written & Verified by
Sarah Mitchell
Product Designer, Font Specialist
