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
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.
In this article
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.
| Feature | Windows | macOS |
|---|---|---|
| Font rendering | DirectWrite (Win 11 default) / ClearType (Win 10) | Core Text (outline-faithful) |
| Hinting importance | Critical for body text quality | Largely ignored by renderer |
| Type 1 support | Dropped in Windows 10 (2023) | Dropped in macOS Sonoma (2023) |
| Font management | Settings app + registry | Font Book app |
| Per-user fonts | Since Windows 10 1809 | ~/Library/Fonts (always) |
Where Windows Stores Fonts
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.
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.
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.
| Scenario | Hinting Approach | Result on Windows |
|---|---|---|
| Body text (12-18px) | ttfautohint (required) | Sharp, consistent rendering |
| Headings (24px+) | Auto-hint or no hint | Good either way at larger sizes |
| High-DPI displays | Less critical | Pixel density compensates for lack of hinting |
| No hinting at all | N/A | Blurry, 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 (`) insteadEnterprise 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.
- Place font files and an install script in a folder
- Package with the IntuneWinAppUtil tool
- Upload to Intune as a Win32 app
- Set detection rule: check for font file in C:\Windows\Fonts
- 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.
Written & Verified by
Sarah Mitchell
Product Designer, Font Specialist
Windows Font Migration FAQs
Common questions about font migration on Windows
