WOFF2 is the second web font format, compressed with Brotli. OTF is an OpenType font with PostScript outlines. fontTools sits between the two, and this page says exactly what happens to a WOFF2 file on the way to becoming an OTF one.
What runs when a WOFF2 file becomes OTF
fontTools in our own Python, on a machine we rent and watch. Your WOFF2 file is uploaded once, fontTools runs once, the OTF comes back, and neither file is kept. WOFF2 to OTF is one of the 3649 pairs that engine was probed on with a real file, which is why it has a page here and why the pairs the probe could not prove do not.
What survives from the WOFF2 into the OTF
Every glyph, unchanged. This pair does not redraw anything: the outlines that leave the WOFF2 arrive in the OTF point for point, so the letters render exactly as the designer drew them. The engine counts them on the way out and refuses the file if the count moved. Measured on this pair: the probe file came back at 82 220 bytes in 0.1 s.
Hinting, kerning pairs and OpenType features: the tables that tell a renderer how to space and substitute glyphs. This pair moves the container around them rather than through them.
A font you can install. A WOFF2 is made to be fetched by a browser, not double-clicked; the OTF is the form your operating system, your word processor and your design tool expect.
What WOFF2 to OTF costs you
Nothing about the WOFF2 itself, and that is worth saying plainly rather than inventing a caveat. What this pair changes is how the font is packaged, never what it draws.
The size advantage. A WOFF2 was compressed for the network; the OTF is not, so expect the file to grow by two to three times. Measured on DejaVu Sans: 258 392 bytes of WOFF2 unpack to 759 572 bytes.
Any licence to use it. A font served on a web page is often licensed for that page and nothing else. Converting it does not change what you are allowed to do with it, and this page is not going to pretend otherwise.
Where WOFF2 and OTF files come from
WOFF2. A W3C recommendation from 2018 and what every browser prefers today. Same idea as WOFF, better compression: Brotli instead of zlib, plus a transform that rewrites the glyph table before compressing. Measured on DejaVu Sans: 759 720 bytes become 258 392, a third of the original.
OTF. Type foundries write it, and so does anything descended from Adobe tools. Its outlines are cubic curves in a CFF table, not quadratic ones in a glyf table, and that difference is not cosmetic: it is why an OTF cannot simply be renamed to TTF.
If a model is going to read the OTF
Structure is what survives from the WOFF2 file, and structure is what a model needs. WOFF2 in, OTF out, with the heading tree intact instead of flattened into one long paragraph.
WOFF2 to OTF, measured rather than promised
Running WOFF2 to OTF against the real engine with a real file, fontTools wrote 82,220 bytes of OTF in 0.1 seconds, machine otherwise idle. That is one WOFF2 file on one day and not an average, which is why the number is given together with the file that produced it.
The WOFF2 to OTF verdict was reached by reading the font back with fontTools and checking what kind of outlines it holds, meaning the output was read back and recognised. Which check was used matters, because they do not all prove the same thing, and a status code of 200 proves nothing whatsoever about whether the OTF file has anything inside it.
Other ways into OTF, and what they measured
Among the published routes into OTF, WOFF2 is the second largest output of the 2 measured. The witness files differ, so this ranks the probe run and not your document.
WOFF to OTF: 82,220 bytes in 0.1 seconds.
What we will not pretend about WOFF2 to OTF
A WOFF2 file over 25 MB is refused before the upload finishes rather than after it, so you do not wait for a rejection.
A WOFF2 to OTF run that passes 50 seconds is killed, and the fontTools process is killed with it. A run left behind would sit on one of the machine's two cores until somebody noticed.
A WOFF2 wraps either kind of outline, so this pair works for some files and not others. Most web fonts wrap TrueType, which is why WOFF2 to TTF usually works and WOFF2 to OTF usually does not. The refusal is immediate, costs nothing, and names the target that would have worked for your file.
One WOFF2 file at a time, chosen in the browser. There is nothing else to set up and nothing else on offer.
WOFF2 to OTF: what people ask
What actually converts my WOFF2 file to OTF?
fontTools does it, in our own Python, on a machine we rent and watch. Not a browser trick and not somebody else service: the WOFF2 file is uploaded once, fontTools runs once, the OTF comes back, and neither file is kept afterwards.
How long does WOFF2 to OTF take?
On the file the probe used, fontTools took 0.1 seconds and wrote 82,220 bytes of OTF. That is one real measurement on one real WOFF2 file, not an average and not a promise about yours: a larger WOFF2 takes longer, and past 50 seconds the run is stopped.
What do I lose going from WOFF2 to OTF?
The one to know about first: Nothing about the WOFF2 itself, and that is worth saying plainly rather than inventing a caveat. What this pair changes is how the font is packaged, never what it draws.
Will the OTF look different from the WOFF2?
No. Not slightly, not in edge cases: the outlines are copied rather than redrawn, so every glyph has the same coordinates it had before. The engine counts the glyphs on the way out and refuses the file if the count moved, which is the one way this could go wrong silently.
Am I allowed to do this?
That depends on the font, and this tool cannot tell you. A font served on a web page is often licensed for that page and nothing else; converting it does not change what the licence permits. The conversion is technical, the permission is not.
Why did the file get bigger?
Because a WOFF2 is compressed for the network and an OTF is not. Measured: 258 392 bytes of WOFF2 unpack to 759 572 bytes. Nothing was added; the compression was removed.
Is WOFF2 to OTF free?
There is a free allowance every month, and one WOFF2 to OTF conversion costs half a credit against it. When the allowance runs out the tool says so and stops, rather than quietly handing you a worse OTF.