Cookies for analytics and advertising
We use cookies for analytics and advertising, both sent to Google. Refusing changes nothing you can see.Read the privacy page
Converting OTF to WOFF produces the file a brief or a platform specification asks for: the same PostScript outlines, wrapped in the 2009 web container and compressed with zlib. The conversion is the easy half of the job. The harder half is what belongs in the package around it, and whether the licence lets you hand the font over at all.
Up to 100 files at once. Mixed formats are fine.
They convert one after another and download together as a ZIP.
OTF to WOFF
Specification sheets outlive the reasons they were written. A brand guidelines document from 2015, a platform’s asset requirements page, or a developer’s checklist copied from a tutorial will list .woff because that was the sensible answer when it was written, and nobody has revisited it since.
Arguing is rarely worth the hour. Produce the WOFF, produce the WOFF2 alongside it, and note in the handover that the second is the one browsers will actually use. That satisfies the specification and leaves the recipient better off than the specification would have.
A container swap and nothing else. The CFF table holding the cubic outlines, the character map, the metrics, the kerning and every OpenType feature the designer defined are copied verbatim and compressed. No glyph is redrawn, no feature is dropped, and the file can be unwrapped later to recover the OTF.
That last point has a consequence worth knowing before a handover: a WOFF is not a protective wrapper. It is a compressed copy of the font, and anyone who receives it can convert it back to an installable desktop file in seconds. Whatever restraint applies to the OTF applies to the WOFF.
A good package is small and unambiguous: one file per weight and style, named so the weight is legible without opening anything, and a text file or snippet containing the @font-face rules that go with them. The developer should not have to guess which file is the semibold italic.
Include only the weights the design uses. Handing over a folder of eighteen cuts because the family has eighteen is how a site ends up loading four of them by accident, and it makes the licence exposure larger than the project needs it to be.
Most commercial font licences name the licensee and do not allow transfer. A studio that bought a desktop licence and hands the converted files to a client has generally not made the client a licensee — it has made two parties using one licence, and the exposure usually lands on whoever signed.
The workable routes are the ordinary ones: the client buys the web licence in their own name and you produce or receive the files, or the project uses an open-licensed family. Fonts under the SIL Open Font License may be converted, subset, redistributed and self-hosted, provided they are not sold on their own and reserved names are not reused, which is why so much client work quietly settles on them.
The browser picks a file using the weight and style declared in the @font-face rule, not the filename. But the filename is what a human reads three months later, so the two should agree — brand-600-italic.woff beside a rule declaring font-weight 600 and font-style italic leaves nothing to interpret.
The failure this prevents is synthetic type. A family delivered with only a regular file, then used in bold, produces a browser-smeared bold that is visibly worse than the real cut. It is the most common defect in a delivered font package and it is entirely a packaging mistake rather than a conversion one.
WOFF2 is read by every current browser and is around thirty per cent smaller than the WOFF of the same font. Whatever the specification says, that is the file the site should serve, and producing it costs one more conversion.
Do not stack them in the same @font-face rule as a fallback pair. The browser takes the first source it understands, which will always be the WOFF2, so the WOFF becomes a file nobody downloads and nobody updates — a stale copy of the typeface sitting on the server waiting for a tool to reorder the rule. Deliver both, and say which is for use.
A single-weight OTF with a full Latin Extended character set commonly starts somewhere in the low hundreds of kilobytes. Wrapping it as WOFF removes a useful fraction of that; wrapping it as WOFF2 removes roughly a third again.
Neither figure is where the saving actually is. Subsetting the font to the characters the site will set beats both by a wide margin — a 300 KB desktop font reduced to basic Latin and converted to WOFF2 routinely lands around 25 KB. If page weight is in the brief, subsetting belongs in the deliverable, and it should be done before the conversion rather than after.
This is the trap that catches studios specifically. Your machine has the OTF installed, so when a browser cannot load the WOFF it falls back to the locally installed family of the same name and the page looks perfect. The client, who has no such font, sees Arial.
A private browsing window does not help — the font is installed at the operating system level, not in the browser. Check on a second machine, on a phone, or by temporarily giving the @font-face family a name no installed font uses. Ten seconds of that removes the single most embarrassing way a font handover fails.
Drop the whole folder rather than one file at a time. Up to 100 fonts convert in a single pass and come back as a ZIP with names preserved, which is the shape a delivery wants anyway. Repeat once for WOFF2 and the package is done.
The work runs on our server, because fontTools has no browser build. Each file travels over an encrypted connection, is converted in an isolated environment, and the working directory is removed when the job finishes. The free allowance is 100 server conversions a day with a 25 MB ceiling per file — a full family and its second format fit inside a fraction of that.
| OTF | WOFF | |
|---|---|---|
| Full name | OpenType Font | Web Open Font Format |
| File extension | .otf | .woff |
| Media type | font/otf | font/woff |
| First published | 1996 | 2009 |
| Published by | Adobe | W3C |
| Specification | ISO/IEC 14496-22 | WOFF 1.0 |
| Licensing | Open standard | Open standard |
| Standing today | Current | Legacy, still read everywhere |
| Opens in a browser | Every browser | Every browser |
| Considered instead | TTF, WOFF2 | WOFF2, TTF |
Nothing is discarded. OTF and WOFF 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.
FontForge reads both OTF and WOFF, so there is a way to check the result against the original without a second tool.
The two are aimed at different work: OTF at typesetting and print, WOFF at the web. That is worth weighing before converting, because the reason one exists is usually the reason the other is awkward.
OTF is Adobe's format, published in 1996. The specification is ISO/IEC 14496-22, and it is worth reading if the file has to outlive the tool that wrote it.
WOFF comes from W3C and dates from 2009, specified as WOFF 1.0. FontForge and fonttools all read it.
Yes — this conversion needs software that cannot run in a browser, so the file is uploaded over an encrypted connection. It is deleted as soon as the job finishes, and the result is sent straight back to you without being stored. The work is done by fontTools, the font manipulation library used to build web fonts.
One WOFF2 per weight and style actually used, the @font-face rules that reference them, and the licence document. Add WOFF only if the recipient’s platform or specification demands it — no current browser needs it.
Usually not without their own licence. Most desktop and web licences name the licensee and do not permit transfer, so the correct handover is often files the client has bought, or an open-licensed family. This is a contract question, not a technical one.
No. The cubic PostScript outlines and every feature table are copied into a compressed container without inspection. A WOFF made from an OTF renders exactly what the OTF renders.
Smaller, and by less than a WOFF2 would be. WOFF uses zlib; WOFF2 uses Brotli with font-specific preprocessing and lands roughly thirty per cent below WOFF on the same source file.
Because the font is installed on yours. A browser falls back to a locally installed family with the same name, so a broken @font-face path is invisible to the person who owns the desktop font. Test on a machine that does not have it.
Yes — up to 100 files per batch, returned as a ZIP with the filenames preserved, which matches how a family is normally delivered.