Font Converter

Custom Font Creation: From Concept to Finished Typeface

A comprehensive guide to creating your own font, from initial sketching through digitization, spacing, OpenType features, and final export

TL;DR

In Simple Terms

Start with pencil sketches of key characters (Hhamburgefontsiv) to establish the design concept. Digitize using Bezier curves in Glyphs ($249), FontLab ($499), RoboFont ($490), or free FontForge.Spacing and kerning take as much time as drawing glyphs. Set consistent sidebearings first using the 'n' and 'o' reference method, then kern critical pairs (AV, To, We). A well-spaced font with 200 kern pairs beats a poorly spaced font with 2,000.Export to OTF/TTF for desktop, then convert to WOFF2 for web. Run FontBakery to catch technical issues before distribution. Google Fonts accepts submissions with 350+ glyphs covering Latin Extended.

Share this page to:

Font Design Tools Overview

ToolPricePlatformBest For
Glyphs 3~$325 (~EUR299) / $49 MinimacOSMost popular professional tool, excellent UX
FontLab 8$499macOS, WindowsCross-platform, powerful drawing tools
RoboFont 4~$440 (~EUR400)macOSScripting-heavy workflows, extensible with Python
FontForgeFree (open source)macOS, Windows, LinuxBudget-friendly, full-featured but steep learning curve
BirdfontFree / $5 donationmacOS, Windows, LinuxBeginners, simple fonts

Recommendation for Beginners

Start with Glyphs Mini ($49) if you are on Mac, or FontForge (free) on any platform. Both can produce professional-quality fonts. Glyphs Mini is limited to single-master fonts but is the easiest tool to learn.

Concept & Sketching

Every typeface starts with a concept: who will use it, in what context, and what feeling should it convey? Before touching any software, sketch your ideas on paper.

Control Characters

Type designers begin with a small set of "control characters" that establish the font's DNA. The traditional test string is:

Hhamburgefontsiv

Traditional control string containing key character shapes

This string contains characters that define the fundamental proportions: H (vertical proportions, cap height), n (arch shape, x-height), o (round shape, contrast), a (counter shape), and s (complex curves). Get these right and the rest of the alphabet follows logically.

1.

Define Your Brief

Purpose (body text, display, UI), personality (geometric, humanist, slab), and technical requirements (weight range, language support).

2.

Sketch on Paper

Draw the control characters at large scale (2-3 inches tall). Explore variations. Paper sketching is faster than digital for exploring ideas.

3.

Establish Proportions

Define cap height, x-height, ascender height, descender depth. Typical x-height to cap-height ratio for body text fonts is 0.65-0.75.

Digitizing Glyphs

Transferring paper sketches to digital involves drawing Bezier curves that define each glyph's outline. The quality of your curves directly affects how the font renders on screen.

Bezier Curve Best Practices

  • Use as few points as possible. A well-drawn 'o' needs just 8-12 points. Extra points create bumpy curves.
  • Place on-curve points at extremes. Put points at the topmost, bottommost, leftmost, and rightmost positions of each curve.
  • Keep handles horizontal or vertical. Control handles should generally align with the x or y axis for smooth curves.
  • Match curve direction. All outer contours should run counter-clockwise, inner contours (counters) clockwise in PostScript (CFF) outlines. TrueType uses the opposite convention.

Pro Tip

Start digitizing with the lowercase 'n' and 'o'. The 'n' establishes stem width, arch shape, and serif style. The 'o' establishes round letter proportions and stroke contrast. Together, they define rules that propagate to most other characters.

# FontForge Python scripting: Create a basic glyph
import fontforge

font = fontforge.font()
font.em = 1000          # Units per em
font.ascent = 800       # Ascender height
font.descent = 200      # Descender depth

# Create the letter 'o'
glyph = font.createChar(0x006F, "o")
pen = glyph.glyphPen()

# Draw outer contour (counter-clockwise)
pen.moveTo((150, 0))
pen.curveTo((150, 250), (250, 500), (350, 500))
pen.curveTo((450, 500), (550, 250), (550, 0))
pen.curveTo((550, -50), (450, -10), (350, -10))
pen.curveTo((250, -10), (150, -50), (150, 0))
pen.closePath()

# Set width
glyph.width = 700

Building a Complete Character Set

A minimum viable font for English needs about 100 glyphs. For broader language support and professional use, plan for 250-500+ characters.

Character Set LevelGlyph CountCoverage
Basic ASCII~95A-Z, a-z, 0-9, punctuation, symbols
Latin Extended~350Accented characters for Western/Central European languages
Google Fonts Latin Plus~600Latin Extended + Vietnamese + additional symbols (full GF compliance)
Professional1,000+Multi-script support, small caps, alternates, figures

