Font Embedding Bits: fsType Explained
Understand the fsType field in the OS/2 table, what embedding permissions mean, and how they relate to actual font licensing.
Key Takeaways
- • fsType is a metadata flag, not DRM—it doesn't technically prevent anything
- • Web browsers ignore fsType entirely when loading web fonts
- • Always check the actual license, not just fsType
- • 0x0000 (Installable) is the least restrictive value
In this article
The fsType field is a 16-bit value in the OS/2 table that indicates the font's embedding permissions. It was designed to help software determine what operations are allowed with a font—embedding in documents, installing on systems, or editing. However, understanding what fsType actually does (and doesn't do) is essential for proper font usage.
Critically: fsType is metadata, not protection. It's a flag that communicates the license terms, but it doesn't enforce them. Software may choose to honor fsType restrictions, but nothing technically prevents ignoring them. The real authority is always the font's license agreement.
fsType Permission Levels
| Value | Name | Meaning |
|---|---|---|
| 0x0000 | Installable Embedding | No restrictions. Font may be embedded and installed. |
| 0x0002 | Restricted License | Font may NOT be embedded or installed. Most restrictive. |
| 0x0004 | Preview & Print | Font may be embedded for viewing/printing only, not editing. |
| 0x0008 | Editable Embedding | Font may be embedded and document may be edited. |
Additional Bit Flags
0x0100No Subsetting
Font must be embedded complete, not subsetted
0x0200Bitmap Embedding Only
Only bitmap versions may be embedded, not outlines
Important Note
A value of 0 means "Installable Embedding"—the least restrictive option. This is different from many bit fields where 0 means "nothing set." The value 0x0002 (Restricted) is the most restrictive, not the default.
How Software Interprets fsType
The behavior of compliant software when it encounters each fsType value varies significantly. Desktop publishing applications like Adobe InDesign and Microsoft Word were designed to honor fsType—they check it before allowing font embedding in PDFs or documents. However, implementation quality has been inconsistent, and many applications have bugs or ignore fsType entirely.
| fsType Value | Compliant PDF Behavior | Web Browser Behavior |
|---|---|---|
| 0x0000 | Embeds font; allows subsetting | Ignored — font loads normally |
| 0x0002 | Refuses to embed; may warn user | Ignored — font loads normally |
| 0x0004 | Embeds as read-only in PDF | Ignored — font loads normally |
| 0x0008 | Embeds; document remains editable | Ignored — font loads normally |
The consistent pattern: web browsers ignore fsType completely. The OpenType specification explicitly notes that fsType is not a technical protection mechanism. When Google Fonts and other web font services distribute fonts, they typically set fsType to 0x0000 (Installable) regardless of the original foundry's setting, since legal web embedding rights are granted by the service license, not by the bit field.
The gap between fsType's intent and its actual enforcement reflects the broader challenge of digital rights management for fonts. In the early 2000s, major desktop publishing applications—Adobe InDesign, QuarkXPress, and Microsoft Word—did honor fsType restrictions, checking the bit before embedding fonts in exported PDFs or documents. This created a practical compliance layer for the era's primary use case: document embedding. Web browsers, however, were never designed as DRM enforcement tools. The web's open architecture treats font files as stylistic resources loaded over HTTP, and implementing fsType enforcement would break legitimate usage patterns while being trivially circumvented by anyone motivated to do so.
Open-source fonts released under licenses like the SIL Open Font License or Apache 2.0 uniformly set fsType to 0x0000, correctly reflecting their permissive license terms in the bit field. Proprietary commercial fonts may set any value, but the bit does not reliably predict web licensing availability. A font with fsType 0x0004 (Preview and Print) from a major foundry may have a separate web font license available for purchase; a font with fsType 0x0000 from an obscure source may still restrict web use through its EULA. Foundries that operate web font services—like Adobe Fonts and Fontspring—typically modify fsType to 0x0000 in their hosted versions, since those versions are contractually covered by the subscription license regardless of the original bits.
fsType and Web Fonts
Web browsers completely ignore fsType when loading web fonts via @font-face. There is no technical barrier—a font with fsType 0x0002 (Restricted) will load and render in browsers just like any other font.
What fsType Doesn't Do
- • Doesn't prevent font file download
- • Doesn't encrypt font data
- • Doesn't stop browser rendering
- • Doesn't enforce any license terms
What fsType Does
- • Communicates intended usage rights
- • Guides compliant software behavior
- • Documents the foundry's intentions
- • Helps with license compliance audits
Legal Reality
Using a font with fsType 0x0002 as a web font likely violates its license agreement, even though it works technically. The license—not fsType—determines legal usage. Some foundries set restrictive fsType as a signal, others don't set it at all even for licensed fonts. Always verify web embedding rights in the license.
WOFF and WOFF2: No Change to fsType
Converting a font to WOFF or WOFF2 format does not alter the fsType value. The OS/2 table (which contains fsType) is preserved byte-for-byte in the compressed web font. This means a font with fsType 0x0002 (Restricted) converted to WOFF2 still carries the 0x0002 flag in its OS/2 table.
Some font conversion tools offer an option to modify fsType during conversion. This is technically straightforward—change the two-byte field in the OS/2 table and recalculate the checksum—but doing so without the foundry's permission may violate the font license regardless of any technical restriction. The legal authority to embed a font comes from the license agreement, not from the fsType value.
Permissible
- • Foundry sets fsType 0 when distributing a web license
- • Open source fonts typically set 0x0000
- • Google Fonts, Adobe Fonts normalize to 0x0000
Problematic
- • Manually changing fsType to 0 on a restricted font
- • Using a converter that strips fsType protections
- • Assuming fsType 0 means the license permits web use
How to Check fsType
# Using fontTools (Python)
from fontTools.ttLib import TTFont
font = TTFont('myfont.ttf')
print(f"fsType: {font['OS/2'].fsType}")
# Using ttx to dump OS/2 table
ttx -t OS/2 myfont.ttf
# Then check the generated .ttx file for fsType
# Online tools
- Wakamai Fondue (wakamaifondue.com)
- FontDrop (fontdrop.info)
- Font Squirrel's Font Analyzer
# FontForge
Element → Font Info → OS/2 → Misc → fsTypeInterpreting the Value
fsType is a bit field, so values can combine. Common values:
0x0000Installable (no restrictions)
0x0002Restricted license
0x0004Preview & Print only
0x0008Editable embedding
0x0104Preview/Print + No subsetting
0x0208Editable + Bitmap only
Decoding Combined Bit Values
Because fsType is a bit field, values combine by OR-ing individual bits. To decode a combined value, check each bit position independently:
# Python: decode any fsType value
def decode_fstype(value):
results = []
# Embedding type (bits 0-3)
embed_bits = value & 0x000F
if embed_bits == 0x0000:
results.append("Installable Embedding (no restrictions)")
elif embed_bits & 0x0002:
results.append("Restricted License Embedding")
elif embed_bits & 0x0004:
results.append("Preview & Print Embedding")
elif embed_bits & 0x0008:
results.append("Editable Embedding")
# Additional restrictions (bits 8-9)
if value & 0x0100:
results.append("No Subsetting Allowed")
if value & 0x0200:
results.append("Bitmap Embedding Only")
return results
# Examples:
decode_fstype(0x0000) # ['Installable Embedding (no restrictions)']
decode_fstype(0x0104) # ['Preview & Print Embedding', 'No Subsetting Allowed']
decode_fstype(0x020A) # ['Editable Embedding', 'Bitmap Embedding Only']The 0x000F mask isolates the embedding type bits. After masking, check bits 1 (0x0002), 2 (0x0004), and 3 (0x0008). Bit 0 is reserved and should be 0 in all valid fonts.
Building font delivery infrastructure benefits from programmatic fsType auditing. The fontTools Python library provides direct access to the OS/2 table: TTFont('font.ttf')['OS/2'].fsType returns the integer value, which you can then decode using the bit masks above. Automated pipelines can flag fonts with fsType 0x0002 (Restricted) before they enter a web delivery system, prompting a license review before deployment. Open-source font collections like Google Fonts have performed this audit at scale, normalizing fsType to 0x0000 for all hosted fonts to reflect the permissive web license granted by the service, regardless of what the original binary contained.
The interaction between fsType and font subsetting deserves separate attention. The No Subsetting bit (0x0100) signals that the font must be embedded complete, without removing any glyphs. In a web font context where subsetting is a standard and significant optimization—reducing file sizes by 80–95% for Latin-only deployments—this bit creates a practical conflict. A font with 0x0100 combined with any embedding permission bit technically permits embedding but prohibits the character-set reduction that makes web delivery practical. In practice, web font licenses negotiated directly with foundries typically address subsetting rights explicitly in their terms, making the bit-level restriction secondary to contractual permission. When licensing fonts for web use, verifying subsetting rights in the actual license agreement is more reliable than reading the fsType bit.
Convert Licensed Fonts Safely
Always verify your font license permits web embedding before conversion.
Try Font ConverterWritten by
Sarah Mitchell
Product Designer, Font Specialist
Verified by
Marcus Rodriguez
Lead Developer
Font Embedding Bits FAQs
Common questions about fsType and embedding permissions
