Convert TTF to WOFF2

Converting TTF to WOFF2 does not change the typeface — it re-wraps the same font tables in the container browsers want, compressed with Brotli and typically thirty to fifty per cent smaller than the TTF. It is the standard first step of putting a typeface on a site, and the second step, subsetting, saves more than this one does.

  • Where it runs On our server, because a browser cannot run the software this needs.
  • Lossless Nothing is discarded. The WOFF2 holds exactly what the TTF held.
  • File size limit Up to 25 MB per file, free, without an account.
  • Worth knowing The outlines decide what an unwrapped font is: a WOFF holding PostScript curves becomes an OTF, one holding TrueType curves becomes a TTF. Asking for the other is refused rather than answered with a mislabelled file.

Up to 100 files at once. Mixed formats are fine.

What the TTF to WOFF2 step actually does to the file

Nothing is redrawn. A TTF is a set of tables — the outlines, the character map, the metrics, the kerning, the OpenType feature definitions — and WOFF2 keeps every one of them, compressed with Brotli after a preprocessing pass that rearranges font data into a shape the compressor handles well. Unwrapping a WOFF2 produces the TTF that went in.

That is why the conversion is lossless and why it takes no thought about quality. There is no setting to get wrong, no resampling, no colour decision. The only thing you can get wrong here is whether you were allowed to do it, which is the next section and the one most tools leave out.

Check the licence before you convert a TTF for the web

A font is software and is licensed like software. The desktop licence that came with a purchased TTF covers installing it on a stated number of machines and using it to make things; it does not automatically cover putting the file on a web server where anyone can download it. Web use is normally a separate licence, sold separately, and often priced by monthly page views.

Nothing in the file stops you, which is precisely the problem — the conversion takes a second and the breach is invisible until somebody looks. The exception worth knowing is the SIL Open Font License, under which most free fonts are issued: it permits conversion, subsetting and self-hosting, subject to the font not being sold on its own and reserved names not being reused. Read the licence text in the download; it is usually one page.

The @font-face rule the WOFF2 needs

A font reaches a page through an @font-face rule that gives it a family name, points at the file, and declares which weight and style that particular file represents. The family name is local to your stylesheet and arbitrary — it does not have to match what the foundry called the typeface — and the weight and style declarations are what let the browser pick the right file when text is set bold or italic.

The common mistake is one rule for the whole family. The browser will not refuse to set bold; it will synthesise one by smearing the regular weight, and the result is visibly worse than the real bold sitting unused in the same directory. One rule per file, with honest weight and style values, is the whole discipline.

Subsetting saves more than the WOFF2 wrapper does

A retail TTF covers Latin, Latin Extended, Cyrillic, Greek, currency symbols and several hundred glyphs nobody on an English-language site will ever type, and every visitor downloads all of it. Stripping the font to the characters actually needed generally beats what the compression achieves on its own.

Do both, in that order: subset first, then convert. A 300 KB desktop font reduced to basic Latin and wrapped as WOFF2 routinely lands around 25 KB. Be careful with the subsetter, though — told to keep only the characters in use, it will happily discard the ligature and alternate tables as well, and the CSS switching those on then does nothing at all.

font-display, and the three seconds of invisible text

A browser told to use a font it has not finished downloading has to decide what to do with the text meanwhile. By default it waits — up to three seconds in most browsers — and shows nothing. That is the flash of invisible text, and it is the single most common reason a site with custom type feels slow on a phone.

One line fixes it: font-display: swap in the @font-face rule draws the text immediately in a fallback and reflows when the real font lands. The reflow is visible and it is far better than a blank page. font-display: optional goes further, skipping the font entirely for that visit if it is not ready almost at once, which removes the reflow at the cost of some visitors never seeing the typeface.

Serving WOFF2 alone, with no fallback stack

The habit of declaring WOFF2, then WOFF, then TTF, then EOT, then an SVG font in the same rule dates from around 2013 and no longer serves anybody. Every current browser reads WOFF2, including Safari and the mobile browsers, and has for years.

Declaring the one file is the current advice. A browser old enough to miss WOFF2 will fall back to a system font, which is an acceptable outcome and considerably better than maintaining five copies of every weight so that a browser nobody runs gets its preferred one. Fewer files also means fewer chances for one of them to be stale after a typeface update.

One file per weight, not one TTF for the whole family

Converting a family means converting each file: regular, italic, bold, bold italic, and any additional weights the design actually uses. Each becomes its own WOFF2 and its own @font-face rule under the same family name, and the browser downloads only the ones a page needs.