Work systematically through character groups: lowercase first, then uppercase, then figures, then punctuation, then accented characters. Building accented characters from base glyphs plus combining marks (component-based design) saves significant time.

Spacing & Kerning

Spacing is the most time-consuming part of font creation. Poor spacing makes even beautifully drawn glyphs look unprofessional. There are two levels: sidebearings (spacing) and kerning (pair adjustments).

Setting Sidebearings

Every glyph has a left and right sidebearing (the space between the glyph and its advance width boundaries). The classic approach:

  1. Set 'n' and 'o' sidebearings first -- these are your reference characters
  2. Space all other lowercase letters relative to 'n' (straight sides) and 'o' (round sides)
  3. Test with strings like "nnoonnoo" and "nnHHnnHH" to verify even color
  4. Set uppercase sidebearings using 'H' and 'O' as references

Critical Kerning Pairs

After sidebearings are set, kern pairs that still look uneven. Focus on the most visible combinations first:

AV AW AT AY FA LT LV LW LY PA TA To Tr Tu Tw Ty VA Vo We Yo

The 20 most critical kerning pairs in Latin fonts

Pro Tip

Use kerning classes (groups) instead of individual pair kerning. Group all letters with similar left edges (like b, h, k, l) and kern the group once. This gives you hundreds of effective kern pairs from just dozens of class definitions.

Adding OpenType Features

OpenType features bring your font to life with automatic ligatures, stylistic alternates, and contextual substitutions. They are written in OpenType Feature File syntax (.fea).

# OpenType feature code (.fea syntax)

# Standard ligatures (fi, fl, ff, ffi, ffl)
feature liga {
    sub f i by fi;
    sub f l by fl;
    sub f f by ff;
    sub f f i by ffi;
    sub f f l by ffl;
} liga;

# Oldstyle figures
feature onum {
    sub zero by zero.onum;
    sub one by one.onum;
    sub two by two.onum;
    # ... etc
} onum;

# Small caps
feature smcp {
    sub a by a.smcp;
    sub b by b.smcp;
    # ... etc
} smcp;

Learn more about implementing these features in our OpenType Features Guide.

Hinting for Screen Rendering

Hinting provides instructions that help font rasterizers align glyph outlines to the pixel grid, improving readability at small sizes on screen. With high-DPI displays becoming standard, hinting is less critical than it once was, but still matters for Windows ClearType rendering.

ApproachEffortQualityTool
Auto-hinting (ttfautohint)MinutesGood for most fontsttfautohint (free)
Manual TrueType hintingDays to weeksPixel-perfect at all sizesVTT (Microsoft, free)
No hinting (CFF/OTF)NoneGood on macOS/iOS, variable on WindowsN/A
# Auto-hint with ttfautohint
pip install ttfautohint-py

# Basic auto-hinting
ttfautohint input.ttf output-hinted.ttf

# With common options
ttfautohint --stem-width-mode=qqq --increase-x-height=14 \
  --fallback-stem-width=100 input.ttf output-hinted.ttf

Export, Testing & Distribution

Export Formats

  • OTF (CFF outlines): Best for desktop design applications
  • TTF (TrueType outlines): Required for web conversion to WOFF2, better hinting support
  • WOFF2: Convert from TTF for web delivery (see our TTF to WOFF2 guide)
  • Variable font (TTF): Single file supporting multiple weights/styles (see Variable Fonts guide)

Quality Testing with FontBakery

# Install FontBakery
pip install fontbakery

# Run comprehensive checks
fontbakery check-universal MyFont-Regular.ttf

# For Google Fonts submission
fontbakery check-googlefonts MyFont-Regular.ttf

# Check specific areas
fontbakery check-opentype MyFont-Regular.ttf

Distribution Options

Google Fonts (Free, Open Source)

Submit via GitHub pull request to the 1,050+ family library. Requires OFL license, GF Latin Core coverage (~210+ glyphs), passing FontBakery 1.1.0 checks, and a public Git repository. Typical review timeline: 4-6 months from submission to inclusion.

Commercial Distribution

Sell through MyFonts, Creative Market, or your own website. Set up desktop, web, and app licensing tiers.

Next Steps

Track your font project with Git version control, and when you are ready to publish for web use, follow our Font Optimization Checklist to ensure top performance.

Sarah Mitchell

Written & Verified by

Sarah Mitchell

Product Designer, Font Specialist

Custom Font Creation FAQs

Common questions about creating your own fonts