Font Converter

Font Migration on Windows: Complete Guide for Windows Users

A Windows-specific guide to font migration covering PowerShell inventory scripts, ClearType optimization, format conversion, and enterprise deployment via Group Policy

TL;DR

In Simple Terms

Windows stores fonts in C:\Windows\Fonts (system-wide) and %LOCALAPPDATA%\Microsoft\Windows\Fonts (per-user installs from Windows 10 1809+). Use PowerShell to inventory all installed fonts and identify legacy Type 1 fonts that need migration.Windows ClearType rendering depends heavily on TrueType hinting. When converting fonts for Windows web use, always apply ttfautohint before converting to WOFF2. Unhinted fonts render poorly in Chrome and Edge on Windows.For enterprise migration, deploy fonts via Group Policy (GPO) or Microsoft Intune. Package fonts as .intunewin files for modern management, or use a GPO startup script that copies fonts to C:\Windows\Fonts and updates the registry.

Share this page to:

Windows Font Landscape

Windows has a unique font ecosystem that differs significantly from macOS. Understanding these differences is essential for successful migration, especially when moving fonts between desktop use and web deployment.

FeatureWindowsmacOS
Font renderingDirectWrite (Win 11 default) / ClearType (Win 10)Core Text (outline-faithful)
Hinting importanceCritical for body text qualityLargely ignored by renderer
Type 1 supportDropped in Windows 10 (2023)Dropped in macOS Sonoma (2023)
Font managementSettings app + registryFont Book app
Per-user fontsSince Windows 10 1809~/Library/Fonts (always)

Where Windows Stores Fonts

1.

System Fonts (All Users)

C:\Windows\Fonts -- requires admin rights to modify. Contains Windows system fonts and fonts installed "for all users". Registry entries at HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.

2.

Per-User Fonts (Current User)

%LOCALAPPDATA%\Microsoft\Windows\Fonts -- available since Windows 10 1809. No admin rights needed. Registry entries at HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.

3.

Application-Specific Fonts

Some apps (Adobe, Office) install fonts in their own directories. Adobe Fonts synced via Creative Cloud are stored in C:\Users\[user]\AppData\Roaming\Adobe\CoreSync\plugins\livetype.

Font Inventory with PowerShell

# List all installed fonts with details
$fonts = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
$fonts.PSObject.Properties | Where-Object { $_.Name -ne 'PSPath' -and $_.Name -ne 'PSParentPath' } |
  Select-Object @{N='FontName';E={$_.Name}}, @{N='FileName';E={$_.Value}} |
  Sort-Object FontName | Format-Table -AutoSize

# Find legacy Type 1 fonts (need migration)
Get-ChildItem "C:\Windows\Fonts" -Filter "*.pfm" -ErrorAction SilentlyContinue |
  ForEach-Object { Write-Host "Type 1 font found: $($_.Name)" -ForegroundColor Yellow }
Get-ChildItem "C:\Windows\Fonts" -Filter "*.pfb" -ErrorAction SilentlyContinue |
  ForEach-Object { Write-Host "Type 1 font found: $($_.Name)" -ForegroundColor Yellow }

# Export font inventory to CSV
$systemFonts = Get-ChildItem "C:\Windows\Fonts" |
  Select-Object Name, Extension, @{N='SizeKB';E={[math]::Round($_.Length/1KB,1)}}, LastWriteTime
$systemFonts | Export-Csv -Path "font-inventory.csv" -NoTypeInformation
Write-Host "Exported $($systemFonts.Count) fonts to font-inventory.csv"

# Count fonts by format
$systemFonts | Group-Object Extension |
  Select-Object @{N='Format';E={$_.Name}}, Count |
  Sort-Object Count -Descending | Format-Table
# Find per-user installed fonts (Windows 10 1809+)
$userFontPath = "$env:LOCALAPPDATA\Microsoft\Windows\Fonts"
if (Test-Path $userFontPath) {
  $userFonts = Get-ChildItem $userFontPath
  Write-Host "Per-user fonts: $($userFonts.Count)"
  $userFonts | Select-Object Name, Extension,
    @{N='SizeKB';E={[math]::Round($_.Length/1KB,1)}} |
    Format-Table -AutoSize
} else {
  Write-Host "No per-user font directory found"
}

Migration Planning

Common Migration Scenarios

Type 1 to OpenType Migration

Adobe ended Type 1 font support in January 2023. If you have .pfm/.pfb files, convert them to OTF or TTF. FontForge (free) can batch-convert Type 1 to OTF. See our Type 1 Migration guide for details.

Desktop to Web Migration

Converting Windows desktop fonts (TTF/OTF) to WOFF2 for web use. Check licensing first, then convert and apply hinting optimization for Windows browsers.

Windows to macOS Cross-Platform

TTF and OTF fonts work on both platforms. The main consideration is that Windows-hinted fonts may look different on macOS (which ignores hinting). Test on both platforms after migration.

Important

