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.

    Open
  • 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
  • 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
  • OTF 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