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.
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 thathead.checkSumAdjustmentcomes 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
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.
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.
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
Font Inspector
Opens a font file to show its glyph coverage by block, Korean syllable count, weight, variable axes, embedding permission and licence name records.
Font Subsetter
Cuts a TrueType font down to the glyphs your text actually uses and can wrap the result as WOFF — the difference between a 4 MB and a 90 KB Korean webfont.
SVG Editor and Explainer
Edits an SVG next to its live render and explains the file: viewBox and scaling, transforms, every path command, inherited paint, wasted bytes, and what breaks in an <img>, a data URI or inlined.
Device Mockup
Places a screenshot inside a phone, tablet, laptop or browser frame with a background and shadow.
Next
These accept what this tool produces, so the result can go straight in.
CSS Beautifier & Minifier
Formats or minifies CSS without reordering anything, preserving the token stream exactly.
Font Inspector
Opens a font file to show its glyph coverage by block, Korean syllable count, weight, variable axes, embedding permission and licence name records.
Font Subsetter
Cuts a TrueType font down to the glyphs your text actually uses and can wrap the result as WOFF — the difference between a 4 MB and a 90 KB Korean webfont.
Colour Format Converter
Converts a colour between HEX, RGB, HSL, HWB, LAB, LCH and OKLCH and names the nearest known colour.
Colour Picker
Picks a colour on an OKLCH field, with a screen eyedropper or from an uploaded image, and copies it in any notation.
Contrast Checker
Scores a foreground and background pair against WCAG 2 and APCA and suggests the nearest passing colour.