Free online TTF converter. Convert TTF to WOFF2, WOFF, OTF, EOT and more online — no limits, no watermark.
.ttf files from your device. Batch is supported — drop in a whole family (Regular, Bold, Italic, Bold Italic, plus weights like Light and Medium) and convert them all in one pass.@font-face loadsGoing the other way, WOFF to TTF and OTF to TTF turn web or OpenType files back into an installable desktop TrueType font.
TTF (TrueType Font) is the format Apple developed in the late 1980s and shipped in 1991, with Microsoft adopting it shortly after — it stores glyph outlines as quadratic Bézier curves inside an sfnt table structure. It is the universal desktop font: what you install in Windows, macOS, and Linux for use in Word, Photoshop, and the operating system's own menus. That ubiquity is exactly why most font downloads arrive as TTF, and why you rarely need to leave it for local design work.
The trouble starts when a TTF has to do a job it was not built for. The most common reasons to convert:
@font-face path. Wrapping the same glyph data in WOFF (zlib) or WOFF2 (Brotli) shrinks the download substantially and matches what src: ... format("woff2") expects in CSS. WOFF2 is the default for new sites; WOFF is the fallback tier for the small slice of legacy traffic.src chain.Cache-Control header — which matters more since browser cache partitioning rolled out in 2020.| Format | Container / compression | Typical size vs TTF | Native browser support (caniuse) | Best for |
|---|---|---|---|---|
| TTF | sfnt, no compression | 100% (baseline) | Inconsistent via @font-face; not the documented path |
Desktop install — Word, Photoshop, the OS itself |
| OTF | sfnt, no compression (often CFF outlines) | ~100% | Same as TTF — desktop-oriented | Design apps; foundry distribution; advanced typography |
| WOFF | sfnt + zlib + metadata block | ~50% | ~98% global; covers IE 9+ | Web @font-face; legacy-browser fallback tier |
| WOFF2 | sfnt + Brotli + metadata block | ~30% | ~96% global; missing only IE and Opera Mini | Default web font for new sites — fastest load |
| EOT | sfnt + optional compression/subsetting | Varies | Internet Explorer 6–11 only | Legacy IE intranets and kiosks |
WOFF2 lands roughly 24% smaller than WOFF for TrueType-flavored fonts (median 23.94% on the Google Fonts corpus, per the W3C WOFF 2.0 Evaluation Report), which is why current guidance is to ship WOFF2 first and add WOFF only as a fallback.
format() Keyword and Media Type Each Target Needs| Target | CSS format() keyword |
Registered media type | Where it belongs |
|---|---|---|---|
| WOFF2 | format("woff2") |
font/woff2 |
First entry in every modern @font-face src list |
| WOFF | format("woff") |
font/woff |
Second entry, only if analytics still show pre-2017 browsers |
| TTF | format("truetype") |
font/ttf |
Desktop install; a last-resort @font-face fallback |
| OTF | format("opentype") |
font/otf |
Desktop install and design-app workflows |
| EOT | format("embedded-opentype") |
application/vnd.ms-fontobject |
Internet Explorer 6–11 only |
The font/* media types come from RFC 8081, which registered the font top-level type in 2017 (it also defines font/sfnt and font/collection for .ttc collections). Browsers do not strictly enforce the header for @font-face, but serving the registered type is what CDN, cache, and compression rules key off — and Brotli-compressing an already-Brotli-compressed WOFF2 at the server is wasted work.
WOFF2. It wraps the same glyph data in Brotli compression, is a W3C Recommendation, and has ~96% global browser support per caniuse — every browser shipped since 2017 except Internet Explorer and Opera Mini. Declare it first in your CSS and add a WOFF tier only if your analytics still show legacy-browser traffic: src: url("font.woff2") format("woff2"), url("font.woff") format("woff"). The browser picks the first format it understands. For desktop use in design apps, keep the TTF or convert to OTF instead — neither web format installs as a system font.
No. Every common target here — WOFF, WOFF2, OTF, EOT — preserves the full sfnt table set: the glyf outlines, cmap character map, hmtx/kern spacing, and the OpenType GSUB/GPOS feature tables (ligatures, small caps, kerning). WOFF and WOFF2 are lossless wrappers — the compression is reversed on decode, so the font renders byte-for-byte identical to the source. Variable-font axes (fvar, gvar, STAT) carry through intact as well.
No, and that is by design. The WOFF specifications require decoded font data to stay scoped to the document that loaded it — it cannot be installed system-wide. That is what lets foundries license fonts for web use without users redistributing the underlying outlines. If you need a desktop install, keep the original TTF, or convert a web font back with WOFF to TTF.
Both are sfnt-based and both install on the desktop, so for most users they are interchangeable. The technical difference is the outline type: TTF uses quadratic Bézier curves, while OTF usually carries CFF (PostScript) cubic outlines and tends to expose richer OpenType typographic features. Convert TTF to OTF only when a specific design app or foundry workflow expects the OpenType container — there is no rendering benefit on the web, where you should ship WOFF2 regardless of the desktop flavor.
For most modern sites, WOFF2 alone is enough — it covers ~96% of global traffic. Add a WOFF fallback only if your audience includes Internet Explorer or other pre-2017 browsers (some enterprise intranets and public-sector kiosks). EOT is needed only for Internet Explorer 6–11 specifically; if you have no IE traffic, skip both extra tiers and serve one WOFF2 file per weight and style.
No. TTF conversion here runs entirely in your browser using opentype.js — your font file never leaves your device, there is no account requirement, no watermark, and no file-count cap. In our testing, a 168 KB Roboto Regular TTF converted to a ~53 KB WOFF2 and an ~85 KB WOFF, with both rendering identically to the source in side-by-side checks. Because each format's compression is fully defined by its spec, the output is the same byte-for-byte as any spec-compliant tool would produce.
Convert every weight and style you actually use in CSS. Each @font-face block targets one font-weight/font-style combination, and the browser does not synthesize real bold or italic from the regular cut (synthetic versions look noticeably worse). A typical body family needs at least Regular 400, Italic 400, Bold 700, and Bold Italic 700 — four files. A variable font collapses that back to a single file at the cost of a slightly larger initial download.
Subset it. This converter re-wraps the whole font, so a WOFF2 built from a full Unicode TTF still carries every glyph the family ships with — Cyrillic, Greek, Vietnamese, and in some families CJK ranges you will never render on an English-language site. Subsetting strips the glyphs you don't use before compression, and it is a separate step from format conversion: pyftsubset (part of the fonttools package) and glyphhanger are the usual tools, and font services do the same thing behind the scenes when they hand you unicode-range-split files. Convert first, subset second, then pair the result with font-display: swap and a <link rel="preload"> for the one or two cuts that render above the fold.