Typography · Do it yourself

Make Your Own Font: Design a TTF File from Sketch to Install

Khairul Alam·October 2026·~20 min read
FontsTrueTypeTypographyFontForgefontToolsAdobe Illustrator
Let’s make a font! From a doodle to a real .ttf file. Sketchpaper or tablet Outlinesvector shapes .ttf filethe real thing Aainstalled!
The whole journey in four boxes.

A font is just a small database that says “when someone types this letter, draw these curves”. You can make one with a drawing tool and patience, or with ten lines of Python. This guide covers both: the ideas first, then the tools, then a real tiny font you can download and try.

The whole post in 60 seconds
  • A TTF (TrueType) file is a box of tables: which glyph belongs to which character, the outlines, the widths, the names.
  • Every letter lives on a grid called the em square (often 1000 or 2048 units tall) with guide lines: baseline, x-height, cap height.
  • The work is: draw, space, kern, set metrics, test, export, validate.
  • Free tools: FontForge and BirdFont (drawing), fontTools (code). Paid favourites: Glyphs, FontLab, RoboFont. Adobe Illustrator can draw the shapes, with a plugin such as Fontself Maker or a font editor to build the file.
  • Spacing makes a font look good more than clever shapes do.
  • Pick a licence (the SIL Open Font License is common) and never copy someone else’s outlines.
Contents
  1. What is inside a font file
  2. The route map
  3. Meet the letter
  4. Pick your tools
  5. Draw clean outlines
  6. Spacing and kerning
  7. Vertical metrics
  8. Build a tiny font from code
  9. Export, check, test
  10. Names and licence
  11. Checklist and glossary

1. What is inside a font file

Open a .ttf file and you find a lunch box. Each compartment is a table, and each table has one job. The format is called sfnt, and it is shared by TrueType (.ttf) and OpenType (.otf) fonts.

A .ttf file = a box of tables cmapcharacter → glyph glyf + locathe outlines hmtxadvance widths head + maxpgrid size, counts hhea + OS/2line height, weight name + postnames, glyph names GPOS / kern (optional extras)kerning pairs, ligatures, alternates, hinting instructions
The six solid chips are the minimum for a working TrueType font (plus OS/2 for Windows). The dashed box is what makes a font polished.

For the exact rules, the references are the OpenType specification (Microsoft) and Apple’s TrueType Reference Manual.

2. The route map

1Sketchfind the personality 2Drawclean outlines 3Space, kernthe secret sauce 4Metricsascent, descent 5Testreal words, real sizes 6Exportgenerate the .ttf 7Validatecatch the gremlins 8Name, licencethen share it Eight stops. Steps 5 to 7 loop back to 2 as often as needed. That is normal!
Real projects loop between draw, space and test many times.

3. Meet the letter

Every glyph is drawn on an em square: a grid whose height is the font size. Designers split it into units. 1000 is traditional for PostScript-style fonts and 2048 is common for TrueType, but any value from 16 to 16384 is allowed. Along the grid run horizontal guide lines that every letter respects.

ascendercap heightx-heightbaselinedescender LSBRSB advance width
The red line is the baseline. Letters sit on it; round letters overshoot it a little so they look the same size as flat ones.
WordWhat it means
BaselineThe line most letters stand on. Vertical position 0.
x-height / cap heightHeight of lowercase letters like x, and of capitals like H. A tall x-height reads well on small screens.
Ascender / descenderParts that rise above the x-height (b, d) or drop below the baseline (g, p).
Side bearings (LSB, RSB)Empty space left and right of the shape. They decide how letters sit next to each other.
Advance widthHow far the cursor moves after the letter: left bearing + shape + right bearing.

4. Pick your tools

Tip: start with a free tool. You can always move your outlines to a paid one later, because they are just shapes.

ToolTypeGood for
FontForgeFree, open sourceA full font editor on Windows, macOS and Linux. Used in this guide
BirdFontFree, open sourceA simpler, friendly drawing interface
GlyphsPaid, macOSA favourite of working type designers
FontLabPaidProfessional editor with strong production tools
RoboFontPaid, macOSScriptable with Python, built around the UFO format
CalligraphrWeb serviceTurn a scanned page of your handwriting into a font
Adobe Illustrator (and Photoshop)Paid subscriptionDrawing the shapes. It does not save a font by itself, so pair it with a plugin or a font editor (see below)
Fontself MakerPaid pluginTurns Illustrator or Photoshop artwork into an installable font file
fontToolsFree Python libraryBuild, inspect and fix fonts in code (used in section 8)

Prices and licences change, so check each site. Related tools worth knowing: fontmake compiles source files (UFO, Glyphs) into font binaries, and the UFO format is an open, folder-based way to store a font design.

Drawing in Adobe Illustrator

Many people already draw letters in Adobe Illustrator, and that works well. One thing to know: Illustrator and Photoshop have no “save as font” command. They make the shapes, and something else builds the font file. There are two common routes:

AdobeIllustratordraw on guidesfilled shapes Fontself Makerplugin, drag in glyphs .ttf / .otfquick route Export SVGone per glyph Font editorFontForge, Glyphs .ttffull control Adobe draws the shapes. A plugin or a font editor builds the font file.
The plugin route is faster; the editor route gives you kerning classes, metrics checks and validation.

Prepare the artwork in Illustrator

Menu names can change between Illustrator versions, so check the current Adobe Help if one has moved.

5. Draw clean outlines

A glyph is made of contours (closed shapes). The letter O has two: the outer ring and the inner hole. Each contour is a chain of points: on-curve points the line passes through, and off-curve points (handles) that bend it.

