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. Glyph Batch performs the cubic-to-quadratic direction — CFF to glyf, the OTF to TTF page — and states its tolerance. It holds the reverse, which needs a CFF writer.

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.

Because the container does not change the outline model, unwrapping a WOFF or WOFF2 can only give back the font that went in. A web font built from a CFF font unwraps to a real .otf; one built from a TrueType font unwraps to a .ttf, whatever extension a converter puts on it.

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.

    Open: WOFF2 to TTF
  • WOFF2 to OTF

    Decode WOFF2 web fonts to OpenType .otf in your browser with the reference Google decoder. CFF fonts become a real .otf; TrueType fonts become .ttf, never a renamed file.

    Open: WOFF2 to OTF
  • WOFF to OTF

    Unwrap WOFF 1.0 web fonts to OpenType .otf in your browser. CFF fonts come out as a real .otf; TrueType fonts come out as .ttf and are never mislabelled. Nothing is uploaded.

    Open: WOFF to OTF
  • TTF 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.

    Open: TTF to WOFF2
  • OTF to WOFF2

    Compress OpenType (.otf) fonts to WOFF2 in your browser with the reference Google encoder. CFF outlines and PostScript hints are kept as they are, and nothing is uploaded.

    Open: OTF to WOFF2
  • Inspector

    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.

    Open: Inspector
  • OTF to TTF

    Convert OpenType/CFF fonts to real TrueType in your browser. Outlines are genuinely redrawn from cubic to quadratic curves to a stated tolerance, not renamed. Nothing is uploaded.

    Open: OTF to TTF