This is where the page-weight budget is usually lost. Four weights at 25 KB is 100 KB before anything else loads, and most designs use two. Convert what the stylesheet references rather than the whole folder — the unused weights cost nothing on disk and everything in the network waterfall if a rule quietly points at them.

Hinting, and what a TTF carries into the WOFF2

TrueType outlines carry hinting instructions — a small stack-based program per glyph telling the renderer how to distort the shape at small sizes so stems land on whole pixels. Those instructions are tables like any other and survive the wrap into WOFF2 intact.

Whether they earn their bytes is another question. High-density screens have enough pixels that the nudge is invisible, and macOS ignores hinting entirely. On a font with heavy hinting the instructions can be a noticeable fraction of the file, and a subsetter can be told to drop them — worth measuring rather than assuming, and worth keeping if your traffic is Windows-heavy and the type is set small.

Where the TTF goes while it is converted

This one runs on our server rather than in your browser, because the work is done by fontTools and there is no browser build of it. The file travels over an encrypted connection, is converted in an isolated environment, and the working directory is removed as soon as the job finishes.

The free limit is 25 MB per file. No ordinary typeface comes close — a full-featured TTF with a large character set is a few hundred kilobytes, and a CJK font, which is the one category that gets genuinely large, still sits well inside it.

How to turn a TTF into a WOFF2 for a website

  1. Drop the TTF onto this page, or click to choose one.
  2. Choose WOFF2 as the target and start the conversion.
  3. Download the WOFF2 and reference it from an @font-face rule.

TTF and WOFF2: the same outlines, two containers

TTF compared with WOFF2
TTFWOFF2
Full nameTrueType FontWeb Open Font Format 2
File extension.ttf.woff2
Media typefont/ttffont/woff2
First published19912018
Published byAppleW3C
SpecificationTrueType Reference ManualWOFF 2.0
LicensingOpen standardOpen standard
Standing todayCurrentCurrent
Opens in a browserEvery browserEvery browser
Considered insteadOTFWOFF

What survives

Nothing is discarded. TTF and WOFF2 both store their content losslessly, so the conversion is a change of packaging rather than a change of quality, and it can be repeated without accumulating damage.

Opening the result

FontForge reads both TTF and WOFF2, so there is a way to check the result against the original without a second tool.

What each format is for

The two are aimed at different work: TTF at typesetting, WOFF2 at the web. That is worth weighing before converting, because the reason one exists is usually the reason the other is awkward.

TTF is Apple's format, published in 1991. The specification is TrueType Reference Manual, and it is worth reading if the file has to outlive the tool that wrote it.

WOFF2 comes from W3C and dates from 2018, specified as WOFF 2.0. fonttools and FontForge all read it.

TTF was published in 1991 and WOFF2 in 2018. The older one is generally the safer file to hand to somebody; the newer one usually does the job in fewer bytes.

TTF to WOFF2: licences, sizes and browser support

How much smaller is the WOFF2 than the TTF?

Usually thirty to fifty per cent. WOFF2 is the same font tables compressed with Brotli, tuned for the way font data is laid out. Nothing about the letterforms changes — unwrap the WOFF2 and the TTF that went in comes back out.

Do I still need WOFF, EOT and SVG fallbacks?

No. Every current browser reads WOFF2, and the five-file @font-face stack that once accompanied every web font is archaeology. Anything that cannot read WOFF2 is old enough to fall back to a system font, which is a perfectly acceptable outcome.

Am I allowed to convert a TTF I bought and put it on my site?

Often not. A desktop licence covers installing the font on machines and making things with it; web use is normally a separate licence, sold separately and frequently priced by monthly page views. Fonts under the SIL Open Font License may be converted, subset and self-hosted freely.

Should I subset the font as well as converting it?

Yes, and the subsetting usually saves more. A retail font carries Latin, Latin Extended, Cyrillic, Greek and several hundred glyphs your page will never use. A 300 KB desktop font subset to basic Latin and converted to WOFF2 routinely lands around 25 KB.

Why does my text appear late or flash after the page loads?

The browser is waiting for the font before drawing anything — up to three seconds in most browsers. Add font-display: swap to the @font-face rule and the text is drawn immediately in a fallback, then reflows when the WOFF2 arrives.

Where does my TTF go during the conversion?

To our server, because fontTools is not a browser library. The file travels over an encrypted connection, is converted in an isolated environment and the working directory is deleted as soon as the job finishes. The free limit is 25 MB, which no font approaches.

More about these formats