Convert OTF to WOFF2 for your site

WOFF2 wraps an OpenType font whole, PostScript outlines included, so this is the conversion that works on the .otf files that cannot become a .ttf. Nothing is redrawn and nothing is uploaded.

OTF
No OTF selected
Drop a file to start
Drop OTF files here

or browse your device. Everything is processed on this device

No OTF to hand?

How to convert an OTF to WOFF2

01
Drop the .otf in

The table directory is read and the font is repacked in this tab. A typeface you have paid for never leaves your machine, because there is nowhere here to send it.

02
Leave the settings alone for a straight conversion

On the usual PostScript .otf that is also the only thing that will run: the controls here rewrite glyph tables, and CFF outlines are passed through whole rather than half rewritten.

03
Download the .woff2

The result panel names the outline flavour it found, so you can see whether you are holding a PostScript font or a TrueType one wearing an .otf name.

04
Reference it with format("woff2")

The format hint in @font-face names the wrapper, not the outlines, so it is woff2 either way. Add font-display: swap and preload the file if it draws your body copy.

Why OTF to WOFF2 works when OTF to TTF does not

OTF and TTF name the same container, an sfnt, and the difference that matters is which table the letters live in. A font drawing from a glyf table uses quadratic curves and is a TrueType font. A font drawing from a CFF table uses cubic PostScript charstrings and is not. Most fonts sold by foundries are the second kind, which is why the OTF to TTF page refuses them: there is no way to put a charstring in a TrueType file, and converting means redrawing every curve as an approximation and hinting the result again.

WOFF2 sidesteps the whole question. It is a wrapper: it takes the sfnt table directory as it stands, compresses the lot with brotli and writes a small header. The format also allows two rearrangements that make TrueType data compress better, and a PostScript font has nothing for either of them to work on. A CFF table goes in and comes out identical, so the conversion is lossless in the strict sense and reversible. Browsers have read CFF web fonts for as long as they have read WOFF2, so there is no compatibility argument for going anywhere near TrueType outlines.

What you gain is transfer size. A PostScript .otf typically comes down 40 to 60%, and a large family with a big character set considerably more: one 573KB PostScript font we tested packs to 73KB, because most of what it holds is repetitive charstring data that brotli eats. That is a one time cost at build rather than work your server does per request, which is the other advantage over gzip on the wire.

A footnote for anyone comparing byte counts with fonttools. This site's packer does not apply the optional WOFF2 transform to the glyph table, which costs 4 to 20% on a TrueType font. A PostScript font has no glyph table to transform, so on the fonts this page usually sees there is nothing to lose: measured against Google's own encoder on the same CFF files, our output came out within a tenth of a per cent, once slightly smaller.

OTF to WOFF2 FAQ

Can an OTF with PostScript outlines become a WOFF2?

Yes, and that is the point of this page. WOFF2 wraps whatever sfnt you give it, so a CFF table crosses over untouched and the font renders in every browser exactly as it does on your desktop. This is the conversion that works on the .otf files the OTF to TTF page has to refuse, and if your goal is a font on a website it was always the one you wanted.

Is OTF to WOFF2 lossless?

Yes with the settings as they arrive. The tables that go in are the tables that come out, brotli compressed, so unwrapping the WOFF2 gives back the OpenType font you dropped in. It becomes lossy only if you narrow the character range or drop hinting, which are options rather than steps, and the result panel names anything that went.

Why was my font refused when I narrowed the character range?

Because it holds CFF PostScript outlines and this tool subsets glyf outlines. Cutting a CFF font safely needs a charstring interpreter, and a half-subsetted CFF font is one that renders nothing at all, so it stops rather than writing you a broken file. Leave the range on All and the conversion runs. If you need a subsetted CFF web font, fonttools does it properly on the command line.

Do I need a TTF or a WOFF fallback as well?

A TTF, no: nothing that reads WOFF2 needs one, and a browser too old for WOFF2 is too old for most of what your site does. A WOFF is worth adding only if your traffic includes IE11 or Android 4, and it goes in the same @font-face rule as a second source so modern browsers never fetch it. The OTF to WOFF page here writes that file from the same font.

Does the WOFF2 keep kerning, ligatures and small caps?

Yes, with the range on All. GPOS, GSUB and every other OpenType layout table are carried across as they are, so kerning pairs, ligatures, small caps and stylistic sets all survive: the features a foundry sold you are the features your site gets. Narrow the range on a TrueType-outline font and the layout tables are dropped rather than left pointing at renumbered glyphs.

Does my font licence let me put it on a website?

Check the licence, because desktop and webfont rights are usually sold separately and converting the file changes nothing about which you hold. A desktop licence commonly permits installing and setting type, not serving the font to visitors. Foundries sell webfont licences for exactly this, and open licences such as the SIL OFL already cover it. The licence description and licence URL stay in the font here whatever the metadata switch says.

Are my OTF files uploaded to convert them?

No. The OTF is decoded and the WOFF2 is written by your own browser, in this tab. There is no upload endpoint in the site for a file to go to, which you can check in your network tools: convert something and watch that no request carries it. Disconnect from the network after the page loads and it still works.

Drop more files

Same format joins the queue. Anything else re-routes to its own tool.