Convert OTF to WOFF in your browser

WOFF is the older web font wrapper and it carries an OpenType font whole, PostScript outlines and all. Most people asking for one have hit a theme or a plugin that will take nothing else, so here it is, with a word on when WOFF2 is the better file.

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 WOFF

01
Drop the .otf in

The font is read and rewrapped here in the tab. A licensed typeface never leaves your machine, because this site has no endpoint to send one to.

02
Leave the controls where they are

That is the straight conversion, and on the usual PostScript .otf it is the only run that will finish: the settings here rewrite glyph tables, and CFF outlines pass through whole instead.

03
Download the .woff

The result panel names the outline flavour it found, which tells you whether you are holding a PostScript font or a TrueType one under an .otf name.

04
List it second in @font-face

If you control the CSS, put a WOFF2 source first and this one after it. Browsers take the first format they recognise, so the older file is only fetched by the browsers that need it.

What a WOFF does with an OpenType font

WOFF is a wrapper rather than a font format. It takes the sfnt tables out of your .otf, compresses each one on its own with zlib, stores any table that does not compress as it stands, and writes the lot after a 44 byte header. It never looks at what the tables contain, which is exactly why this conversion is safe on a PostScript font: the CFF table that holds the charstrings goes in and comes out identical, and unwrapping the WOFF gives back the OpenType font you started with.

That is worth contrasting with OTF to TTF, which is the conversion people usually try first and the one that cannot be done here. A TrueType file has nowhere to put a charstring, so turning a PostScript font into one means redrawing every cubic curve as a quadratic approximation and hinting the result again. The web font containers avoid the question entirely by carrying whatever they are given, which is why the answer to "how do I get my OTF onto a website" is a wrapper rather than an outline conversion.

On size, WOFF is a modest win. Zlib on a table at a time is a much weaker deal than brotli over the whole font: expect roughly 30 to 50% off a small PostScript .otf, against 40 to 60% for the same file as WOFF2, and far more off a large family in both formats. Our test of a 50KB text face gave 33KB as WOFF and 29KB as WOFF2, and a 573KB PostScript font gave 93KB against 73KB.

The reason to write one anyway is almost never browser support. WOFF covers IE9 and Android 4.4, which is a slice of traffic most sites can no longer measure, but plenty of software still validates font uploads against a list of extensions written when that mattered: theme marketplaces, older CMS font managers, design tool exports, internal build steps nobody maintains. When a form field is what is refusing your font, the argument about compression is not one you can have with it.

OTF to WOFF FAQ

Can a PostScript OTF become a WOFF?

Yes. WOFF compresses each sfnt table separately and never inspects what is in them, so a CFF table crosses over untouched and the font renders in every browser that supports WOFF at all. This is the difference between the web containers and the OTF to TTF conversion, which has to refuse a PostScript font because TrueType has nowhere to put its outlines.

Should I use WOFF or WOFF2 for an OpenType font?

WOFF2, unless something in your stack refuses it. It carries the same CFF outlines, has the same browser support story outside IE11 and Android 4, and comes out roughly a fifth smaller because it compresses the whole font with brotli rather than each table with zlib. Write a WOFF when an uploader will not take the newer extension, or as a second source in the same @font-face rule.

Is OTF to WOFF lossless?

Yes with the controls as they arrive. Every table goes in and comes back out the same, so unwrapping the WOFF returns the OpenType font you dropped in. It only becomes lossy if you ask: narrowing the character range or dropping hinting on a TrueType-outline font removes data on purpose, and the result panel says what went.

Why was my font refused when I changed a setting?

Because it holds CFF PostScript outlines, and the range and metadata controls rewrite glyph and name tables. Doing that safely to a CFF font needs a charstring interpreter this tool does not have, and a half-rewritten CFF font renders nothing, so it stops instead. Leave the controls alone and the conversion runs. For a subsetted CFF web font, fonttools on the command line is the right tool.

Do the font features survive the conversion?

Yes. Kerning, ligatures, small caps, oldstyle figures and stylistic sets live in the GPOS and GSUB tables, and those cross over like every other table when the range is on All. Whether a browser uses them is a CSS question, font-feature-settings and font-variant, rather than anything to do with the container.

Am I allowed to put a font I bought on a website?

Read the licence, because desktop and webfont rights are usually sold separately and changing the wrapper changes nothing about which you hold. A desktop licence typically covers installing the font and setting type with it, not serving it to visitors. Foundries sell webfont licences for that, and open licences such as the SIL OFL already permit it. The licence records are never stripped from the font here.

Are my OTF files uploaded to convert them?

No. The OTF is decoded and the WOFF 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.