Skip to main content
L
Loopaloo
Buy Us a Coffee
All ToolsImage ProcessingAudio ProcessingVideo ProcessingDocument & TextPDF ToolsCSV & Data AnalysisConverters & EncodersWeb ToolsMath & ScienceGames
Guides & BlogAboutContact
Buy Us a Coffee
L
Loopaloo

Free online tools for developers, designers, and content creators. Your files are processed in your browser and are never uploaded - no accounts required. A few network utilities (like What's My IP and Currency Converter) call public APIs to do their job and say so on their pages.

support@loopaloo.com

Tool Categories

  • Image Tools
  • Audio Tools
  • Video Tools
  • Document & Text
  • PDF Tools
  • CSV & Data
  • Converters
  • Web Tools
  • Math & Science
  • Games

Company

  • About Us
  • Contact
  • Blog
  • FAQ

Legal

  • Privacy Policy
  • Terms of Service
  • Disclaimer

Support

Buy Us a Coffee

© 2026 Loopaloo. All rights reserved. Built with privacy in mind.

Privacy|Terms|Disclaimer
  1. Home
  2. Converters & Encoders
  3. Font Converter
Add to favorites

Font Converter

Repackage a font between the bare TTF/OTF container, WOFF and WOFF2, with the result read back and checked before it is offered, plus a live preview and a correct @font-face rule

Runs locally in your browserMore converters & encodersJump to full guide

Initializing in your browser…

You might also like

Image Format Converter

Convert between the formats a browser can really write, then open the output and name the format its first bytes say it is. AVIF, BMP and GIF are disabled because a canvas returns a PNG for all three.

Unix Timestamp Converter

Convert between Unix timestamps and dates in any of 400+ time zones, in seconds, milliseconds, microseconds or nanoseconds

Audio Format Converter

Convert between MP3, WAV, OGG, AAC, M4A and FLAC with a bitrate, sample rate, channel count and bit depth that all reach the encoder, and a panel that reports what was actually written.

An example conversion

A desktop TTF needs to become the WOFF2 a site should serve. The numbers below are the ones the project's own end-to-end test prints for Liberation Sans, and every output is read back with fontTools before it is counted.

Input

sans.ttf, 139,512 bytes, 19 tables, 681 glyphs, TrueType outlines
What Font Converter produces

What each target actually produces

WOFF2   sans.woff2    72,024 bytes   51.6%   first four bytes wOF2   19 tables, 681 glyphs
WOFF    sans.woff     90,040 bytes   64.5%   first four bytes wOFF   19 tables, 681 glyphs
TTF     already this format, nothing to do
OTF     sans.otf     139,512 bytes  100.0%   the bytes are unchanged, and the page says so

Each file was then loaded as a real FontFace before the Download button appeared.

TTF and OTF are the same container: which extension is right is decided by the glyph outlines, so a TrueType font saved as .otf is a rename and is labelled one rather than counted as a conversion. A font with PostScript outlines is refused a .ttf outright, because writing cubic curves as quadratics moves the shapes and is a job for a font editor. WOFF compresses each table with zlib and WOFF2 uses Brotli plus a transform of the glyph tables, which is why WOFF2 is the smaller of the two. Nothing is offered for download until it has been parsed again from its own bytes, loaded as a FontFace, and (for a bare font) checked table by table against the checksums it carries.

What this converter does

Load a TTF, OTF, WOFF or WOFF2 and this tool tells you what it actually is: the container, the outline format, the table list, the glyph count and the extension the file should be carrying. Then it repackages it into any of the three containers, reads the result back from its own bytes, loads it as a real font, and only then offers the download. WOFF2 is produced and read with Google's own woff2 code compiled to WebAssembly, so the format everybody actually wants is a real conversion rather than a renamed file.

A container and an outline format are two different things

Almost every confusion about font conversion comes from treating TTF, OTF, WOFF and WOFF2 as four formats. They are not. There are two independent things going on.

The first is the CONTAINER. A bare font is an sfnt: a twelve-byte header, a directory of tables, and the tables. WOFF 1.0 wraps exactly that with each table compressed by zlib, per the W3C WOFF File Format 1.0 Recommendation. WOFF 2.0 wraps it with Brotli and additionally transforms the glyf and loca tables, which is why it is the smallest of the three. Those are three containers holding the same font.

The second is the OUTLINE FORMAT. The glyph shapes are either TrueType quadratic curves in a glyf table, or PostScript cubic curves in a CFF or CFF2 table. And this is the part that matters: .ttf and .otf are the SAME container, and which extension is correct is decided by the outlines, not by you. A font with TrueType curves is a .ttf whatever it is called. That is why this tool reports the outline format it found and names the correct extension for it, and why choosing OTF for a TrueType font is labelled on screen as a rename that changes nothing about the file, rather than being presented as a conversion. Choosing TTF for a font with CFF outlines is refused outright, with the reason: turning cubic curves into quadratics moves the outlines and is a job for a font editor such as fontTools, not for a repackager.

Measured on Liberation Sans, 139,512 bytes with 19 tables and 681 glyphs, the four targets give 72,024 bytes as WOFF2 (51.6 percent), 90,040 as WOFF (64.5 percent), nothing to do for TTF, and the same 139,512 bytes under a .otf name. Going the other way, a 22,704-byte WOFF2 unpacks to a 93,500-byte bare font and repackages as a 32,164-byte WOFF, which is the honest picture of what WOFF costs next to WOFF2 and is why WOFF is a fallback rather than a target.

The check at the end is the point of the tool. The converted bytes are parsed again from scratch, the container they turned out to be is compared with the one you asked for, the file is loaded as a real FontFace, and a bare font has every table checksum and its whole-file checkSumAdjustment verified against the OpenType rules. If any of that disagrees, nothing is offered. The reason for being strict is that a browser will not catch this for you: measured on 2026-09-03 across Chromium, Firefox and WebKit, all three happily load a TTF that has merely been renamed .woff and served as font/woff with format('woff'), because the format hint is advisory and every engine sniffs the bytes. A renamed file therefore looks like it works, right up until it reaches a build pipeline, a font validator or a CDN that expects the format the name claims, and meanwhile it is twice the size of the WOFF it was supposed to be.

Everything runs in the page. The font is never uploaded, which matters when it is an unreleased brand face under licence.

How to use

  1. 1Upload a TTF, OTF, WOFF or WOFF2. The panel reports the container, the outlines and the extension the file should have.
  2. 2Pick an output format. Each button says in advance what it will do: converted, renamed, already this, or refused with the reason.
  3. 3Preview the font at any size with your own text, to confirm it is the face you meant.
  4. 4Convert. The result is read back, loaded as a font and checked before the Download button appears.
  5. 5Copy the @font-face rule, which carries the right format() hint for what you actually produced.

Key features

  • Real WOFF 1.0 encoding and decoding, each table zlib compressed per the W3C Recommendation
  • Real WOFF 2.0 both ways, using Google's woff2 code compiled to WebAssembly, loaded only when a WOFF2 is involved
  • The container read from the bytes, never from the file name
  • The outline format reported, and the correct extension named for it
  • Every output parsed again and loaded as a FontFace before it can be downloaded
  • Table checksums and the whole-file checkSumAdjustment verified for bare font output
  • An outline-format change refused by name rather than faked with a rename
  • The before and after size shown with the ratio, because size is the reason web font containers exist
  • Font metadata from opentype.js: family, style, weight, glyph count and units per em
  • A live preview at any size from 8 to 120 px, with six pangrams or your own text
  • An @font-face rule with the correct format() keyword for the format actually produced
  • Everything in your browser; no font is uploaded anywhere

Where this fits

  • Getting a desktop font onto a website

    A foundry ships a TTF or OTF for desktop use. WOFF2 is what a site should serve, and here that is a real Brotli conversion at around half the size rather than a renamed file.

  • Finding out what a file actually is

    A font that arrived named .woff may not be one. The container, the outline format and the table list are read from the bytes, so a mislabelled file is obvious immediately.

  • Unpacking a web font for desktop use

    A WOFF or WOFF2 pulled off a site can be unwrapped back to the bare font it holds, with the extension named from its outlines rather than guessed.

  • Adding a WOFF fallback

    A WOFF made from the same source gives older browsers something to load. The size comparison on screen shows exactly what that fallback costs against the WOFF2.

Frequently asked questions

Which conversions actually work?

All of them between the three containers: bare font to WOFF and WOFF2, WOFF to bare and to WOFF2, WOFF2 to bare and to WOFF. The one thing refused is changing the outline format, which is what TTF to OTF would mean for a font with PostScript curves. Saving a TrueType font under a .otf name is allowed and is labelled a rename, because that is all it is.

Why will it not convert my OTF to a TTF?

Because that is not a container change. A .otf normally holds PostScript cubic curves and a .ttf holds TrueType quadratics, and converting between them approximates every curve with a different kind of curve. The result is a different set of outlines, and doing it well needs a font editor such as fontTools' otf2ttf. Renaming the file instead would be dishonest, so the tool says so rather than doing it.

How much smaller is WOFF2?

On Liberation Sans, 139,512 bytes becomes 72,024, which is 51.6 percent. On the CFF-outline STIXGeneral, 369,156 becomes 212,864, which is 57.7 percent. WOFF from the same fonts is 64.5 and 69.7 percent, so WOFF2 wins by a clear margin on both.

Does it support EOT?

No. EOT was an Internet Explorer format and is not supported as input or output. WOFF2 with WOFF as a fallback covers every browser still in use.

How do I know the file it gives me is really that format?

Because it is read back before you get it. The output is parsed again from its own bytes, the container is compared with the one you asked for, it is loaded as a real FontFace, and a bare font has every table checksum and its whole-file checkSumAdjustment verified. If any of that fails, no download is offered. This matters because browsers will not catch it for you: Chromium, Firefox and WebKit all load a TTF that has merely been renamed .woff.

Is my font uploaded anywhere?

No. The parsing, the zlib compression and the WebAssembly WOFF2 coder all run in your browser, so a font under licence never leaves your machine.

Private by design

Conversions run on your device in JavaScript. The values you enter are never sent over the network.