TTF, OTF, WOFF and WOFF2
Four extensions, two independent decisions. One is the outline model — how glyph shapes are drawn. The other is the container — how the tables are packed into a file. Almost every confusing thing about font conversion comes from treating these as one decision.
The outline model: glyf versus CFF
TrueType outlines live in a "glyf" table and use quadratic Bézier curves. They come with a bytecode hinting system that gives a font designer per-pixel control at small sizes, and with composite glyphs, so an "é" can reference the "e" and the acute accent rather than storing both again.
CFF outlines live in a "CFF " table and use cubic Bézier curves — the PostScript model, which is what type designers draw in. Hinting is declarative rather than programmatic. There are no composite glyphs.
Converting between them is a genuine transform. Quadratic to cubic is exact. Cubic to quadratic is an approximation that must be subdivided to a tolerance. Both directions discard the source hinting entirely. This is the conversion Glyph Batch holds.
The container: sfnt, WOFF, WOFF2
An .ttf or .otf file is a bare sfnt: a table directory followed by the tables. The extension is a convention indicating which outline model is inside — nothing in the file format enforces it, which is why .ttf files containing CFF outlines exist and confuse installers.
WOFF 1.0 wraps the same tables with per-table zlib compression and an optional XML metadata block. It changes nothing about the tables themselves, so unwrapping is exact.
WOFF2 wraps them with Brotli plus a reversible transform of "glyf" and "loca" that exploits their structure. It is typically 25-30% smaller than WOFF 1.0 and is supported by every browser released since 2016.
What to ship
For the web: WOFF2, subsetted, with a unicode-range. Do not ship TTF to browsers; you are sending an uncompressed file. A WOFF 1.0 fallback is almost certainly unnecessary in 2026.
For desktop installation: whichever of TTF or OTF the foundry shipped. There is no benefit to converting between them, and doing so loses the hinting the designer wrote.
For an app bundle: TTF or OTF, subsetted if the licence permits it.
If a tool demands "an OTF"
Ask whether it means "a font". Most do. Nearly every application that says it needs an .otf accepts a .ttf; the requirement is usually a decade-old habit rather than a real constraint on the outline model. A file renamed from .ttf to .otf is not a conversion and will fail validation in the tools that genuinely do care.
Related
WOFF2 to TTF
Decode WOFF2 web fonts back to installable TTF/OTF in your browser. Uses the reference Google WOFF2 decoder, preserves every table, and verifies the result. Nothing is uploaded.
OpenTTF to WOFF2
Compress TTF or OTF fonts to WOFF2 in your browser using the reference Google encoder. Batch queue, @font-face CSS, preload snippet and ZIP. No upload, no server.
OpenInspector
Read everything inside a font file in your browser: family and PostScript names, version, copyright and licence text, OS/2 embedding permissions, variation axes, colour tables and the full table directory.
OpenOTF to TTF (on hold)
Glyph Batch does not convert OpenType/CFF outlines to TrueType. This page explains what the conversion actually involves, why a rename is not a conversion, and what to do instead.
Read why