Skip to content

Font Converter

Converts TTF and OTF to WOFF and back in the browser and emits the matching @font-face rule; WOFF2 needs Brotli and is refused with a pointer to desktop tools.

Converts between the sfnt formats and WOFF 1.0 in both directions, working out which way to go from the file you drop. Both directions are lossless: WOFF is a container, so packing and unpacking gives back the same tables, with `head.checkSumAdjustment` recomputed so the result validates. WOFF2 is refused, and the page explains why rather than failing quietly.

🔒 Runs entirely in your browserfontconvertwoff2webfont

TTF · OTF → WOFF, or WOFF → TTF · OTF

Drop one file and the direction is worked out for you. Everything happens in this tab.

What works and what does not

  • · TTF and OTF ⇄ WOFF 1.0: per-table zlib with a 44-byte header and directory, as the WOFF spec (W3C, 2012) says. Compression is the browser’s CompressionStream('deflate'), and unpacking reassembles the sfnt with the original checksums so that head.checkSumAdjustment comes out right. Both directions are lossless.
  • · WOFF2 can be neither built nor unpacked. It needs Brotli, and the web platform does not expose Brotli to a page. If you need WOFF2, use a desktop tool — it is usually another 20–30% smaller than WOFF.
  • · TTF ⇄ OTF (CFF), changing the outline format, is a redraw rather than a conversion, so it is not offered. An .otf that is TrueType inside and only misleading in its extension is handled normally.
  • · A font’s licence (OS/2 fsType) is unchanged by conversion. Check the distribution terms before putting it on a server.

For size, subsetting beats format conversion by a long way — the subsetter cuts a Hangul font by more than 90% when it is reduced to the 2,350-syllable set.

How to use it

  1. Drop one file

    A TTF or OTF is packed into WOFF; a WOFF is unpacked back to TTF or OTF depending on what outlines it holds. There is no direction switch because the signature in the first four bytes already says which way to go.

  2. Check the before and after sizes

    Going to WOFF typically takes 40–50% off, which is per-table zlib and nothing clever. If it barely moves, the font is probably already compressed data — a CFF font with a lot of packed charstrings, for instance.

  3. Take the file and the @font-face

    The declaration assumes the file sits beside the stylesheet, and the weight and italic values are read from the font’s OS/2 and post tables rather than guessed from the filename.

Common questions

Why will it not do WOFF2?

WOFF2 is Brotli-compressed and also reorders and transforms the glyph tables. The web platform gives a page `CompressionStream` with deflate and gzip only — there is no Brotli, so neither direction is possible in a browser. On a desktop, fonttools (`pyftsubset --flavor=woff2`) or `woff2_compress` does it, for roughly another 20–30% over WOFF.

Can it turn a TTF into a real OTF?

No, and nothing honest can. TrueType uses quadratic curves and CFF uses cubic ones; going between them is a curve refit with a tolerance, which changes the outlines — that is redrawing the font, not converting it. What this does handle is the common case of a `.otf` that has TrueType outlines inside, where only the extension is misleading.

Do I still need WOFF, or is TTF fine?

A TTF served with gzip or brotli by the server ends up close to WOFF, so the format matters less than it used to. WOFF is still worth having: it compresses even when the server does not, and every browser that matters has supported it for a decade. The bigger win by far is subsetting, not the container.

Does converting change what the licence allows?

No. The OS/2 fsType and every name record come through unchanged, which means a font you may not embed is still a font you may not embed after it becomes a WOFF. Check the distribution terms before putting it on a server; the inspector shows those records.

Feed it from

Next

These accept what this tool produces, so the result can go straight in.