WOFF2 to OTF
WOFF2 compresses a desktop font with Brotli, and decoding it gives that font back. You get a genuine OpenType .otf only when the font inside has CFF (PostScript) outlines, and in that case the "CFF " table comes back byte for byte, because WOFF2 stores CFF data without transforming it. Most WOFF2 files on the web wrap TrueType (glyf) fonts instead. For those, this page gives you the correct .ttf with a notice rather than an .otf name on TrueType outlines. Decoding runs locally with the reference Google WOFF2 decoder, and the result is checked against the source before you can download it.
Drop WOFF2 files or folders here, or choose them.
Everything runs in this tab. Detecting device capabilities…
Files are read and processed in this browser tab. Nothing is uploaded — the page’s Content-Security-Policy blocks connections to any other origin.
CFF fonts become .otf; TrueType fonts stay TrueType
A WOFF2 header records the flavour of the font it was made from. "OTTO" means CFF outlines: decoding returns an OpenType/CFF font and the download is an .otf. 0x00010000 means TrueType: decoding rebuilds the "glyf" and "loca" tables from WOFF2's reversible transform and the download is a .ttf.
There is no step in between that could turn TrueType outlines into CFF. That would mean redrawing every glyph as PostScript charstrings, which Glyph Batch does not do (the TTF to OTF page explains why), and a file renamed to .otf would still be TrueType inside. Both extensions install the same way on every desktop operating system.
When you need the .otf
You have a self-hosted web font in WOFF2 and need an installable copy for a mock-up, or a print or design workflow that expects OpenType/CFF fonts.
You want to check what a WOFF2 really contains (its outline model, family name, licence text and embedding permissions) before you rely on it. The font inspector reads WOFF2 directly if you do not need a file at all.
Licences still apply after decoding
A web-font licence usually covers serving the font to browsers, not installing it on a desktop. Decoding a WOFF2 is a technical operation and grants no extra rights. The licensing page explains what the embedding bits and licence strings in the file are telling you.
What survives this conversion
Every row below is checked automatically against your own file after conversion. If any check fails the output is discarded rather than offered for download.
| Property | Outcome |
|---|---|
| Output file type partial | A WOFF2 holding CFF (PostScript) outlines comes out as a real .otf. One holding TrueType (glyf) outlines comes out as .ttf, with a notice saying why. A TrueType font is never renamed to .otf. |
| Glyph outlines kept | Byte-identical. The outline tables are copied, not redrawn. |
| Character map (cmap) kept | Every code point keeps the same glyph id. Verified after every conversion. |
| Family, version, copyright and licence strings kept | Preserved exactly and re-checked against the input. |
| OS/2 embedding permissions (fsType) kept | Preserved. Glyph Batch never clears a vendor restriction bit. |
| OpenType layout (GSUB, GPOS, GDEF, kern) kept | Preserved unchanged, so ligatures and kerning behave identically. |
| Outline hinting (PostScript hints in CFF, or TrueType bytecode) kept | Preserved unchanged. CFF outlines are not converted to TrueType, so their hints stay with them. |
| Variable font tables (fvar, gvar, avar, HVAR, STAT) kept | Preserved unchanged; the output stays variable. |
| Colour tables (COLR, CPAL, sbix, CBDT, SVG) kept | Preserved unchanged. |
| DSIG digital signature partial | Kept in the file but no longer valid: the signature covers the original byte layout, and the decoded sfnt is a different layout. |
When it does not work
- The download is a .ttf, and the row shows "ttf not otf".
Why: The WOFF2 was built from a TrueType (glyf) font. Decoding returns TrueType outlines, so the honest extension is .ttf.
Fix: Use the .ttf. If you specifically need CFF outlines, get the OpenType/CFF release of the font from its publisher; renaming the file would not produce one.
- The Details panel says a WOFF container was unwrapped, not WOFF2.
Why: The source is a WOFF 1.0 file with a .woff2 name. Glyph Batch reads the container signature rather than trusting the extension, so it was still unwrapped correctly.
Fix: Nothing to fix in the result. Rename the source to .woff so servers send the right MIME type and your @font-face format() hint matches the file.
- "WOFF2 decoding failed" on a file that renders in a browser.
Why: Browsers tolerate some malformed WOFF2 files that the reference decoder refuses, typically a table length in the header that disagrees with the data.
Fix: The file is damaged even though it renders. Rebuild the WOFF2 from the original font.
- The decoded font is missing characters you expected.
Why: Many WOFF2 files are subsets that only cover one script or the characters a single site uses.
Fix: Check coverage in the glyph coverage tool. Decoding cannot restore glyphs that were removed before the WOFF2 was made.
Related
WOFF2 to TTF
Decode WOFF2 web fonts back to installable TTF/OTF in your browser. Uses the reference Google WOFF2 decoder, preserves every table, and verifies the result. Nothing is uploaded.
Open: WOFF2 to TTFWOFF to OTF
Unwrap WOFF 1.0 web fonts to OpenType .otf in your browser. CFF fonts come out as a real .otf; TrueType fonts come out as .ttf and are never mislabelled. Nothing is uploaded.
Open: WOFF to OTFGlyph coverage
See exactly which characters a font covers, grouped by Unicode block. Paste text to find missing characters before they render as tofu, and export a CSS unicode-range.
Open: Glyph coverageLicensing
What OS/2 fsType embedding bits mean, why converting a font grants you nothing, and how to check whether you may subset or web-embed a font you own.
Open: Licensing