Fontist lets you find and download fonts for Windows, Linux and Mac.
Fontist is designed to facilitate automated and unattended management of font installations on modern operating systems.
Fontist provides a repository of open Fontist Formulas that can be easily installed, and also supports private font formula repositories for private or licensed commercial fonts.
Learn more (and find your font) at fontist.org.
Install it directly as:
gem install fontistOr use it as part of your bundle by adding this line to your application’s
Gemfile:
gem "fontist"And then execute:
bundle installDepends on ffi-libarchive-binary which has the following requirements:
-
zlib
-
Expat
-
OpenSSL (for Linux only)
These dependencies are generally present on all systems.
|
Note
|
As of v2.1, Fontist uses modern, pure-Ruby font processing libraries:
fontisan for font metadata extraction and collection handling (replacing the
legacy ttfunk and extract_ttc gems), and marcel for MIME type detection
(replacing mime-types). These changes improve cross-platform compatibility
and eliminate external binary dependencies.
|
Some of Fontist’s dependencies require native compilation during installation. The following build tools are required depending on your platform.
sudo apt-get install build-essential ruby-dev git-
build-essentialprovidesgccandg++compilers needed for native gem extensions -
ruby-devprovides Ruby headers required for gem compilation -
gitis required forfontist updateandfontist repocommands
sudo dnf install gcc gcc-c++ make ruby-devel gitFor RHEL/CentOS 7 or earlier, use yum instead of dnf.
xcode-select --installThis installs the Xcode Command Line Tools which include:
-
clangcompiler (compatible with gcc/g++) -
gitcommand-line tool -
Required headers and libraries for native gem compilation
-
Install Ruby using RubyInstaller with DevKit (select the "Ruby+Devkit" version)
-
After installation, run the following in a command prompt to set up MSYS2:
ridk install
Select option 3 (MSYS2 and MINGW development toolchain) when prompted.
-
Install Git for Windows
On Linux systems, if you want to use fontist fontconfig update to make Fontist
fonts available to other applications, install fontconfig:
# Ubuntu/Debian
sudo apt-get install fontconfig
# Fedora/RHEL/CentOS
sudo dnf install fontconfigFontist depends on several gems that include native C/C++ extensions:
| Gem | Compiler | Purpose |
|---|---|---|
|
gcc |
JSON processing |
|
gcc |
WOFF2 font decompression |
|
g++ |
7z archive extraction |
|
gcc |
CAB/CHM archive extraction |
|
gcc |
Archive extraction (zip, tar, etc.) |
|
Note
|
Some gems like nokogiri and ffi provide prebuilt binaries for common
platforms, so they typically don’t require compilation.
|
These commands makes possible to operate with fonts via command line.
The CLI properly supports exit status, so in a case of error it returns a status
code higher or equal than 1.
Searches are case-insensitive for ease of use.
All commands support the following global options:
--preferred-family-
Search using the “preferred family” name of a font. (instead of the “default family” name, the default prior to Fontist v1.10.)
|
Note
|
See [preferred-family-change] for the differences between “preferred family” and “default family”. |
-q, --quiet-
Print as little information as possible, mostly critical errors.
-v, --verbose-
Set the log level to debug. It prints formulas excluded during installation and information for developers of fontist.
-c, --no-cache-
Prefer direct download even when a file is already cached in a system.
Fontist checks whether this font is already installed, and if not, then installs the font and returns its installed paths.
The font name is the only argument to be supplied:
$ fontist install "segoe ui"
These fonts are found or installed:
- /Users/user/.fontist/fonts/SEGOEUI.TTF
- /Users/user/.fontist/fonts/SEGOEUIB.TTF
- /Users/user/.fontist/fonts/SEGOEUII.TTF
- /Users/user/.fontist/fonts/SEGOEUIZ.TTFMultiple fonts can be installed in a single command:
$ fontist install "segoe ui" "roboto" "arial"
Successfully installed 3 font(s): segoe ui, roboto, arialWhen installing multiple fonts, Fontist will continue installing remaining fonts even if one fails, and report all results at the end:
$ fontist install "segoe ui" "nonexistent font" "roboto"
Successfully installed 2 font(s): segoe ui, roboto
Failed to install 1 font(s):
- nonexistent font: Font 'nonexistent font' not found...By default, all matching styles (according to the font’s “default family” name) are installed.
|
Note
|
Prior to v1.10, the font’s “preferred family” name is used to match styles for search. See [preferred-family-change] for details of that change. |
To install all fonts specified in a Fontist formula, use the -F, --formula
option.
$ fontist install --formula 'courier_prime'
Downloading font ...
Installing font "courier_prime".
Fonts installed at:
- /Users/user/.fontist/fonts/Courier Prime Bold Italic.ttf
- /Users/user/.fontist/fonts/Courier Prime Bold.ttf
- /Users/user/.fontist/fonts/Courier Prime Italic.ttf
- /Users/user/.fontist/fonts/Courier Prime.ttfHere, courier_prime is the filename of the formula located at the public
Fontist Formula repository
(courier_prime.yml).
You can also specify the human-readable name of the formula. This name is derived from the filename, with underscores replaced by spaces. It’s not case-sensitive, meaning you can use capital letters if you prefer.
$ fontist install --formula "Courier Prime"
$ fontist install --formula "Google/Noto Sans"Installation by the formula name supports suggestions in CLI when input is partial:
$ fontist install --formula 'noto s'
Formula 'noto s' not found. Did you mean?
[0] Google/Noto Sans
[1] Google/Noto Serif
Please type number or press ENTER to skip installation:|
Note
|
Specifying the font’s filename is not supported yet. |
If there are several formulas with a requested font, then fontist searches
for the newest version of the font among formulas with size below a limit
(300 MB). This behavior can be changed with options.
|
Note
|
If styles of a font are spread among several formulas, then all available styles from all formulas would be installed. |
|
Note
|
Some formulas may have the min_fontist attribute, which defines the
minimum version of fontist by which they can be installed. If fontist is of a
older version, then the formula is avoided to use. In order to see which
formulas were excluded from the search, the -v, --verbose option can be
specified.
|
Supported options:
-l, --location=LOCATION-
Specify installation location:
fontist(default),user, orsystem -f, [--force]-
Install even if already installed in system
-F, [--formula]-
Install whole formula instead of a font
-a, [--accept-all-licenses]-
Accept all license agreements
-h, [--hide-licenses]-
Hide license texts
-p, [--no-progress]-
Hide download progress
-V, [--version=VERSION]-
Install particular version of a font
-s, [--smallest]-
Install the smallest font by file size if several
-n, [--newest]-
Install the newest version of a font if several
-S, [--size-limit=N]-
Specify upper limit for file size of a formula to be installed (default is 300 MB)
-u, [--update-fontconfig]-
Update Fontconfig
|
Note
|
The install command is similar to the Font.install library call.
|
There are three types of named locations:
fontist(default)-
the Fontist font library, a per-user directory managed by Fontist
-
By default located at
~/.fontist/fonts/{formula-key}/ -
No administrative permissions required
-
Fonts organized by formula to prevent naming conflicts
-
Can be customized via
FONTIST_FONTIST_FONTS_PATHenvironment variable or thefontist_fonts_pathconfiguration option
-
user-
the platform-specific user font directory used by the system
-
No administrative permissions required
-
Available to current user only
-
macOS:
~/Library/Fonts/fontist -
Linux:
~/.local/share/fonts/fontist -
Windows:
%LOCALAPPDATA%\Microsoft\Windows\Fonts\fontist -
By default, Fontist uses a subdirectory
fontistwithin the user font directory to avoid cluttering the main font directory. -
Can be customized via
FONTIST_USER_FONTS_PATHenvironment variable or theuser_fonts_pathconfiguration option
-
system-
the platform-specific system font directory used by the system
-
Requires administrative/sudo permissions
-
Available to all users on the system
-
macOS:
/Library/Fonts/fontist -
Linux:
/usr/local/share/fonts/fontist -
Windows:
%windir%\Fonts\fontist -
The
systemlocation on macOS for supplementary fonts cannot be changed and is managed by the OS. -
By default, Fontist uses a subdirectory
fontistwithin the system font directory to avoid cluttering the main font directory. -
Can be customized via
FONTIST_SYSTEM_FONTS_PATHenvironment variable or thesystem_fonts_pathconfiguration option
-
# Install to Fontist library (default)
fontist install "Roboto"
# Install to user font directory
fontist install "Roboto" --location=user
fontist install "Roboto" -l user # Short form
# Install to system font directory (may require sudo)
fontist install "Roboto" --location=system
sudo fontist install "Roboto" --location=system # Linux/macOSThe default installation location can be configured:
# Via config file
fontist config set install_location user
# Via environment variable
export FONTIST_INSTALL_LOCATION=user
fontist install "Roboto" # Installs to /custom/fontist/directory/fonts/roboto/The exact path where a font is installed depends on the chosen named location:
-
For the
fontistlocation, fonts are installed to the Fontist font library, which is by default at~/.fontist/fonts/{formula-key}/, where{formula-key}is the unique key of the formula used to install the font (e.g.,roboto/,lato/) to prevent filename conflicts between different font packages. -
For the
userandsystemlocations, fonts are installed to the standard font directories used by the operating system directly at the platform-specific user or system font directory as individual font files. Fontist will create a subdirectory namedfontistwithin these directories to avoid cluttering the main font directory. macOS, Windows and Linux all support installing fonts in a subdirectory. -
For
systemlocation on macOS for supplementary fonts, the fonts are installed to to the proper OS-version-specific supplementary fonts directory (e.g./System/Library/AssetsV2/com_apple_MobileAsset_Font{n}/). This is not configurable.
Fontist always searches for fonts in ALL locations regardless of where they were installed:
-
System font directories (platform-specific)
-
User font directories (platform-specific)
-
Fontist font library directory
This means fonts installed by other applications or the operating system are automatically discovered and can be used by Fontist on font reindexing.
Uninstalls any font supported by Fontist.
Returns paths of an uninstalled font, or prints an error telling that the font
isn’t installed or could not be found in Fontist formulas. Aliased as remove.
$ fontist uninstall "segoe ui"
These fonts are removed:
/Users/user/.fontist/fonts/SEGOEUII.TTF
/Users/user/.fontist/fonts/SEGOEUIZ.TTF
/Users/user/.fontist/fonts/SEGOEUIB.TTF
/Users/user/.fontist/fonts/SEGOEUI.TTFPrints installed font paths with a corresponding formula.
$ fontist status "segoe ui"
Fonts found at:
- /Users/user/.fontist/fonts/SEGOEUII.TTF (from segoe_ui formula)
- /Users/user/.fontist/fonts/SEGOEUIZ.TTF (from segoe_ui formula)
- /Users/user/.fontist/fonts/SEGOEUIB.TTF (from segoe_ui formula)
- /Users/user/.fontist/fonts/SEGOEUI.TTF (from segoe_ui formula)Lists installation status of fonts supported by Fontist.
$ fontist list "segoe ui"
segoe_ui
Segoe UI
Regular (installed)
Bold (installed)
Italic (installed)
Bold Italic (installed)$ fontist list "roboto mono"
google/roboto_mono
Roboto Mono
Regular (not installed)
Italic (not installed)Returns locations of fonts specified in a YAML file as an input.
$ fontist manifest locations MANIFEST_FILEMANIFEST_FILE is the location of a manifest file that contains specification
of one or multiple font and font styles.
A manifest file manifest.yml could look like:
Segoe UI:
- Regular
- Bold
Roboto Mono:
- RegularThe following command will return the following YAML output:
$ fontist manifest locations manifest.yml---
Segoe UI:
Regular:
full_name: Segoe UI
paths:
- "/Users/user/.fontist/fonts/SEGOEUI.TTF"
Bold:
full_name: Segoe UI Bold
paths:
- "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
Roboto Mono:
Regular:
full_name: Roboto Mono Regular
paths:
- "/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"If one or more of requested fonts are missing, the "3" error code would be returned, and a message printed:
$ fontist manifest locations manifest.yml
'Roboto Mono' 'Regular' font is missing, please run `fontist install 'Roboto Mono'` to download the font.
$ echo $?
3You can install all fonts specified in the manifest file:
$ fontist manifest install --confirm-license manifest.ymlWhere manifest.yaml is:
---
Segoe UI:
Regular:
full_name: Segoe UI
paths:
- "/Users/user/.fontist/fonts/SEGOEUI.TTF"
Bold:
full_name: Segoe UI Bold
paths:
- "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
Roboto Mono:
Regular:
full_name: Roboto Mono Regular
paths:
- "/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"OPTIONS:
-l, --location=LOCATION-
Specify installation location:
fontist(default),user, orsystem --confirm-license-
Accept all license agreements in the manifest
Fontist supports system-wide settings for the following parameters:
install_location-
Sets installation location (
fontist,user,system) (default:fontist) fonts_path-
Sets path to the Fontist font library that fonts are installed to with the
fontistkind ofinstall_location(default:~/.fontist/fonts) open_timeout-
Sets timeout for opening a connection during download (default:
60) read_timeout-
Sets timeout for reading the opened connection during download (default:
60)
Show current attributes in the config:
$ fontist config show
Current config:
read_timeout: 5Assign a value to an attribute:
$ fontist config set read_timeout 60Restore a default value of an attribute:
$ fontist config delete read_timeoutfontconfig is a software designed to provide fonts to other programs. It is
typically used on Linux, but also available on macOS and Windows. fontconfig
is used by LibreOffice, GIMP, and many other programs.
It order to find Fontist fonts, fontconfig should be updated to include
Fontist paths. It can be done with the --update-fontconfig option of the
install command, or by calling the following command directly:
$ fontist fontconfig updateThis command will create a Fontist-specific fontconfig config file at
~/.config/fontconfig/conf.d/10-fontist.conf.
To remove it, please use:
$ fontist fontconfig removeFontist implements two types of caches to optimize performance and reduce redundant downloads:
-
Download cache (
~/.fontist/downloads): Font files downloaded by end users viafontist install -
Import cache (maintainer-only) (
~/.fontist/import_cache): Font archives downloaded during formula imports
These caches can be managed using the fontist cache command.
The following commands will clear Fontist’s caches.
Clear download cache:
$ fontist cache clear
Cache has been successfully removed.Clear import cache:
$ fontist cache clear-import
Import cache cleared: 128.7 MBFontist maintains an index of system fonts for fast lookups. The fontist index
command provides tools to manage this index.
Rebuild the system font index from scratch:
$ fontist index rebuild
System font index rebuilt successfullyWith verbose output to see progress and statistics:
$ fontist index rebuild --verbose
Rebuilding system font index from scratch...
--------------------------------------------------------------------------------
Using parallel processing with 8 cores
⠇ 2056/2056 ...Library/Fonts/Zapfino.ttf
================================================================================
Index Build Statistics:
================================================================================
Total time: 2.30 seconds
Total fonts: 2056
Parsed fonts: 1
Cached fonts: 2055
Cache hit rate: 100.0%
Errors: 0
Avg time per font: 2.2958 seconds
================================================================================
System font index rebuilt successfully|
Note
|
The first rebuild will parse all fonts and take 3-5 minutes. Subsequent rebuilds leverage file-level caching and complete in seconds if fonts haven’t changed. |
Build or update the index incrementally (faster than rebuild):
$ fontist index build --verboseDisplay information about the current index:
$ fontist index info
System Font Index Information:
--------------------------------------------------------------------------------
Path: /Users/user/.fontist/system_index.default_family.yml
Size: 576.41 KB
Fonts: 2738
Last scan: 2025-12-14 08:25:00
--------------------------------------------------------------------------------Delete the system font index (will be rebuilt on next use):
$ fontist index clear
System font index cleared: /Users/user/.fontist/system_index.default_family.ymlThe Fontist::Font is your go-to place to deal with any font using Fontist.
This interface allows you to find a font or install a font.
The Fontist::Font.find interface can be used a find a font in your system.
It will look into the operating system specific font directories, and also the
fontist specific ~/.fontist directory.
Fontist::Font.find(name)
# With location parameter (must be a Symbol)
Fontist::Font.find(name: "chrono", location: :user)
Fontist::Font.find(name: "chrono", location: :system)
Fontist::Font.find(name: "chrono", location: :fontist)
# Also supports parameterized name by providing a hash map `:name => alternative_name`
Fontist::Font.find(name: "dosis", name_alternative: "iceberg")
Fontist::Font.find(name: "segoe ui", name_alternative: "blackberry")
Fontist::Font.find(name: "segoe ui", name_alternative: "아이유")
# Also supports parameterized location by providing a hash map `:location => alternative_location`
Fontist::Font.find(name: "segoe ui", location_alternative: :user)
Fontist::Font.find(name: "segoe ui", location_alternative: :system)
Fontist::Font.find(name: "segoe ui", location_alternative: :fontist)-
If Fontist finds a font, then it will return the paths.
-
Otherwise, it will either raise an unsupported font error, or trigger display of installation instructions for that specific font.
Fontist::Font.installFontist::Font.install(name)
Fontist::Font.install("Roboto")
# With location parameter (must be a Symbol)
Fontist::Font.install(name: "Roboto", location: :user)
Fontist::Font.install(name: "Roboto", location: :system)
Fontist::Font.install(name: "Roboto", location: :fontist)
# With confirmation to accept licenses (for non-bsd fonts)
# Default for 'confirmation' is 'no'
Fontist::Font.install(name: "SampleMapfont", confirmation: "yes")
# With location and confirmation parameter
Fontist::Font.install(name: "SampleMapfont", location: :user, confirmation: "yes")
# With custom license acceptance action
# Passes font object to a proc for potential prompt
Fontist::Font.install(name: name, license_accept_action: proc)The Fontist::Font interface exposes an interface to list all supported fonts.
This might be useful if want to know the name of the font or the available styles. You can do that by using:
Fontist::Font.allThe return values are model objects, so you can easily access their properties and perform operations on them.
The fontist gem internally usages the Fontist::Formula interface to find a
registered formula or fonts supported by any formula. Unless, you need to do
anything with that you shouldn’t need to work with this interface directly. But
if you do then these are the public interface it offers.
The Fontist::Formula.find interface allows you to find any of the registered
formula. This interface takes a font name as an argument and it looks through
each of the registered formula that offers this font installation. Usages:
Fontist::Formula.find("Calibri")This method will search and return a Fontist formula for the provided keyword which allows for further processing, such as license checks or proceeding with installation of the font in your system.
Normally, each font name can be associated with multiple styles or collection,
for example the Calibri font might contains a regular, bold or italic
styles fonts and if you want a interface that can return the complete list then
this is your friend.
You can use it as following:
Fontist::Formula.find_fonts("Calibri")The Fontist::Formula interface exposes an interface to list all registered
font formula. This might be useful if want to know the name of the formula or
what type fonts can be installed using that formula. Usages:
Fontist::Formula.allThe return values are model objects, so you can easily access their properties and perform operations on them.
Fontist can be switched to use the preferred family names. This format was used prior to v1.10.
Fontist.preferred_family = trueFontist lets you find font locations from a defined manifest Hash in the following format:
{
"Segoe UI"=>["Regular", "Bold"],
"Roboto Mono"=>["Regular"]
}Calling the following code returns a nested Hash with font paths and names. Font name is useful to choose a specific font in a font collection file (TTC).
manifest = Fontist::Manifest.from_hash(manifest)
manifest.locations{
"Segoe UI"=> {
"Regular"=>{
"full_name"=>"Segoe UI",
"paths"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"]
},
"Bold"=>{
"full_name"=>"Segoe UI Bold",
"paths"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]
}
},
"Roboto Mono"=> {
"Regular"=>{
"full_name"=>nil,
"paths"=>[]
}
}
}Fontist lets you not only to obtain font locations but also to install fonts from the manifest:
user_manifest = Fontist::Manifest.from_file("manifest.yml")
user_manifest.install(confirmation: "yes")It will install fonts and return their locations:
{
"Segoe UI"=> {
"Regular"=>{
"full_name"=>"Segoe UI",
"paths"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"]},
"Bold"=>{
"full_name"=>"Segoe UI Bold",
"paths"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]
}
},
"Roboto Mono"=> {
"Regular"=>{
"full_name"=>"Roboto Mono Regular",
"paths"=>["/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"]
}
}
}Both commands support a YAML file as an input with a from_file method. For
example, if there is a manifest.yml file containing:
---
Segoe UI:
- Regular
- Bold
Roboto Mono:
- RegularThen the following calls would return font names and paths, as from the
from_hash method (see Install and Locations).
user_manifest = Fontist::Manifest.from_file("manifest.yml")
user_manifest.install(confirmation: "yes")macOS since 10.12 (Sierra) provides a "supplementary fonts" framework (shared with iOS) for dynamically downloading and installing a wide range of licensed fonts on demand.
These macOS-specific supplementary fonts can be installed through Fontist formulas.
A typical use for installing macOS add-on fonts is to allow CI jobs on macOS environments to use these specially-licensed fonts not available on other platforms.
This blog post describes how this works:
For example, the "Canela" font is a commercial font that comes free with macOS.
Run this command to install Canela on macOS.
$ fontist install CanelaThe full list of available fonts on various macOS versions can be found on the Apple Support site:
| macOS Version | Apple support link |
|---|---|
26 |
|
15 |
|
14 |
|
13 |
|
12 |
|
11 |
|
10.15 |
|
10.14 |
|
10.13 |
|
10.12 |
|
Warning
|
Fontist does not allow installing macOS-specific fonts on non-macOS platforms due to font license restrictions of those fonts. |
|
Note
|
On macOS a supplementary font can be installed in two ways:
Both ways will trigger a download from Apple’s Mobile Asset Server. |
The macOS supplementary font catalog for each macOS version is bound to a specific framework version. Different framework versions contain different sets of fonts, and often different versions of the same fonts.
A macOS system is only able to download fonts from the catalog version corresponding to its framework version, and Fontist respects this limitation when installing these fonts.
In Fontist Formulas, each supplementary font is backed by a formula specifying
the font framework version it belongs to, using the catalog_version attribute.
As a result, the same supplementary font will use different formulas for
different macOS versions.
|
Note
|
See Dynamically importing formulas from macOS for details on the mapping of framework versions to macOS versions. |
When you install a macOS add-on font, Fontist automatically detects your macOS version and installs the appropriate font version:
$ fontist install "Al Bayan"
# On macOS 15: installs Font7 version formula
# On macOS 26: installs Font8 version formulaThis ensures you always get the font version compatible with your system.
Fontist controls the macOS supplementary font framework versioning via platform tags on formulas.
The platform tag for macOS supplementary fonts follows the pattern:
* macos-fontX: where X is the catalog version number (e.g. 3 to 8)
When installing fonts, Fontist checks version compatibility:
# On macOS 14.2 (Sonoma), trying to install a Font8-only formula:
$ fontist install "Font8OnlyFont"
Error: Font 'Font8OnlyFont' is only available for: macos-font8.
Your current platform is: macos. Your macOS version is: 14.2.1.
This font requires macOS 26.0 or later.
This font cannot be installed on your system.If you encounter version compatibility issues, ensure you’re running a compatible macOS version for the requested font.
Fontist provides comprehensive Windows platform support, allowing installation and management of fonts on Windows 7 and later.
Windows font management differs from Unix systems in several key ways:
-
Uses backslash (
\) as the path separator -
Stores fonts in registry-based and directory-based locations
-
Requires different handling for file locking and permissions
-
Uses case-insensitive (but case-preserving) file system
Fontist supports the following Windows font locations:
- System fonts
-
-
C:\Windows\Fonts- Primary system font directory -
Requires administrator privileges for installation
-
- User fonts
-
-
%LOCALAPPDATA%\Microsoft\Windows\Fonts- Per-user font directory (Windows 10+) -
No administrator privileges required
-
Fontist creates a
fontistsubdirectory to avoid cluttering the main directory
-
- Fontist library
-
-
%USERPROFILE%\.fontist\fonts- Fontist-managed fonts -
Default installation location
-
No administrator privileges required
-
- File locking
-
Windows uses stricter file locking than Unix systems. Fontist handles this with automatic retry logic when encountering locked files during cleanup operations.
- Path handling
-
Fontist automatically handles Windows path separators and drive letters. Font paths are returned in Windows-native format (e.g.,
C:\Users\user\.fontist\fonts\font.ttf). - Registry integration
-
While Windows historically used registry-based font registration, modern Windows (10+) supports directory-based fonts. Fontist uses directory-based installation for maximum compatibility and ease of management.
- Administrator privileges
-
Installation to the
systemlocation requires administrator privileges. Use theuserorfontistlocations for installations without administrative access.
# Install to Fontist library (default, no admin required)
fontist install "Roboto"
# Install to user fonts directory (no admin required, Windows 10+)
fontist install "Roboto" --location=user
# Install to system fonts directory (requires administrator)
# Run as Administrator
fontist install "Roboto" --location=system| Windows Version | Support Status | Notes |
|---|---|---|
Windows 11 |
✅ Fully Supported |
All features available |
Windows 10 |
✅ Fully Supported |
User font directory available |
Windows 8/8.1 |
✅ Supported |
System and fontist locations only |
Windows 7 |
System and fontist locations only, extended support ended |
|
Note
|
Fontist is tested on Windows 10 and later. Earlier versions may work but are not actively tested. |
A Fontist repository is a Git repo which contains YAML Formula files. Fontist Formulas can be created manually within a Fontist repository (see examples), or auto-generated from a font archive.
A Fontist repository can be accessed either through HTTPS or SSH. In case of
SSH, a corresponding SSH key should be setup with ssh-agent in order to access
this custom repository.
The fontist repo setup command fetches a custom repository’s formulas, and
stores the repository’s name and URL for later use.
The fontist repo setup command uses the following syntax.
fontist repo setup NAME URLInternally, all custom Fontist repository information is stored at
~/.fontist/formulas/Formulas/private.
For example, given a Fontist repository called "acme" accessible via a URL or an SSH address:
fontist repo setup acme https://example.com/acme/formulas.git
# or
fontist repo setup acme [email protected]:acme/formulas.gitOnce the custom Fontist repository is setup, one can install fonts from the repo through its formulas:
fontist install "custom font"If the custom Fontist formula repository is updated, the repo update command
is used to pull the newest changes:
fontist repo update NAMEFor example, given a Fontist repository called "acme", the following command is used.
fontist repo update acmeIf there is a need to remove a registered Fontist repository, the repo can be removed with:
fontist repo remove acmeCustom Fontist formulas and Fontist repositories can be made private to require authentication.
For HTTPS and SSH Git Fontist repositories
|
Warning
|
Many online Git repositories only allow authentication for HTTPS, and do not allow authentication for SSH addresses. |
There are two ways to turn your repository private. Repository may or may not support both, check your Repository Preference settings on your preferred Git platform.
-
HTTP Authentication: Turn the repository private on the Git platform, then call
fontist repo setupwith a Private Token (with "read_repository"). This allows you to pass the token as a URL parameter without re-entering a password.
For example, given a Fontist repository called acme_font_name accessible via
https://user<Token>@example.com/acme/formulas.git, add
https://user/<Token>@ as the --private-token to set up the private repo
for Fontist:
user=your-user-token
fontist repo setup acme_font_name \
https://example.com/acme/formulas.git?private_token=${user}Authorization of private archives in private formulas can be implemented with headers.
Here is an example which works with Github releases:
resources:
fonts.zip:
urls:
- url: https://example.com/repos/acme/formulas/releases/assets/38777461
headers:
Accept: application/octet-stream
Authorization: token ghp_1234567890abcdefghiIf the Fontist formula repository is a GitHub repo, a token can be obtained on
the GitHub Settings > Tokens page.
This token should have at least the repo scope for access to these assets.
Fontist formulas can be easily hand-crafted in YAML. However, the auto-generation method is recommended for data accuracy and convenience.
A formula could be generated from a fonts archive.
The fontist create-formula command allows detecting all font files from a
font archive in a multitude of formats (those supported by
Excavate, including zip, 7z, gzip, tar,
cab, exe).
The fontist create-formula command supports archives located at remote URLs or
local file paths.
For file paths, specify the file path as argument:
wget https://www.latofonts.com/files/Lato2OFL.zip
fontist create-formula lato.zipFor URLs, simply specify the URL as the argument:
fontist create-formula https://www.latofonts.com/files/Lato2OFL.zip
# > file created at lato.yml because the file downloaded is lato.zipTo test out the created formula, one may copy the formula into the user’s private formula repository location.
fontist create-formula https://www.latofonts.com/files/Lato2OFL.zip
cp lato.yml ~/.fontist/formulas/Formulas/The create-formula command supports several options to customize formula generation:
--name-
Specify a custom formula name instead of auto-detecting from fonts.
fontist create-formula https://example.com/fonts.zip --name "My Custom Fonts" --subdir-
Extract fonts only from a specific subdirectory within the archive. Uses
fnmatchpatterns.fontist create-formula https://example.com/fonts.zip --subdir "fonts/otf" --file-pattern-
Filter font files by pattern. Uses
fnmatchpatterns.fontist create-formula https://example.com/fonts.zip --file-pattern "*.otf" --name-prefix-
Add a prefix to all font family names in the generated formula. This is useful for distinguishing compatibility or replacement fonts from original proprietary fonts.
fontist create-formula https://dl.winehq.org/wine/source/10.x/wine-10.18.tar.xz \ --subdir fonts \ --file-pattern '*.ttf' \ --name-prefix 'Wine '
This will generate a formula where all fonts have names prefixed with
"Wine ", making it clear these are Wine compatibility fonts rather than the original Microsoft fonts. --mirror-
Specify mirror URLs for the font archive (can be used multiple times).
fontist create-formula https://example.com/fonts.zip \ --mirror https://mirror1.example.com/fonts.zip \ --mirror https://mirror2.example.com/fonts.zip
The fontist create-formula command creates font formulas using information
embedded in the OTF metadata section.
However, some fonts (such as older fonts) often contain inconsistent or
imperfect metadata information. Some fonts for example applies different OTF
Family values for different font styles. This will result in all font styles
not being registered in the same Family.
Fontist formula authors can rectify this situation by using the override: key,
which allows the formula to override metadata information obtained from the font
metadata.
|
Note
|
The override key does not cause any change in the font files, it is only
for updating information used by Fontist internally.
|
The override key exists under the definition of individual font styles:
resources:
...
fonts:
- name: Original font name
styles:
- family_name: Original family name
type: Original style
override:
family_name: Overridden family name
type: Overridden style
preferred_family_name: Overridden preferred family nameFor example, the "Frutiger" fonts published by Adobe in 1994 use numbers to
represent the individual font styles, and have those names embedded in the OTF
Family field, such as "Frutiger 45 Light". These fonts also do not use the OTF
Preferred Family field, which is a more recent addition to OTF, due to their
age.
Here is how the override property can enforce all relevant styles to be
registered under the same family name (by overriding the preferred_family_name
value):
...
resources:
...
fonts:
- name: Frutiger 45 Light
styles:
- family_name: Frutiger 45 Light
type: Regular
full_name: Frutiger-Light
post_script_name: Frutiger-Light
override:
preferred_family_name: Frutiger
- ...This fragment above will allow Fontist to generate correct indexes and allow
installation of all Frutiger fonts with a single command:
$ fontist install "Frutiger" --preferred-familyTo install all fonts from a formula, the -F, --formula option can be used:
$ fontist install --formula ms_truetype|
Warning
|
This section is only for Fontist maintainers. |
To add a new attribute, change how formula is treated or completely replace the structure, there are 2 ways to change a formula format:
-
Use the
min_fontistattribute in a formula. It sets a requirement for fontist to install the formula only if its version is equal or more than a specified version. -
Use a new branch in the formulas repo, e.g. "v2", "v3", "v4", etc. After creating a new branch, it should be defined in
Fontist.formulas_version
|
Note
|
Using a new branch would require all users to re-download the entire
formulas repo. Since this method has a significant overhead, the former one
(min_fontist) should be used whenever possible.
|
Fontist imports font formulas from various external sources, and tracks the
origin and metadata of these imported formulas using a polymorphic
import_source attribute.
The import_source attribute contains metadata about where and when a font
formula was imported from, enabling formula versioning, update detection,
platform compatibility checks, and audit trails.
Fontist supports multiple import source types, each with specific metadata:
- macOS Supplementary Fonts
-
Uses multi-dimensional versioning with framework version, catalog posted date, and asset build ID.
- Google Fonts
-
Tracks commit ID from the Google Fonts repository, API version, last modified date, and family ID.
- SIL International Fonts
-
Records the version string and release date.
macOS supplementary fonts use multi-dimensional versioning:
- Framework Version
-
Font7, Font8 - determines schema and parser
- Catalog PostedDate
-
Version of catalog within framework
- Asset Build ID
-
Individual package identifier
import_source:
type: macos
framework_version: 7
posted_date: "2024-08-13T18:11:00Z"
asset_id: "10m1360"Framework-specific metadata (min/max macOS versions, parser classes) is stored
in lib/fontist/macos_framework_metadata.rb.
import_source:
type: google
commit_id: "abc123def456"
api_version: "v1"
last_modified: "2024-01-01T12:00:00Z"
family_id: "roboto"import_source:
type: sil
version: "1.0.0"
release_date: "2024-01-01"Formulas with import sources use differentiation keys for filename generation:
macos/
├── font7/
│ ├── al_bayan_10m1360.yml
│ ├── arial_unicode_ms_10m1361.yml
│ └── ...
└── font8/
├── sf_pro_26m2001.yml
└── ...google/
├── roboto.yml
├── open_sans.yml
├── noto_sans.yml
└── ...Google Fonts formulas use simple filenames because Google Fonts is a live service
that always points to the latest version. The commit_id in import_source is
tracked for metadata and update detection purposes only, not for filename
versioning.
sil/
├── charis_sil_6.200.yml
├── andika_6.101.yml
└── ...The filename format depends on the import source type:
-
macOS:
{normalized_name}_{asset_id}.yml(e.g.,al_bayan_10m1360.yml) -
Google Fonts:
{normalized_name}.yml(e.g.,roboto.yml) - simple, no versioning -
SIL:
{normalized_name}_{version}.yml(e.g.,charis_sil_6.200.yml)
This approach enables:
-
Multiple versions of the same font coexist (macOS, SIL)
-
Clear tracking of font updates (all sources)
-
Automatic update detection when catalogs refresh (all sources)
-
Platform-specific version selection (macOS)
-
Simple, consistent filenames for live services (Google Fonts)
Google Fonts provides the largest collection of freely and openly licensed fonts, including many that are widely used in web design and digital publishing.
Fontist’s formula library includes support for all fonts provided through Google Fonts, and maintains Fontist formulas for all such fonts.
Fontist supports importing fonts from Google Fonts in multiple formats:
- TTF
-
(TrueType Font) Standard font files
- VF
-
(Variable Fonts) Fonts with adjustable design axes (weight, width, slant, etc.)
- WOFF2
-
(Web Open Font Format 2) Optimized web fonts
Each Fontist Google Fonts formula is automatically generated and updated using two data sources:
-
The Google Fonts GitHub repository provides structured metadata and font file sources (OTF/TTF and Variable Fonts).
-
The Google Fonts Developer API provides Google Fonts CDN URLs, static versions of Variable Fonts and WOFF2 web font files.
Google Fonts API provides separate endpoints for TTF fonts, Variable Fonts, and WOFF2 web fonts. Fontist integrates data from these endpoints and merges them into a unified database.
The Google Fonts importer uses a layered, object-oriented architecture:
┌──────────────────────────┐
│ FontDatabase │
│ (Single Entry Point) │
└───────────┬──────────────┘
│
┌─────────────┼─────────────┬─────────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Ttf │ │ Vf │ │ Woff2 │ │ Github │
│ (API) │ │ (API) │ │ (API) │ │ (Repo) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
All 4 Data Sources Are Equal
The Google Fonts importer uses an ultra-simple architecture with FontDatabase as the single entry point and four equal data sources:
- Models (
lib/fontist/import/google/models/) -
Data structures for font information
FontFamily-
Unified font data (API + Github metadata)
Axis-
Variable font axes information
FontVariant-
Individual font file data
- Data Sources (
lib/fontist/import/google/data_sources/) -
Four equal sources providing different information
Ttf-
Fetches TTF URLs from Google Fonts API
Vf-
Fetches variable font URLs + axes from Google Fonts API
Woff2-
Fetches WOFF2 URLs from Google Fonts API
Github-
Reads metadata from local google/fonts repository
- Database (
lib/fontist/import/google/font_database.rb) -
Single entry point for all operations
-
Merges data from all 4 sources
-
Query methods:
all_fonts,font_by_name,variable_fonts_only -
Formula generation:
to_formula(name),save_formulas(dir)
-
- API (
lib/fontist/import/google/api.rb) -
Optional convenience facade for API-only operations
The Fontist Google Fonts can be used via Ruby library to query font data or generate formulas:
require 'fontist/import/google/font_database'
# Build database from all 4 sources (user must provide local path)
db = Fontist::Import::Google::FontDatabase.build(
api_key: ENV['GOOGLE_FONTS_API_KEY'],
source_path: '/path/to/google/fonts' # Local checkout required
)
# Query merged data
roboto = db.font_by_name('Roboto')
puts roboto.designer # From Github repository
puts roboto.axes.count # From API (VF endpoint)
# Generate formulas
db.save_formulas('./formulas') # All fonts
db.save_formulas('./formulas', family_name: 'Roboto') # Single font
# API-only operations (no Github data)
families = Fontist::Import::Google::Api.items
variable_fonts = Fontist::Import::Google::Api.variable_fonts_onlyFor detailed usage examples, see Google Fonts Multi-Format Usage Guide.
Prerequisites:
-
Local git checkout of the google/fonts repository.
-
Google Fonts Developer API key (set using
export GOOGLE_FONTS_API_KEY=your_api_key).
To update Google Fonts formulas from a local checkout of the google/fonts repository:
# GOOGLE_FONTS_API_KEY must be set in the environment
fontist import google \
--source-path /path/to/google/fonts \
--output-path Formulas/google \
--verbose \
--import-cache /tmp/fontist-google-fonts-cache
git add Formulas/google
git commit -m "Google Fonts update"
git pushTo import a single font for testing:
fontist import google \
--font-family "Roboto" \
--source-path /path/to/google/fonts \
--verboseFontist uses a GHA workflow to check for updated fonts on Google Fonts daily.
New, updated, or removed fonts are automatically committed to the Fontist formula repository.
SIL International is an internationally recognized faith-based nonprofit organization that serves language communities worldwide.
SIL provides a number of unique fonts that support smaller language communities that with Unicode code often not (yet) supported by mainstream fonts.
Fontist aims to support all SIL fonts and provides their formulas in the default Fontist formula repository.
They can be updated with:
cd Formulas
fontist import sil \
--output-path Formulas/sil \
--verbose \
--import-cache /tmp/sil_import_cache
git add Formulas/sil
git commit -m "SIL fonts update"
git pushImporting a single SIL font for testing:
fontist import sil \
--font-name "Andika" \
--output-path Formulas/sil \
--verbose \
--import-cache /tmp/sil_import_cachemacOS since 10.12 (Sierra) provides a "supplementary fonts" framework (shared with iOS) for dynamically downloading and installing additional fonts on demand.
There are two typical ways to install these supplementary fonts on macOS, both triggering a download from Apple’s Mobile Asset Server:
-
user applications are allowed to trigger the installation of these fonts when needed, as described in Apple’s "DownloadFont" sample.
-
through searching within
Font Book.app, locating the desired font, and clicking "download".
In Fontist, these supplementary fonts can be installed non-interactively through Fontist formulas.
macOS supplementary fonts use the bundle identifier
com.apple.MobileAsset.FontX, where X is the framework version, and is based
on a specific asset framework location used by Apple.
| OS version | Asset framework location | Font framework version |
|---|---|---|
Platform tag |
macOS 10.12 (Sierra) |
|
3 |
|
macOS 10.13 (High Sierra) |
|
4 |
|
macOS 10.14 (Mojave) |
|
5 |
|
macOS 10.15 (Catalina) |
|
6 |
|
macOS 11 (Big Sur) |
|
6 |
|
macOS 12 (Monterey) |
|
7 |
|
macOS 13 (Ventura) |
|
7 |
|
macOS 14 (Sonoma) |
|
7 |
|
macOS 15 (Sequoia) |
|
7 |
|
macOS 26+ (Tahoe) |
|
The corresponding asset catalog XML files are located at the root of each font framework version’s location in the OS:
- Version 3
-
/System/Library/Assets/com_apple_MobileAsset_Font3/com_apple_MobileAsset_Font3.xml - Version 4
-
/System/Library/Assets/com_apple_MobileAsset_Font4/com_apple_MobileAsset_Font4.xml - Version 5
-
/System/Library/AssetsV2/com_apple_MobileAsset_Font5/com_apple_MobileAsset_Font5.xml - Version 6
-
/System/Library/AssetsV2/com_apple_MobileAsset_Font6/com_apple_MobileAsset_Font6.xml - Version 7
-
/System/Library/AssetsV2/com_apple_MobileAsset_Font7/com_apple_MobileAsset_Font7.xml - Version 8
-
/System/Library/AssetsV2/com_apple_MobileAsset_Font8/com_apple_MobileAsset_Font8.xml
|
Note
|
The Assets and AssetsV2 frameworks use a slightly different Plist schema. |
In addition, these asset catalog XML files are also available for download from Apple’s Mobile Asset Server:
- Version 3
-
https://mesu.apple.com/assets/macos/com_apple_MobileAsset_Font3/com_apple_MobileAsset_Font3.xml - Version 4
-
https://mesu.apple.com/assets/macos/com_apple_MobileAsset_Font4/com_apple_MobileAsset_Font4.xml - Version 5
-
https://mesu.apple.com/assets/macos/com_apple_MobileAsset_Font5/com_apple_MobileAsset_Font5.xml - Version 6
-
https://mesu.apple.com/assets/macos/com_apple_MobileAsset_Font6/com_apple_MobileAsset_Font6.xml - Version 7
-
https://mesu.apple.com/assets/macos/com_apple_MobileAsset_Font7/com_apple_MobileAsset_Font7.xml - Version 8
-
https://mesu.apple.com/assets/macos/com_apple_MobileAsset_Font8/com_apple_MobileAsset_Font8.xml
To update macOS formulas:
cd Formulas
# Download font catalogs
for font_version in 3 4 5 6 7 8; do
curl -o com_apple_MobileAsset_Font${font_version}.xml \
https://mesu.apple.com/assets/macos/com_apple_MobileAsset_Font${font_version}/com_apple_MobileAsset_Font${font_version}.xml
fontist import macos \
--plist com_apple_MobileAsset_Font${font_version}.xml \
--output-path ./Formulas/macos/font${font_version} \
--verbose \
--import-cache /tmp/fontist-macos-cache \
--force
git add Formulas/macos/font${font_version}
done
git commit -m "Update macOS formulas"
git pushImporting a single macOS font for testing from a specific catalog:
fontist import macos \
--plist com_apple_MobileAsset_Font7.xml \
--font-name "Hiragino" \
--output-path Formulas/macos/font7 \
--verbose \
--import-cache /tmp/fontist-macos-cacheDuring formula imports, Fontist is required to download font archives from various external sources for analysis to create accurate formulas.
To optimize performance and avoid redundant downloads, Fontist implements an import cache for storing downloaded font files at:
-
Import cache (
~/.fontist/import_cache): Font archives downloaded during formula building
Cache management is managed through the fontist cache
command.
fontist import macos --import-cache /custom/path ...
fontist import google --import-cache /custom/path ...
fontist import sil --import-cache /custom/path ...# Global setting
Fontist.import_cache_path = "/custom/import/cache"
# Per-import setting
Fontist::Import::Macos.new(
plist_path,
import_cache: "/custom/cache"
).callAll import commands (macos, google, sil) provide a unified, professional
interface with colored output and progress tracking.
Enable --verbose to see detailed import progress:
fontist import macos --plist catalog.xml --verbose
fontist import google --source-path /path --verbose
fontist import sil --font-name "Andika" --verboseVerbose output includes:
-
Paint-colored headers with Unicode box characters
-
Import cache location
-
Download URLs and cache status
-
Extraction directory paths
-
Real-time progress with percentages
-
Per-font status indicators
-
Detailed summary statistics
$ fontist import macos --plist catalog.xml --font-name "Hiragino" --verbose
════════════════════════════════════════════════════════════════════
📦 macOS Supplementary Fonts Import
════════════════════════════════════════════════════════════════════
📦 Import cache: /Users/user/.fontist/import_cache
📁 Output path: /Users/user/.fontist/versions/v4/formulas/Formulas/macos/font7
(1/3) 33.3% | Hiragino Sans (2 fonts)
Downloading from: https://updates.cdn-apple.com/.../font.zip
Cache location: /Users/user/.fontist/import_cache
Extracting to: /var/folders/.../temp
Extraction cache cleared
✓ Formula created: hiragino_sans_10m1044.yml (3.98s)
════════════════════════════════════════════════════════════════════
📊 Import Summary
════════════════════════════════════════════════════════════════════
Total packages: 3
✓ Successful: 3 (100.0%)
🎉 Great success! 3 formulas created!Clone the repository.
git clone https://github.com/fontist/fontistSetup your environment.
bin/setupRun the test suite
bin/rspecAll official Fontist formulas are kept in the formulas repository.
If you’d like to add a new formula repository or change settings for an existing one, please refer to its documentation.
First, thank you for contributing! We love pull requests from everyone. By participating in this project, you hereby grant Ribose the right to grant or transfer an unlimited number of non exclusive licenses or sub-licenses to third parties, under the copyright covering the contribution to use the contribution by all means.
We are following Sandi Metz’s Rules for this gem, you can read the description of the rules here. All new code should follow these rules. If you make changes in a pre-existing file that violates these rules you should fix the violations as part of your contribution.
Here are a few technical guidelines to follow:
-
Open an issue to discuss a new feature.
-
Write tests to support your new feature.
-
Make sure the entire test suite passes locally and on CI.
-
Open a Pull Request.
-
Squash your commits after receiving feedback.
-
Party!
This gem is developed, maintained and funded by Ribose.