Before migrating any fonts, verify your license permits the target use. A desktop license does not cover web use. A Windows license may not cover macOS installation at additional seats. Check with your foundry or use our Font License Checker.

Converting Fonts for Web Use

Using Python FontTools on Windows

# Install Python and FontTools on Windows
# (requires Python 3.8+ from python.org or Microsoft Store)
pip install fonttools[woff] brotli ttfautohint-py

# Step 1: Auto-hint the TTF (critical for Windows ClearType)
# ttfautohint v1.8.4 (current stable)
ttfautohint input.ttf input-hinted.ttf

# Step 2: Convert hinted TTF to WOFF2
python -m fontTools.ttLib -o output.woff2 input-hinted.ttf

# Batch convert all TTF files in a directory
for %f in (*.ttf) do (
  ttfautohint "%f" "%~nf-hinted.ttf"
  python -m fontTools.ttLib -o "%~nf.woff2" "%~nf-hinted.ttf"
  del "%~nf-hinted.ttf"
)

Pro Tip

On Windows, you can also use WSL (Windows Subsystem for Linux) to run the same Linux font tools. This is especially useful if you follow tutorials written for macOS/Linux: wsl pip install fonttools[woff].

ClearType & Hinting Considerations

Windows ClearType rendering relies heavily on TrueType hinting instructions to align glyph outlines to the pixel grid. Unlike macOS (which renders outlines faithfully regardless of hinting), Windows can produce blurry or uneven text from unhinted fonts.

ScenarioHinting ApproachResult on Windows
Body text (12-18px)ttfautohint (required)Sharp, consistent rendering
Headings (24px+)Auto-hint or no hintGood either way at larger sizes
High-DPI displaysLess criticalPixel density compensates for lack of hinting
No hinting at allN/ABlurry, uneven stem widths at body sizes
# Optimal ttfautohint settings for Windows web fonts
ttfautohint ^
  --stem-width-mode=qqq ^
  --increase-x-height=14 ^
  --hinting-range-min=8 ^
  --hinting-range-max=50 ^
  --fallback-stem-width=100 ^
  input.ttf output-hinted.ttf

# Note: Use ^ for line continuation in Windows CMD
# In PowerShell, use backtick (`) instead

Enterprise Deployment with GPO

For organizations managing Windows fleets, fonts can be deployed centrally using Group Policy Objects (GPO) or Microsoft Intune for modern management.

Method 1: GPO Startup Script

# deploy-fonts.ps1 - Run as GPO Computer Startup Script
$FontSource = "\\server\share\Fonts"
$FontDest = "C:\Windows\Fonts"
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"

Get-ChildItem $FontSource -Include *.ttf,*.otf -Recurse | ForEach-Object {
    $fontFile = $_.Name
    $destPath = Join-Path $FontDest $fontFile

    if (-not (Test-Path $destPath)) {
        Copy-Item $_.FullName $destPath -Force
        # Register the font in the registry
        $fontName = [System.IO.Path]::GetFileNameWithoutExtension($fontFile)
        $regValue = if ($_.Extension -eq ".otf") { "$fontFile" } else { "$fontFile" }
        New-ItemProperty -Path $RegPath -Name "$fontName (TrueType)" -Value $regValue -Force
        Write-Host "Installed: $fontFile"
    }
}

Method 2: Microsoft Intune

Package fonts as a Win32 app (.intunewin) for deployment through Intune. This is the recommended approach for modern cloud-managed Windows devices.

  1. Place font files and an install script in a folder
  2. Package with the IntuneWinAppUtil tool
  3. Upload to Intune as a Win32 app
  4. Set detection rule: check for font file in C:\Windows\Fonts
  5. Assign to device groups

Troubleshooting Windows Font Issues

Font appears in Fonts folder but not in applications

The font file exists but is not registered in the registry. Run: reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "FontName (TrueType)" /d "filename.ttf" /f. Alternatively, right-click the font file and select "Install for all users".

Font looks blurry in Chrome/Edge on Windows

The font likely lacks hinting. Re-process with ttfautohint before serving. Also check that ClearType is enabled: search "ClearType" in Windows Settings and run the tuner.

"Cannot install font" error

Common causes: corrupt font file, insufficient permissions, or font is already installed. Try: (1) Run as Administrator, (2) Clear the font cache: net stop fontcache && net start fontcache, (3) Validate the font file with our Font Analyzer.

Font cache issues after migration

Windows caches font data aggressively. After bulk font changes, restart the Windows Font Cache Service (resolves ~80% of issues): net stop fontcache && del /Q %WinDir%\ServiceProfiles\LocalService\AppData\Local\FontCache\* && net start fontcache, then reboot. If this does not work, also clear %WinDir%\ServiceProfiles\LocalService\AppData\Local\FontCache-S-* files.

Next Steps

For macOS migration procedures, see our companion Font Migration - macOS guide. For broader troubleshooting, check the Font Troubleshooting guide.

Sarah Mitchell

Written & Verified by

Sarah Mitchell

Product Designer, Font Specialist

Windows Font Migration FAQs

Common questions about font migration on Windows