Happy outline 4 points, one at each extreme handles stay level or upright Dizzy outline too many points, lumpy curves they blur at small sizes
Fewer, well-placed points give smoother curves and smaller files. Design tools draw cubic curves; TrueType stores quadratic ones and the exporter converts them.

Menu names can differ slightly between FontForge versions. The idea is the same in every editor.

6. Spacing and kerning

Spacing is how much empty room sits beside each letter (the side bearings). Kerning is a correction for particular pairs whose shapes leave an awkward hole, like AV, To or Ty. Bad spacing is the number-one reason a homemade font looks homemade.

Before A and V: a big holebetween the feet and the arms After (kern A+V = −60) The V tucks in under the A’s armand the pair reads as one word
Kerning values are small numbers in font units. Negative means closer together.

How designers space: set round letters first (o, n), then fit the rest to match. Test with real words such as hamburgefonstiv or Handgloves, and squint: the texture should look even, with no dark clumps or bright holes.

7. Vertical metrics

Vertical metrics decide the height of a line of text: how much room the font asks for above and below the baseline. The catch is that operating systems read different tables (hhea, OS/2 typo values, OS/2 win values). If they disagree, the same font can look differently spaced on Windows and macOS.

The Google Fonts Guide has a clear chapter on this.

8. Build a tiny font from code Try it!

Here is a fun way to see the tables in action: build a real font with a few lines of Python. Tiny Blocks has six letters (H E L O T I), each a polygon of straight lines. The sample below is drawn with the font itself, loaded from the file you can download.

HOTEL TILE
HELLOIf you see ordinary letters, your browser did not load the font file (for instance when the page is opened straight from disk).

Download TinyBlocks-Regular.ttf (about 1 KB) · make_tiny_blocks.py

The script follows the same map as the lunch box in section 1:

from fontTools.fontBuilder import FontBuilder
from fontTools.pens.ttGlyphPen import TTGlyphPen

def glyph(*contours):                      # a glyph = closed shapes
    pen = TTGlyphPen(None)
    for pts in contours:
        pen.moveTo(pts[0])
        for p in pts[1:]:
            pen.lineTo(p)
        pen.closePath()
    return pen.glyph()

# an L on a 1000-unit grid, drawn clockwise
L = glyph([(80, 0), (80, 700), (220, 700), (220, 140), (520, 140), (520, 0)])

fb = FontBuilder(1000, isTTF=True)         # 1000 units per em
fb.setupGlyphOrder([".notdef", "L"])       # .notdef must come first
fb.setupCharacterMap({ord("L"): "L"})      # cmap: character -> glyph
fb.setupGlyf({".notdef": glyph(), "L": L}) # glyf: the outlines
fb.setupHorizontalMetrics({".notdef": (500, 0), "L": (600, 80)})   # (advance, left bearing)
fb.setupHorizontalHeader(ascent=800, descent=-200)                 # hhea
fb.setupNameTable({"familyName": "Tiny Blocks", "styleName": "Regular"})
fb.setupOS2(sTypoAscender=800, sTypoDescender=-200, usWinAscent=800, usWinDescent=200)
fb.setupPost()
fb.save("TinyBlocks-Regular.ttf")

Install it with pip install fonttools. Then double-click the generated file to install it on your computer, or use it on the web with the CSS in the next section. Try changing a coordinate and rebuilding: the letter changes right away.

9. Export, check, test

Source.sfd .ufo .glyphs Generateeditor, fontmake TTFthe font file Checkvalidators Shipinstall, WOFF2 ttfautohintoptional hinting
Hinting is optional. Modern screens render most fonts well without it.

In FontForge

  1. Element → Validate → Validate. Fix open contours, wrong directions and missing extrema it reports.
  2. File → Generate Fonts, then choose TrueType as the format.
  3. Install the file (double-click it on macOS and Windows) and open a text editor to see your letters.

Check it properly

CheckHow
Looks right at all sizesType real paragraphs at 10 px, 16 px and 72 px. Squint for uneven spacing
Works in apps and browsersTry a word processor, a code editor, Chrome, Firefox and Safari
Passes automated checksFont Bakery runs hundreds of checks (it is the tool Google Fonts uses)
Inspect the tablesfontTools: ttx -l MyFont.ttf lists the tables, and ttx can dump them as XML

Use it on a website

@font-face {
  font-family: "My Font";
  src: url("myfont.woff2") format("woff2"),
       url("myfont.ttf") format("truetype");
  font-display: swap;
}
h1 { font-family: "My Font", sans-serif; }

Convert to WOFF2 for smaller downloads (fontTools can do it, see the WOFF2 specification). The MDN @font-face page explains every option.

10. Names and licence

This is general information, not legal advice.

11. Checklist and glossary

Before you call it done
  • Every letter sits on the baseline and shares the x-height and cap height.
  • Curves have points at the extremes, with no stray or overlapping points.
  • Spacing looks even in real words, and the worst pairs are kerned.
  • .notdef, the space glyph and the digits exist.
  • Vertical metrics are consistent, and a paragraph looks right on two systems.
  • Validation is clean, the names and licence are filled in.
TermIn plain words
GlyphOne drawn shape in the font: a letter, digit, symbol or mark.
Em square / units per emThe grid every glyph is drawn on. 1000 or 2048 units are typical.
ContourOne closed shape. An O has two.
On-curve / off-curve pointA point the outline passes through / a handle that bends it.
Side bearingEmpty space beside a glyph.
KerningA spacing correction for one pair of letters.
cmapThe table that maps characters to glyphs.
HintingInstructions that help glyphs snap to pixels at small sizes.
TTF / OTF / WOFF2TrueType outlines / OpenType (often cubic CFF outlines) / compressed font for the web.
Variable fontOne file that holds a range of weights or widths.
← Back to all writing