Font Converter

Enterprise Font Management: Large-Scale Font Operations Guide

Strategies for managing fonts across large organizations, from governance frameworks and licensing compliance to CI/CD integration and cost optimization

TL;DR

In Simple Terms

Enterprise font management requires centralized governance: a single source of truth for approved fonts, clear ownership, and automated compliance checks. NBC Universal paid $2M, $1.5M, and $3.5M in three separate font licensing lawsuits. The font management market is growing at 15% CAGR, reaching $2.5B by 2030.Use a font management platform (Monotype Fonts, Extensis Connect, Adobe Fonts) to track licenses, control distribution, and enforce brand consistency across teams. Self-hosted solutions with CDN delivery work best for web properties -- avoiding GDPR issues that led to EU fines of over $100 per visitor for Google Fonts usage.Integrate font operations into CI/CD pipelines with automated subsetting, format conversion, and performance budgets. A well-optimized enterprise font stack serves 2-4 weights at under 120KB total WOFF2.

Share this page to:

Enterprise Font Challenges

Managing fonts at enterprise scale is fundamentally different from handling fonts on a single project. Organizations with hundreds of developers, multiple brands, and dozens of web properties face compounding complexity that personal projects never encounter.

ChallengeImpactSolution
License sprawlUnlicensed usage, audit failures, legal risk ($150K-$3.5M settlements)Centralized font repository with license tracking
Brand inconsistencyDifferent teams using different font versions or substitutesApproved font list with automated enforcement
Performance varianceInconsistent loading strategies across propertiesShared font CDN with standardized loading patterns
Version fragmentationOutdated fonts with bugs or missing glyphs in productionVersion pinning with automated update workflows
Cost overrunsDuplicate licenses, unused subscriptionsUsage analytics and license consolidation

Font Management Platforms

Enterprise font management platforms provide centralized control over font assets, licensing, and distribution. The right platform depends on your organization's size, existing infrastructure, and whether you primarily use commercial or open-source fonts.

PlatformBest ForKey FeaturesPricing Model
Monotype FontsLarge enterprises needing premium fonts150,000+ fonts, API access, analytics, SSOPer-seat subscription
Extensis ConnectCreative teams with mixed font sourcesFont activation, compliance scanning, Adobe integrationPer-seat subscription
Adobe FontsTeams already using Creative Cloud25,000+ fonts, sync to desktop, web hostingIncluded with Creative Cloud
Google FontsCost-conscious organizations1,050+ font families, CDN delivery, fully open-sourceFree (OFL licensed)
Self-Hosted (npm/CDN)Engineering-driven organizationsFull control, custom subsetting, no third-party dependencyInfrastructure cost only

Pro Tip

For web-focused enterprises, self-hosting fonts via a shared internal CDN gives you the best control over performance, privacy (no third-party tracking), and caching. A 2022 German court ruled that loading Google Fonts violates GDPR by transmitting visitor IP addresses to Google, with fines starting at over $100 per visitor. Create an internal npm package like @company/fonts that teams install as a dependency.

Governance & Compliance Framework

A font governance framework defines who can approve fonts, how licenses are tracked, and what happens when violations are detected. Without one, organizations accumulate technical and legal debt.

Governance Structure

1.

Font Approval Board

Designate 2-3 stakeholders (brand designer, engineering lead, legal/procurement) who approve new font additions. All font requests go through a standardized intake form.

2.

Approved Font Registry

Maintain a single document or database listing every approved font, its license type, permitted uses (web, desktop, mobile, embedding), expiration date, and seat count.

3.

Automated Compliance Scanning

Run CI/CD checks that compare fonts used in codebases against the approved registry. Flag any unapproved fonts before they reach production.

# Example: CI font compliance check script
#!/bin/bash
APPROVED_FONTS="approved-fonts.json"
FOUND_FONTS=$(find ./public/fonts -name "*.woff2" -o -name "*.woff" | sort)

for font in $FOUND_FONTS; do
  FONT_NAME=$(basename "$font" | sed 's/\.[^.]*$//')
  if ! jq -e ".fonts[] | select(.name == \"$FONT_NAME\")" "$APPROVED_FONTS" > /dev/null 2>&1; then
    echo "ERROR: Unapproved font detected: $FONT_NAME"
    exit 1
  fi
done
echo "All fonts are approved."

Deployment Strategies at Scale

How you distribute fonts across your organization's web properties impacts performance, consistency, and maintainability. There are three primary deployment models for enterprise font delivery.

Shared CDN

Single origin, edge-cached globally. All properties reference the same font URLs.

Best for: Multi-site organizations with one brand

npm Package

Fonts bundled as an internal package. Teams install and bundle at build time.

Best for: Engineering-driven orgs with build pipelines

Hybrid

Critical fonts self-hosted, secondary fonts via managed CDN (Google Fonts, Adobe).

Best for: Organizations with mixed font sources

