You downloaded a font and nothing changed
You downloaded a .ttf file from a design site, double-clicked it, and the font viewer opened. You clicked "Install," but LibreOffice still won't show the font in the dropdown. Or you copied the file to /usr/share/fonts and now dnf is complaining about file conflicts during an update. The font is there, but the system isn't seeing it, or worse, you've broken the package manager's view of the filesystem.
What's actually happening
Fedora uses fontconfig to manage fonts. Applications do not scan directories for font files. They query fontconfig, which maintains a database of available fonts. This database lives in ~/.cache/fontconfig for user-specific fonts and /var/cache/fontconfig for system-wide fonts. When you add a font file, the database does not update automatically. You must rebuild the cache.
The directory structure follows a strict hierarchy. Files in /usr/share/fonts are managed by RPM packages. If you place a file there manually, RPM thinks the file belongs to a package. During an upgrade, RPM may overwrite your file or abort the transaction with a conflict error. Files in /usr/local/share/fonts are for administrator-managed additions. This directory is safe from RPM interference. Files in ~/.local/share/fonts are for the current user only. This path follows the XDG Base Directory specification and requires no root privileges.
fontconfig also handles font substitution. Fedora ships with configuration files in /etc/fonts/conf.d/ that map legacy names to modern alternatives. A request for "Arial" often resolves to "Liberation Sans" because of metric compatibility. This mapping explains why an application might render text in a different font than you expect even after installation.
Run fc-cache after every manual change. The cache is the source of truth for applications.
Install packaged fonts via dnf
Many popular fonts are available as RPM packages. This is the preferred method because the package manager handles dependencies, updates, and cache refreshes automatically. Fedora includes the Liberation family, which is metrically compatible with Microsoft fonts, and the Google Noto family, which covers a wide range of scripts.
Here's how to search for a font package and install it.
dnf search fonts | grep -i liberation
# grep filters the dnf output to match the font name case-insensitively
# This helps narrow down packages when the repository contains hundreds of font packages
The search output lists package names and descriptions. Identify the correct package name and install it.
sudo dnf install liberation-fonts
# dnf resolves dependencies and updates the font cache automatically via scriptlets
# No manual fc-cache is needed for RPM packages
The package scriptlet runs fc-cache during installation. The font is available immediately after the transaction completes.
Install from RPM when you can. Manual files accumulate dust and orphan dependencies.
Install a font for your user only
When you need a font for a single user account, copy the file to your personal fonts directory. This approach avoids sudo and keeps the font isolated to your user profile. It works for .ttf, .otf, and .woff2 files. Modern fontconfig supports .woff2 natively.
Here's how to set up the user font directory and add a font file.
mkdir -p ~/.local/share/fonts
# -p creates the directory and parent directories if they do not exist
# This path is the standard XDG location for user-specific fonts
cp ~/Downloads/MyFont.ttf ~/.local/share/fonts/
# Copy the font file to the user directory
fc-cache -fv
# -f forces a cache rebuild, -v shows progress and errors
# This updates the fontconfig database so applications can find the new font
The -f flag forces a rebuild even if the cache appears up to date. The -v flag prints progress to stderr, which helps you spot corrupted files that cause the process to hang. If fc-cache prints an error about a specific file, that file is likely malformed. Remove the file and run fc-cache -fv again.
Restart the application after caching. Some apps cache fonts at startup and won't see the new entry until they reload.
Install a font system-wide
When multiple users on the machine need access to the font, install it in /usr/local/share/fonts. This directory is reserved for administrator-managed files and is safe from package manager conflicts. Never copy files to /usr/share/fonts manually. That directory is owned by RPM, and manual files will cause transaction errors during upgrades.
Here's how to add a font system-wide and refresh the cache.
sudo mkdir -p /usr/local/share/fonts/myfont
# /usr/local is reserved for admin-managed files and is safe from package manager conflicts
# Avoid /usr/share/fonts as that directory is owned by RPM packages
sudo cp ~/Downloads/MyFont.ttf /usr/local/share/fonts/myfont/
sudo fc-cache -fv
# Rebuild the system-wide font cache
# This makes the font available to all users on the system
Permissions matter for system-wide fonts. The directory and files must be readable by all users. Use chmod 755 on directories and chmod 644 on font files to ensure broad access. If you create a subdirectory with restrictive permissions, other users won't see the font.
Use /usr/local for system-wide additions. /usr/share belongs to the package manager and will fight back.
Verify the font is available
After installation, confirm that fontconfig recognizes the font. The fc-list command dumps the contents of the font cache. The fc-match command returns the actual file path fontconfig will use for a given family name.
Here's how to check if the font is registered and selectable.
fc-list | grep -i myfont
# fc-list dumps the fontconfig cache contents
# grep filters the output to confirm the font is registered
fc-match "My Font Family"
# fc-match returns the actual file path fontconfig will use for this family name
# This verifies the font is not only present but also selectable
The fc-list output shows the path, family name, and style. If the font does not appear, the cache rebuild failed or the file is in the wrong directory. The fc-match output confirms the font is the best match for the family name. If fc-match returns a different font, fontconfig is substituting based on priority rules.
Run fc-list first. If the font isn't in the list, the application won't find it either.
Common pitfalls and errors
Manual font installation can trigger specific errors. Understanding these messages saves time.
If you see Error: Transaction test error: package fontpackage conflicts with file /usr/share/fonts/myfont.ttf, you placed a file in /usr/share/fonts. RPM manages that directory. Move the file to /usr/local/share/fonts and run sudo fc-cache -fv.
If fc-cache hangs indefinitely, a font file in the directory is likely malformed. The cache builder reads every file. A broken file can cause the process to loop or wait for input. Remove files one by one or use fc-cache -f ~/.local/share/fonts to limit the rebuild to your user directory. This isolates the offender.
If an application shows the font in its list but renders text incorrectly, the font file may be corrupted or the application may have its own internal cache. Restart the application. For GTK applications, you may need to log out and back in to clear the theme cache.
Icon fonts like Font Awesome or Material Icons follow the same process. They are just fonts with glyphs mapped to unicode code points. Verify icon fonts with fc-match.
fc-match FontAwesome
# Check if the icon font family is recognized
# The output should point to the .ttf or .otf file you installed
Some applications have special support for icon fonts, but the underlying mechanism is identical. Copy the file, run fc-cache, and verify with fc-match.
If fc-cache hangs, the font file is likely corrupted. Delete the file and try again.
When to use this vs alternatives
Choose the installation method based on scope and maintenance needs.
Use dnf install when the font is available in Fedora repositories or a trusted COPR source.
Use ~/.local/share/fonts when you need the font for a single user account and want to avoid sudo privileges.
Use /usr/local/share/fonts when multiple users on the system require access to the font.
Avoid /usr/share/fonts for manual file copies because RPM manages that directory and manual files cause transaction conflicts.
Choose the path that matches your scope. The wrong directory breaks updates or hides fonts from users.