/* Shared CDN approach: all properties reference the same origin */
@font-face {
  font-family: 'BrandSans';
  src: url('https://fonts.internal.company.com/brand-sans-v3.2.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

/* Cache headers on the CDN origin (1 year, immutable) */
/* Cache-Control: public, max-age=31536000, immutable */

Performance Optimization at Scale

At enterprise scale, even small font optimization gains multiply across millions of page views. A 50KB reduction in font payload across 10 million monthly page views saves 500GB of bandwidth per month.

OptimizationTypical SavingsImplementation Effort
Convert to WOFF230-50% file size reductionLow (automated in build)
Latin-only subsetting70-90% file size reductionLow-Medium
Reduce weight count (9 to 3)60-70% total payload reductionMedium (requires design buy-in)
Preload critical fonts200-800ms faster LCPLow
Variable fonts (single file)40-70% vs multiple static filesMedium (CSS changes needed)

Pro Tip

Consider variable fonts for enterprise brand fonts. A single variable font file replaces 6-9 static weight files, simplifying your CDN and reducing total transfer size. Inter Variable (23KB WOFF2) replaces what would be 150KB+ as individual static files.

CI/CD Pipeline Integration

Automating font operations in your CI/CD pipeline ensures consistent output, catches issues early, and eliminates manual conversion errors.

# GitHub Actions: Font build & validation pipeline
name: Font Pipeline
on:
  push:
    paths: ['fonts/source/**']

jobs:
  build-fonts:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install FontTools
        run: pip install fonttools[woff] brotli

      - name: Convert to WOFF2
        run: |
          for ttf in fonts/source/*.ttf; do
            fonttools ttLib.woff2 compress "$ttf" -o "fonts/web/$(basename "${ttf%.ttf}.woff2")"
          done

      - name: Subset Latin characters
        run: |
          for woff2 in fonts/web/*.woff2; do
            pyftsubset "$woff2" \
              --unicodes="U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD" \
              --output-file="${woff2%.woff2}-latin.woff2"
          done

      - name: Check file sizes (budget: 50KB per file)
        run: |
          for f in fonts/web/*-latin.woff2; do
            SIZE=$(stat -c%s "$f")
            if [ "$SIZE" -gt 51200 ]; then
              echo "FAIL: $(basename $f) is $(($SIZE/1024))KB (budget: 50KB)"
              exit 1
            fi
          done

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: web-fonts
          path: fonts/web/*-latin.woff2

Cost Management & Licensing

Enterprise font licensing costs can range from $5,000 to $200,000+ annually depending on the number of fonts, seats, and page views. The global font management market reached $1.2B in 2025 and is projected to grow to $2.5B by 2030 at a 15% CAGR. Proactive cost management starts with understanding your licensing model.

License ModelHow It WorksCost Optimization Strategy
Per-seatPay per designer/developer who installs the fontAudit active users quarterly, remove inactive seats
Page view tiersWeb font cost based on monthly page viewsSelf-host after purchasing perpetual license
PerpetualOne-time purchase, use foreverNegotiate enterprise volume discounts upfront
Open source (OFL)Free to use, modify, and redistribute$0 licensing cost -- invest savings in self-hosting

Cost Saving Opportunity

Many enterprises are switching brand fonts to high-quality open-source alternatives. Inter, Source Sans 3, and Noto Sans are used by major companies as primary brand fonts at zero licensing cost. The quality gap between open-source and commercial fonts has narrowed significantly since 2020.

Enterprise Implementation Checklist

Establish a Font Approval Board with clear ownership (brand, engineering, legal)
Create and maintain an Approved Font Registry with license metadata
Set up a centralized font repository (CDN, npm package, or management platform)
Implement automated license compliance scanning in CI/CD
Standardize on WOFF2 format for all web properties
Define performance budgets: max 120KB total font payload, max 3-4 weights
Configure font preloading for critical fonts across all properties
Set immutable cache headers (1 year) on font CDN with version-based URLs
Run quarterly font audits to identify unused licenses and unapproved fonts
Document fallback font stacks that match brand font metrics
Monitor Core Web Vitals (LCP, CLS) impact from font loading across properties
Evaluate variable fonts for brand typefaces to consolidate weight files

Next Steps

Start with a font audit to understand your current state, then build your governance framework incrementally. For version tracking, see our Font Version Control guide.

Font migration is the job of moving an installed font library from one machine to another, or from one operating system to another, without losing files, organization, or the ability to open old work. It sounds like copying a folder. It usually is not, because operating systems keep fonts in several places at once, register them in system databases that a plain copy does not touch, and cache them aggressively enough that a correctly copied font can still fail to appear in your applications.

There are three common versions of this task. Moving to a new machine on the same platform, which is mostly a transfer-and-verify exercise. Moving between macOS and Windows, which adds format and rendering questions on top. And moving a desktop library into web use, which is really a conversion and licensing exercise rather than a migration. This guide covers the first two in full and points you at the right tools for the third.

Start with the cross-platform section below if you are changing operating system, since it determines which files are even worth carrying over. Then jump to the macOS procedure or the Windows procedure for the platform you are landing on. If both machines run the same system, you can go straight to that platform's section.

Moving Fonts Between Operating Systems

Font files themselves are largely portable. What is not portable is the container format some fonts ship in, the way each system renders outlines, and the licence that permits the installation. Work through those three before you copy anything.

Which Formats Survive the Crossing

FormatmacOSWindowsWhat to do
TTFYesYesCopy as is
OTFYesYesCopy as is
TTC (collection)YesPartialExtract individual faces to TTF for reliability
DFONTYes (legacy)NoConvert to TTF before moving to Windows
Type 1 (.pfb / .pfm)Dropped in SonomaDropped in Windows 10Convert to OTF, both platforms ended support in 2023
WOFF / WOFF2Web onlyWeb onlyNot installable, keep alongside the desktop originals

Anything in the bottom half of that table needs converting before it will install on the other side. Our online font converter handles the common cases in the browser, and the Type 1 migration section of the legacy formats guide covers the PostScript families in detail, including what happens to kerning data on the way out.

Why the Same Font Looks Different After the Move

The two systems render outlines differently, and the difference is not a bug on either side. Windows uses DirectWrite and ClearType, which lean on the TrueType hinting instructions inside a font to snap stems onto the pixel grid. macOS uses Core Text, which renders the outline more or less faithfully and largely ignores hinting. The practical consequences run in both directions.

Mac to Windows

Fonts that were never hinted look fine on the Mac they came from and can look blurry or uneven on Windows at body sizes. If the font is destined for a website, run it through ttfautohint before converting. See the Windows section for the settings.

Windows to Mac

Heavily hinted fonts usually render slightly heavier on Windows than they will on macOS, so text that was tuned to fill a layout can come up short. Re-check line lengths in long documents rather than assuming the layout is identical.

Either direction

System fonts are not portable. San Francisco on macOS and Segoe UI on Windows are licensed for use on their own platform, so a document that relied on one will substitute on the other. Replace those with a font you have licensed for both.

Check the licence before you copy

Many desktop licences are sold per seat, and a seat usually means a machine or a named user rather than a person's whole hardware collection. Migrating to a new machine while keeping the old one active can quietly put you over the count, and installing on a second operating system is sometimes a separate grant again. Read the font licence types reference or run the files through the font license checker before a bulk copy.

Planning Any Font Migration

The same five steps apply whichever direction you are moving. The platform sections below give the specific commands for each one.

1

Inventory what is installed

Count the fonts, note where they live, and flag anything in a format the destination cannot read. A migration is the cheapest moment you will ever get to delete fonts you have not used in five years.

2

Back up before you touch anything

Copy the font folders and the organization data (Font Book collections on macOS, the registry export on Windows) to external storage. Verify the file count in the backup matches the source.

3

Validate the files

Corrupt fonts are the most common cause of a migration that half works. Validate before the move so you are not debugging a new machine and a broken file at the same time.

4

Convert what needs converting

Handle DFONT, TTC, and Type 1 files at this point, while you still have a system that can read them. Keep the originals.

5

Transfer, register, and clear the cache

Copying files into place is not installation on either platform. Both systems keep a font database that has to pick up the change, and both cache aggressively enough that a restart is usually part of the process.

Budget the time honestly

A library of a few hundred fonts, done properly, takes 30 to 90 minutes including validation and cache rebuilds. Done carelessly it takes days, because duplicate and corrupt fonts surface one design file at a time over the following weeks.

Migrating Fonts on macOS

macOS keeps fonts in four places, and only two of them are yours to move. Getting this distinction right is the difference between a clean migration and a Mac that boots to placeholder boxes in the menu bar.

Where macOS Stores Fonts

~/Library/Fonts

Personal fonts for the current user, no admin rights needed. This is the primary folder to migrate and where most purchased and downloaded fonts end up.

/Library/Fonts

Fonts available to every user on the machine. Requires administrator rights. Migrate it if you deliberately installed shared fonts there, for example on a studio workstation.

/System/Library/Fonts

Protected system fonts, guarded by System Integrity Protection. Never copy, move, or delete these. macOS restores them on reinstall and nothing you need is stored only here.

~/Library/Application Support/Adobe/Fonts

Adobe Fonts synced through Creative Cloud. Do not migrate these. Sign in to Creative Cloud on the new Mac and they re-download automatically.

~/Library/FontCollections

Not fonts, but the Font Book database of collections, favourites, and enabled or disabled states. Migrate it alongside the fonts or you will rebuild your organization by hand.

Inventory and Back Up

# Count and list what is installed for this user
find ~/Library/Fonts -type f \( -name "*.ttf" -o -name "*.otf" -o -name "*.ttc" \) | wc -l
du -sh ~/Library/Fonts

# Flag anything that will not survive a move to Windows
find ~/Library/Fonts -type f \( -name "*.dfont" -o -name "*.pfb" -o -name "*.ttc" \)

# Back up fonts and Font Book organization together
BACKUP_DIR=~/Desktop/Font_Backup_$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
cp -R ~/Library/Fonts "$BACKUP_DIR/User_Fonts"
cp -R ~/Library/FontCollections "$BACKUP_DIR/FontCollections"
cp ~/Library/Preferences/com.apple.FontBook.plist "$BACKUP_DIR/"

Before transferring, open Font Book, select all fonts with Cmd+A, and run File then Validate Fonts. Fix or remove anything reported under Serious Problems. Minor problems are usually safe to carry across. Migrating a corrupt font simply moves the problem to a machine where it is harder to diagnose.

Choose a Transfer Method

Migration Assistant, for a whole new Mac

Applications, then Utilities, then Migration Assistant. Choose "From a Mac, Time Machine backup, or startup disk" and connect the old machine. Fonts, collections, and activation states all come across without manual work. The trade-off is that it moves everything else too and takes 30 minutes to 3 hours.

Best when the new Mac is genuinely replacing the old one and you want the whole environment.

Manual copy, for control

# On the old Mac
cp -R ~/Library/Fonts /Volumes/ExternalDrive/Font_Migration/
cp -R ~/Library/FontCollections /Volumes/ExternalDrive/Font_Migration/

# On the new Mac, with Font Book and design apps closed
cp -R /Volumes/ExternalDrive/Font_Migration/Fonts/* ~/Library/Fonts/
cp -R /Volumes/ExternalDrive/Font_Migration/FontCollections/* ~/Library/FontCollections/

# Rebuild the font database, then restart
sudo atsutil databases -remove

Keep the -R flag so permissions survive the copy, and test with a small batch before moving several thousand files. Never copy anything out of /System/Library/Fonts.

Font Book export, for a subset

Select the fonts or collections you want, then File and Export Fonts. On the new Mac use File and Add Fonts, then choose whether to install for the user or the whole computer. This is the right method when you are deliberately leaving most of the library behind, but it does not carry collections across, so you rebuild those by hand.

Clean Up in Font Book

Once the files are in place, open Font Book and do three things. Run Edit then Look for Duplicates, and resolve them, preferring the copy in ~/Library/Fonts over older versions elsewhere. Re-run File then Validate Fonts on the new machine, since a transfer can truncate files. Then disable fonts you do not need: application launch times and font menus both suffer past roughly 200 active families, and disabled fonts stay installed and can be re-enabled at any time.

Troubleshooting on macOS

Fonts do not appear after the copy

Clear the font database and restart. Run sudo atsutil databases -remove, then sudo atsutil server -shutdown and sudo atsutil server -ping, then reboot. If they are still missing, check ownership with ls -la ~/Library/Fonts, which should show your username, and check Font Book in case they arrived disabled.

Fonts missing in Adobe or Office apps only

Both suites keep their own font caches. Quit every Adobe app, remove ~/Library/Application Support/Adobe/CoreSync/, then restart Creative Cloud and let the fonts re-sync. For Office, quit all applications and remove ~/Library/Preferences/com.microsoft.office.plist before relaunching.

Font Book will not open or crashes

Remove ~/Library/Preferences/com.apple.FontBook.plist and restart. If it still crashes, boot into Safe Mode by holding Shift during startup, validate all fonts from there, and remove whatever the validator flags. A single malformed font is almost always the cause.

System UI shows placeholder boxes

This means protected system fonts were damaged, which only happens if something wrote into /System/Library/Fonts. Do not try to repair it by hand. Reinstall macOS over the top, which keeps your data and restores the system fonts.

Migrating Fonts on Windows

Windows differs from macOS in one way that matters more than any other: a font file sitting in the Fonts folder is not installed until it also has a registry entry. Copying files alone produces the classic symptom of a font that is visibly present on disk and invisible in every application.

Where Windows Stores Fonts

System fonts, all users

C:\Windows\Fonts, which requires administrator rights. Registered under HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.

Per-user fonts

%LOCALAPPDATA%\Microsoft\Windows\Fonts, available since Windows 10 build 1809 and installable without admin rights. Registered under HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.

Application fonts

Adobe and Office install some fonts into their own directories. Creative Cloud synced fonts live under C:\Users\[user]\AppData\Roaming\Adobe\CoreSync\plugins\livetype and re-download on sign-in, so leave them out of the migration.

Inventory with PowerShell

# List every registered system font
$fonts = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
$fonts.PSObject.Properties | Where-Object { $_.Name -notmatch '^PS' } |
Select-Object @{N='FontName';E={$_.Name}}, @{N='FileName';E={$_.Value}} |
Sort-Object FontName | Format-Table -AutoSize

# Flag legacy Type 1 files that need converting before migration
Get-ChildItem "C:\Windows\Fonts" -Include *.pfm,*.pfb -Recurse -ErrorAction SilentlyContinue |
ForEach-Object { Write-Host "Type 1 font found: $($_.Name)" -ForegroundColor Yellow }

# Export a full inventory for the record
Get-ChildItem "C:\Windows\Fonts" |
Select-Object Name, Extension, @{N='SizeKB';E={[math]::Round($_.Length/1KB,1)}}, LastWriteTime |
Export-Csv -Path "font-inventory.csv" -NoTypeInformation

# Include per-user fonts (Windows 10 1809 and later)
$userFontPath = "$env:LOCALAPPDATA\Microsoft\Windows\Fonts"
if (Test-Path $userFontPath) { Get-ChildItem $userFontPath | Format-Table Name, Extension }

Export the registry keys as well as the files. The CSV tells you what you had, and the registry export tells you how it was registered, which is what you will compare against if fonts go missing on the new machine.

Install on the New Machine

For a handful of fonts, select them in Explorer, right-click, and choose Install for all users, which writes both the file and the registry entry. For a bulk migration, copy the files and register them in one pass. The script below is also the basis of the Group Policy startup script further down.

$FontSource = "D:\Font_Migration"
$FontDest   = "C:\Windows\Fonts"
$RegPath    = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"

Get-ChildItem $FontSource -Include *.ttf,*.otf -Recurse | ForEach-Object {
$destPath = Join-Path $FontDest $_.Name
if (-not (Test-Path $destPath)) {
Copy-Item $_.FullName $destPath -Force
$fontName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name)
New-ItemProperty -Path $RegPath -Name "$fontName (TrueType)" -Value $_.Name -Force
Write-Host "Installed: $($_.Name)"
}
}

ClearType and Hinting

If any of these fonts are headed for a website, hinting is the step that decides whether Windows users see sharp text or mush. ClearType aligns glyph outlines to the pixel grid using the hinting instructions in the font, so an unhinted font that looked perfect on a Mac can render badly in Chrome and Edge on Windows.

ScenarioHinting approachResult on Windows
Body text, 12 to 18pxttfautohint, requiredSharp, consistent stems
Headings, 24px and upAuto-hint or leave unhintedAcceptable either way
High-DPI displaysLess criticalPixel density compensates
No hinting at body sizeNot applicableBlurry, uneven stem widths
# Install the toolchain (Python 3.8+ from python.org or the Microsoft Store)
pip install fonttools[woff] brotli ttfautohint-py

# Hint first, then convert. The order matters.
ttfautohint ^
--stem-width-mode=qqq ^
--increase-x-height=14 ^
--hinting-range-min=8 ^
--hinting-range-max=50 ^
input.ttf input-hinted.ttf

python -m fontTools.ttLib -o output.woff2 input-hinted.ttf

# Note: ^ is line continuation in CMD. Use a backtick in PowerShell.

WSL runs the same Linux font tooling if you would rather follow instructions written for macOS or Linux. If you do not want a local toolchain at all, the webfont generator produces WOFF2 files and the matching @font-face CSS in the browser.

Deploying Across an Organization

For a fleet rather than a single machine, there are two supported routes. A Group Policy computer startup script running the install script above, pointed at a network share, covers domain-joined estates. For cloud-managed devices, package the fonts and an install script as a Win32 app with the IntuneWinAppUtil tool, upload it to Microsoft Intune, set a detection rule that checks for a known font file in C:\Windows\Fonts, and assign it to device groups. Broader fleet policy, including licence tracking at that scale, is covered in the governance and compliance section above.

Troubleshooting on Windows

Font is in the Fonts folder but not in applications

The registry entry is missing. Either right-click the file and choose Install for all users, or add the value directly with reg add against HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts, naming the value after the font and setting the data to the filename.

Font cache problems after a bulk install

Windows caches font data hard, and a stale cache explains the large majority of post-migration oddities. Run net stop fontcache, delete the contents of %WinDir%\ServiceProfiles\LocalService\AppData\Local\FontCache\, run net start fontcache, then reboot.

Text looks blurry in Chrome or Edge

The font is almost certainly unhinted. Re-process it with ttfautohint before serving it, and confirm ClearType is switched on by searching for ClearType in Windows Settings and running the tuner.

Cannot install font

Usually a corrupt file, insufficient permissions, or a font that is already installed. Run the install elevated, clear the font cache as above, and check the file itself with the font analyzer before assuming Windows is at fault.

Post-Migration Checklist

Work through this on the destination machine before you close the migration out. Most of the failures that surface weeks later would have been caught by items four and five.

  • 1. Backup of the source library verified by file count, and kept until the new machine has been in real use for a month
  • 2. Legacy formats converted, with the originals archived rather than deleted
  • 3. Fonts copied into the correct per-user or system location for the platform
  • 4. Fonts registered: Font Book shows them on macOS, or the registry entry exists on Windows
  • 5. Font cache cleared and the machine restarted
  • 6. Duplicates resolved, keeping the newest copy from the most trustworthy source
  • 7. Fonts re-validated on the destination machine, not just the source
  • 8. Font Book collections restored, or their Windows equivalent documented
  • 9. Two or three real project files opened and checked for substitution warnings
  • 10. Licence positions checked, and fonts deactivated on the retired machine if seats are capped
  • 11. A fresh backup taken from the new machine

Summary: A Font Migration That Holds Up

Font migration goes wrong in predictable ways: files copied without being registered, caches never cleared, corrupt fonts carried forward, and formats that the destination system cannot read. Inventory first, back up the organization data as well as the fonts, convert the legacy formats while you still have a machine that can open them, and treat the cache rebuild as part of the install rather than an optional extra.

If the destination for these fonts is a website rather than another desktop, the job changes shape: convert to WOFF2, hint for Windows rendering first, and confirm the licence covers web delivery before you deploy anything.

Why a Font Audit Matters

Fonts are often the most overlooked performance and compliance liability on a website. Industry data shows 70% of sites lack a font-display property, 55-60% fail font contrast ratio checks, and 40% have CLS issues caused by font loading. A font audit identifies unused fonts, licensing violations, performance bottlenecks, and accessibility gaps. Regular audits (quarterly or before major releases) prevent these issues from accumulating.

Audit AreaRisk if SkippedTypical Finding
InventoryUnused fonts wasting bandwidth30% of loaded fonts are unused on the page
PerformanceSlow LCP, layout shifts from fontsFonts add 300-800ms to page load
AccessibilityWCAG failures, poor readabilityBody text below 16px or low contrast ratios
LicensingLegal liability, $20K-

Enterprise Implementation Checklist

Establish a Font Approval Board with clear ownership (brand, engineering, legal)
Create and maintain an Approved Font Registry with license metadata
Set up a centralized font repository (CDN, npm package, or management platform)
Implement automated license compliance scanning in CI/CD
Standardize on WOFF2 format for all web properties
Define performance budgets: max 120KB total font payload, max 3-4 weights
Configure font preloading for critical fonts across all properties
Set immutable cache headers (1 year) on font CDN with version-based URLs
Run quarterly font audits to identify unused licenses and unapproved fonts
Document fallback font stacks that match brand font metrics
Monitor Core Web Vitals (LCP, CLS) impact from font loading across properties
Evaluate variable fonts for brand typefaces to consolidate weight files

Next Steps

Start with a font audit to understand your current state, then build your governance framework incrementally. For version tracking, see our Font Version Control guide.

50K settlements
Desktop font used on web without web license

Step 1: Font Inventory

Start by identifying every font your site loads. Open Chrome DevTools and use these methods:

// Method 1: List all loaded fonts via document.fonts API
const loadedFonts = [];
document.fonts.forEach(font => {
  loadedFonts.push({
    family: font.family,
    weight: font.weight,
    style: font.style,
    status: font.status  // 'loaded', 'loading', 'error', 'unloaded'
  });
});
console.table(loadedFonts);

// Method 2: Check which fonts are actually used on the page
const usedFonts = new Set();
document.querySelectorAll('*').forEach(el => {
  const computed = getComputedStyle(el);
  usedFonts.add(computed.fontFamily.split(',')[0].trim().replace(/['"]/g, ''));
});
console.log('Fonts used on page:', [...usedFonts]);

// Method 3: Network tab - filter by "font" resource type
// DevTools > Network > filter: "font" to see all font requests

Inventory Checklist

List every font file loaded (name, format, weight, style, file size)
Identify which fonts are used vs. loaded but unused
Check if any fonts are loaded from third-party CDNs (Google Fonts, Adobe Fonts)
Note font file formats: are all WOFF2, or are there legacy TTF/WOFF files?
Count total font requests and combined font payload size
Check for duplicate font loads (same font loaded from different paths)
Verify font families match CSS declarations (no mismatched names)

Step 2: Performance Audit

Total font payload is under 150KB (target: under 100KB for fast sites)
All font files use WOFF2 format (Brotli compression)
font-display is set on every @font-face rule (swap, optional, or fallback)
Critical fonts (above-the-fold headings) are preloaded with <link rel='preload'>
Font files are served with long cache headers (Cache-Control: max-age=31536000, immutable)
No more than 2-4 font weights/styles are loaded per page
Fonts are self-hosted (no third-party CDN latency or privacy concerns)
Fonts are subsetted to remove unused Unicode ranges
No render-blocking font requests in the critical path
CLS (Cumulative Layout Shift) from font swaps is below 0.1

Pro Tip

Run a Lighthouse audit and look for the "Ensure text remains visible during webfont load" warning. This indicates missing font-display declarations. Also check "Reduce unused CSS" which often includes @font-face rules for unneeded weights.

Ideal @font-face Configuration

@font-face {
  font-family: 'BrandFont';
  src: url('/fonts/brand-regular-latin.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC,
                 U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074,
                 U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,
                 U+FEFF, U+FFFD;
}

/* Preload in HTML <head> */
/* <link rel="preload" href="/fonts/brand-regular-latin.woff2"
        as="font" type="font/woff2" crossorigin> */

Step 3: Accessibility & Compliance

Body text is at least 16px (1rem) -- the browser default and minimum for comfortable reading
Line height is 1.5x or greater for body text (WCAG 1.4.12 Text Spacing)
Contrast ratio meets WCAG AA: 4.5:1 for normal text, 3:1 for large text (18px+ bold or 24px+)
Text can be resized to 200% without loss of content or functionality (WCAG 1.4.4)
Letter spacing, word spacing, line height, and paragraph spacing can be overridden by users (WCAG 1.4.12)
Fallback fonts are specified for all custom font stacks (never just the custom font name alone)
Font weight is sufficient: body text should use weight 400+, never 300 (Light) for body copy
Decorative/display fonts are limited to headings and short text, not used for body copy
WCAG CriterionRequirementHow to Test
1.4.3 Contrast4.5:1 (normal), 3:1 (large)Chrome DevTools color picker, axe-core
1.4.4 Resize Text200% zoom without lossBrowser zoom to 200%, check overflow
1.4.12 Text SpacingOverride line-height, spacing without breakingWCAG text spacing bookmarklet

Step 4: License Compliance

Every font on the site has a documented license (file or subscription receipt)
Web embedding is explicitly permitted by each font's license
Page view limits (if any) are not exceeded for metered web font licenses
Self-hosted fonts were obtained from a legitimate source (not pirated downloads)
Google Fonts are verified as OFL-licensed (free for any use)
Adobe Fonts are covered by an active Creative Cloud subscription
Commercial fonts have licenses matching actual usage (web + desktop if both are used)
No fonts are loaded from unauthorized CDN sources or hotlinked from other sites

Warning

Font foundries actively monitor the web for unlicensed usage. Monotype's Font Radar platform monitors over 98,000 fonts from 650+ foundries, and industry data shows 30-40% of websites have unlicensed fonts. Violation settlements range from $20,000 to $3.5M (NBC Universal paid $2M,

Enterprise Implementation Checklist

Establish a Font Approval Board with clear ownership (brand, engineering, legal)
Create and maintain an Approved Font Registry with license metadata
Set up a centralized font repository (CDN, npm package, or management platform)
Implement automated license compliance scanning in CI/CD
Standardize on WOFF2 format for all web properties
Define performance budgets: max 120KB total font payload, max 3-4 weights
Configure font preloading for critical fonts across all properties
Set immutable cache headers (1 year) on font CDN with version-based URLs
Run quarterly font audits to identify unused licenses and unapproved fonts
Document fallback font stacks that match brand font metrics
Monitor Core Web Vitals (LCP, CLS) impact from font loading across properties
Evaluate variable fonts for brand typefaces to consolidate weight files

Next Steps

Start with a font audit to understand your current state, then build your governance framework incrementally. For version tracking, see our Font Version Control guide.

.5M, and $3.5M in separate cases). Review your font licensing obligations carefully.

Audit Tools & Automation

Font Analysis

  • Our Font Analyzer (browser-based)
  • Wakamai Fondue (wakamaifondue.com)
  • FontDrop! (fontdrop.info)
  • FontTools (Python, command-line)

Performance Testing

  • Lighthouse (built into Chrome DevTools)
  • WebPageTest (webpagetest.org)
  • Chrome UX Report (CrUX) for field data
  • SpeedCurve for continuous monitoring

Accessibility

  • axe DevTools (browser extension)
  • WAVE Web Accessibility Evaluator
  • Chrome DevTools Contrast Checker
  • Pa11y (automated CI testing)

License Verification

  • Our Font License Checker
  • Font file metadata inspection (nameID 0, 7, 13)
  • Foundry-provided license verification portals
  • Internal license registry/spreadsheet

Fixing Common Issues

Issue: Fonts are TTF/WOFF instead of WOFF2

Convert all web fonts to WOFF2 using our converter tool or FontTools. WOFF2 saves 30-50% file size over TTF and 20-30% over WOFF.

Issue: Too many font weights loaded

Audit CSS to identify which weights are actually used. Most sites only need Regular (400) and Bold (700). Remove unused weights from @font-face declarations and delete the files.

Issue: Missing font-display

Add font-display: swap to every @font-face rule. This prevents FOIT (invisible text) and improves perceived load time. See our Font Loading Strategies guide for advanced options.

Issue: Fonts not subsetted

If your site only uses Latin characters, subset fonts to remove unused glyphs. This can reduce file size by 70-90%. Follow our Font Subsetting guide.

Ongoing Font Governance

A one-time audit is helpful, but sustainable font management requires ongoing governance integrated into your development workflow.

# Add to your CI pipeline: font performance budget check
# .github/workflows/font-audit.yml
name: Font Audit
on: [pull_request]

jobs:
  font-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Check font formats
        run: |
          # Fail if any non-WOFF2 web fonts exist
          if find public/fonts -name "*.ttf" -o -name "*.woff" | grep -q .; then
            echo "ERROR: Non-WOFF2 font files found in public/fonts/"
            find public/fonts -name "*.ttf" -o -name "*.woff"
            exit 1
          fi

      - name: Check total font size budget (150KB)
        run: |
          TOTAL=$(find public/fonts -name "*.woff2" -exec stat -c%s {} + | awk '{s+=<section id="enterprise-checklist" className="mb-8 scroll-mt-24">
                <h2 className="text-2xl md:text-3xl font-bold text-gray-900 mb-6">Enterprise Implementation Checklist</h2>

                <div className="space-y-3">
                    {[
                        "Establish a Font Approval Board with clear ownership (brand, engineering, legal)",
                        "Create and maintain an Approved Font Registry with license metadata",
                        "Set up a centralized font repository (CDN, npm package, or management platform)",
                        "Implement automated license compliance scanning in CI/CD",
                        "Standardize on WOFF2 format for all web properties",
                        "Define performance budgets: max 120KB total font payload, max 3-4 weights",
                        "Configure font preloading for critical fonts across all properties",
                        "Set immutable cache headers (1 year) on font CDN with version-based URLs",
                        "Run quarterly font audits to identify unused licenses and unapproved fonts",
                        "Document fallback font stacks that match brand font metrics",
                        "Monitor Core Web Vitals (LCP, CLS) impact from font loading across properties",
                        "Evaluate variable fonts for brand typefaces to consolidate weight files",
                    ].map((item, index) => (
                        <div key={index} className="flex items-start gap-2">
                            <svg className="w-5 h-5 text-orange-500 mt-0.5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
                            </svg>
                            <span className="text-gray-700">{item}</span>
                        </div>
                    ))}
                </div>

                <div className="bg-green-50 border-l-4 border-green-500 p-4 mt-8">
                    <p className="font-semibold text-green-800">Next Steps</p>
                    <p className="text-green-700">Start with a <Link href="/guides/enterprise-font-management#why-audit" className="underline font-medium">font audit</Link> to understand your current state, then build your governance framework incrementally. For version tracking, see our <Link href="/guides/enterprise-font-management#why-version-control" className="underline font-medium">Font Version Control</Link> guide.</p>
                </div>
            </section>} END {print s}')
          if [ "$TOTAL" -gt 153600 ]; then
            echo "FAIL: Total font size is $(($TOTAL/1024))KB (budget: 150KB)"
            exit 1
          fi
          echo "PASS: Total font size is $(($TOTAL/1024))KB"

Next Steps

For a deep dive on performance, check the performance checklist below, and see ongoing governance for keeping an audit current.

Why Version Control for Fonts?

Font files are software. Like any software, they evolve over time -- new characters are added, kerning is refined, bugs are fixed. Without version control, font projects suffer from the same problems as unversioned code: lost changes, unclear history, and collaboration conflicts.

Without Version ControlWith Version Control
MyFont-v2-final-FINAL-v3.otfgit log shows complete history with meaningful messages
No way to see what changed between versionsgit diff shows exactly which glyphs or metrics changed
Emailing font files between collaboratorsBranches and pull requests for collaborative editing
Manual export to web formatsCI/CD automatically builds WOFF2, runs quality checks

Google Fonts -- which manages over 1,050 font families -- requires all submissions to be maintained in public Git repositories with automated CI builds. This practice, pioneered by the open-source font community, has become the standard for professional font development. GitHub Actions automates build + FontBakery checks in approximately 2 minutes per build.

Source Formats for Version Control

The key to effective font version control is using text-based source formats that Git can diff meaningfully. Binary formats (TTF, OTF) change completely with every edit, making diffs useless.

FormatTypeGit-Friendly?Used By
UFO (.ufo)XML directory (text)ExcellentRoboFont, FontForge, fontmake
Glyphs (.glyphs)Text plistGoodGlyphs.app
Glyphs 3 (.glyphx)Package directoryExcellentGlyphs 3
Designspace (.designspace)XML (text)ExcellentVariable font projects
FontLab (.vfj)JSON (text)GoodFontLab 8
TTF/OTFBinaryPoorBuild artifacts only

Pro Tip

UFO (Unified Font Object) is the most Git-friendly format because each glyph is stored as a separate XML file. When you modify one character, only that file changes in the commit, making code review straightforward. Note: Glyphs 3 now supports .glyphspackage format (a directory bundle) which is similarly Git-friendly, and FontLab 8.3+ can open it natively.

Git Repository Setup

A well-structured font repository separates source files from build outputs and includes proper ignore rules.

# Recommended repository structure
my-font-family/
├── sources/
│   ├── MyFont-Regular.ufo/
│   ├── MyFont-Bold.ufo/
│   └── MyFont.designspace
├── fonts/
│   ├── ttf/              # Built TTF files
│   ├── otf/              # Built OTF files
│   └── webfonts/         # Built WOFF2 files
├── scripts/
│   └── build.py          # Font build script
├── .gitignore
├── .gitattributes
├── LICENSE.txt           # OFL or commercial license
├── METADATA.pb           # Google Fonts metadata (if applicable)
└── README.md

.gitignore for Font Projects

# Build outputs (regenerated from sources)
fonts/ttf/
fonts/otf/
fonts/webfonts/

# OS files
.DS_Store
Thumbs.db

# Editor backups
*.bak
*~

# Python build cache
__pycache__/
*.pyc
build/
dist/
*.egg-info/

.gitattributes for Font Projects

# Treat font source files as text for proper diffing
*.ufo/** text
*.glyphs text
*.designspace text
*.fea text

# Binary font files (if tracked) use LFS
*.ttf filter=lfs diff=lfs merge=lfs -text
*.otf filter=lfs diff=lfs merge=lfs -text
*.woff filter=lfs diff=lfs merge=lfs -text
*.woff2 filter=lfs diff=lfs merge=lfs -text

Font Versioning Conventions

OpenType fonts store a version number in the name table (nameID 5) as "Version X.YYY". This is separate from your Git tags but should be kept in sync.

Version ChangeWhen to UseExample
Major (X.0)Breaking changes: major redesign, glyph redraws, metric changesVersion 2.000 (redesigned lowercase)
Minor (X.Y)New features: added glyphs, new OpenType features, new weightsVersion 2.100 (added Cyrillic support)
Patch (X.YZZ)Bug fixes: kerning corrections, hinting fixes, metadata updatesVersion 2.101 (fixed AV kerning pair)
# Using font-v to manage font versions
pip install font-v

# Check current version
font-v report MyFont-Regular.ttf

# Bump version (updates name table + head table)
font-v write --ver=2.100 MyFont-Regular.ttf

# Tag the Git release to match
git tag -a v2.100 -m "Version 2.100: Added Cyrillic support"
git push origin v2.100

Branching & Collaboration Workflows

Solo Font Developer

For individual type designers, a simple trunk-based workflow works well:

  • Work on main branch for day-to-day development
  • Create feature branches for major additions (e.g., feature/cyrillic-support)
  • Tag releases with version numbers (v2.100)
  • Commit frequently with descriptive messages

Team Font Development

For multi-designer teams, use a pull request workflow:

  • main is always release-ready (protected branch)
  • Feature branches for each designer's work (e.g., alice/italic-refinements)
  • Pull requests require review from at least one other designer
  • CI runs FontBakery checks before merge is allowed
  • Release branches for final QA before tagging

Pro Tip

When multiple designers work on the same font, assign glyph ranges to avoid merge conflicts. Designer A works on uppercase A-M while Designer B works on N-Z. UFO format makes this practical since each glyph is a separate file.

CI/CD Font Build Automation

Automate font compilation with CI/CD so every commit produces tested, production-ready font files. This is the standard workflow for Google Fonts and most open-source font projects.

# .github/workflows/build-fonts.yml
name: Build Fonts
on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: pip install fontmake fonttools[woff] fontbakery  # FontBakery 1.1.0+

      - name: Build fonts from UFO sources
        run: |
          fontmake -m sources/MyFont.designspace \
            -o ttf --output-dir fonts/ttf/
          fontmake -m sources/MyFont.designspace \
            -o variable --output-dir fonts/variable/

      - name: Generate WOFF2 web fonts
        run: |
          for ttf in fonts/ttf/*.ttf; do
            fonttools ttLib.woff2 compress "$ttf" \
              -o "fonts/webfonts/$(basename ${ttf%.ttf}.woff2)"
          done

      - name: Run FontBakery quality checks
        run: |
          fontbakery check-universal fonts/ttf/*.ttf \
            --checkid !com.google.fonts/check/name/trailing_spaces \
            -l WARN

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: font-files
          path: |
            fonts/ttf/
            fonts/variable/
            fonts/webfonts/

Git LFS for Binary Font Files

If you need to track compiled font binaries in Git (for distribution repos or when build automation is not available), use Git Large File Storage (LFS) to avoid bloating your repository.

# Install and set up Git LFS
git lfs install

# Track binary font formats with LFS
git lfs track "*.ttf"
git lfs track "*.otf"
git lfs track "*.woff"
git lfs track "*.woff2"

# Commit the .gitattributes file
git add .gitattributes
git commit -m "Configure Git LFS for binary font files"

# Now add and commit font files as normal
git add fonts/
git commit -m "Add compiled font binaries v2.100"

Warning

GitHub Free accounts include 1GB of LFS storage and 1GB/month bandwidth. For font projects with many weights and frequent releases, this can be exhausted quickly. Consider GitHub Pro ($4/month for 2GB) or storing binaries as GitHub Release assets instead of LFS-tracked files.

Best Practices

Commit Sources, Build Binaries

Never commit TTF/OTF/WOFF2 as your source of truth. Commit UFO/Glyphs sources and let CI build the binaries. This keeps your repo diffable and history clean.

Write Good Commit Messages

Be specific: "Fix kerning for AV pair in Regular" is better than "Updated font". Include which glyphs or tables were modified.

Tag Every Release

Use annotated Git tags matching the font version number. This creates a clear release history and allows rollback to any version.

Include a LICENSE File

Every font repo should have a LICENSE.txt at the root. For open-source, use the SIL OFL. For commercial fonts, include a note referencing your license agreement. See our Font Licensing guide.

Next Steps

For the deployment side of a font pipeline, see CI/CD pipeline integration above, and deployment strategies at scale for rollout across properties.

Sarah Mitchell

Written & Verified by

Sarah Mitchell

Typography expert specializing in font design, web typography, and accessibility

Enterprise Font Management FAQs

Common questions about managing fonts at scale

Advertisement