nerd-fonts-installer is a Nerd Fonts installer for people who set up
terminals, editors, dotfiles, new laptops, remote dev boxes, or fresh
Linux/macOS machines and do not want to manually download font archives every
time.
Instead of clicking through GitHub releases, unzipping files, moving fonts into the right folder, and refreshing the font cache by hand, you keep a short YAML file:
release: latest
destination: ~/.local/share/fonts/NerdFonts
refresh_font_cache: true
families:
- JetBrainsMono
- Hack
- FiraCode
- MesloThen run:
nerd-fonts-installerThat is it.
Nerd Fonts are great. Installing them repeatedly is not.
This tool is useful when you:
- want terminal icons and glyphs to work in Starship, Neovim, tmux, lazygit, eza, yazi, WezTerm, Alacritty, Kitty, Ghostty, or VS Code
- rebuild machines often
- maintain dotfiles
- bootstrap dev environments
- want the same fonts on every workstation
- want a repeatable setup script instead of manual clicking
- want to preview exactly what will be installed before writing files
Manual install:
- Open the Nerd Fonts release page.
- Find the right font archive.
- Download it.
- Unzip it.
- Move only the font files.
- Put them in a font directory.
- Refresh the font cache.
- Repeat for every font.
With nerd-fonts-installer:
nerd-fonts-installer --dry-run
nerd-fonts-installer- Downloads Nerd Font release archives from GitHub.
- Installs only font files:
.ttf,.otf, and.ttc. - Keeps each font family in its own folder.
- Supports
latestor pinned releases likev3.4.0. - Reads a simple YAML, JSON, or
.confconfig. - Can discover your config automatically.
- Has an interactive picker with
--interactive. - Prints copy-paste-ready font family names for configs.
- Supports dry-runs.
- Refreshes
fc-cacheon Linux when requested. - Skips
fc-cachesafely if it is not installed. - Uses colorful CLI output and a Charm Bubble Tea TUI.
Download the latest release archive for your system from the fixed latest
GitHub release URL.
Pick one:
| System | URL |
|---|---|
| Linux Intel/AMD | https://github.com/worxbend/nerd-fonts-installer/releases/download/latest/nerd-fonts-installer_latest_linux_amd64.tar.gz |
| Linux ARM64 | https://github.com/worxbend/nerd-fonts-installer/releases/download/latest/nerd-fonts-installer_latest_linux_arm64.tar.gz |
| macOS Intel | https://github.com/worxbend/nerd-fonts-installer/releases/download/latest/nerd-fonts-installer_latest_darwin_amd64.tar.gz |
| macOS Apple Silicon | https://github.com/worxbend/nerd-fonts-installer/releases/download/latest/nerd-fonts-installer_latest_darwin_arm64.tar.gz |
For example:
curl -LO https://github.com/worxbend/nerd-fonts-installer/releases/download/latest/nerd-fonts-installer_latest_linux_amd64.tar.gz
curl -LO https://github.com/worxbend/nerd-fonts-installer/releases/download/latest/checksums.txt
sha256sum --check --ignore-missing checksums.txtExtract it:
tar -xzf nerd-fonts-installer_latest_linux_amd64.tar.gz
cd nerd-fonts-installer_latest_linux_amd64Move it somewhere on your PATH:
chmod +x nerd-fonts-installer
mkdir -p ~/.local/bin
mv nerd-fonts-installer ~/.local/bin/Check it works:
nerd-fonts-installer --versionIf ~/.local/bin is not on your PATH, add this to your shell config:
export PATH="$HOME/.local/bin:$PATH"On Linux, after the Snap Store package is published, you can install it with:
sudo snap install nerd-fonts-installer --classicThe snap uses classic confinement because the CLI installs fonts into the real user font directory and refreshes fontconfig. Classic confinement requires Snap Store approval before the package can be released publicly.
Create the config directory:
mkdir -p ~/.config/nerd-fonts-installerCreate the config file:
nano ~/.config/nerd-fonts-installer/config.yamlPaste this:
release: latest
destination: ~/.local/share/fonts/NerdFonts
refresh_font_cache: true
families:
- JetBrainsMono
- Hack
- FiraCodeSave the file.
Before installing, run a dry-run:
nerd-fonts-installer --dry-runThis prints what would be downloaded and where it would go. It does not write font files.
Run:
nerd-fonts-installerNow select the installed Nerd Font in your terminal or editor settings.
If you do not want to write YAML yet, just run:
nerd-fonts-installer --interactiveWhen no config file is found and --interactive is set, the app opens an
interactive picker:
- Pick a Nerd Fonts release.
- Pick one or more font families.
- Press
enter. - The selected fonts install.
Controls:
| Key | Action |
|---|---|
up / down |
Move through releases or fonts |
/ |
Search/filter |
enter |
Choose a release or confirm selected fonts |
space |
Select or unselect a font |
a |
Select all or clear all |
b / esc |
Go back |
q / ctrl+c |
Quit |
Not sure what the exact family names are? Ask the tool:
nerd-fonts-installer --font-namesIt prints YAML you can paste directly into your config:
# v3.4.0
families:
- 0xProto
- 3270
- AdwaitaMono
- Agave
- AnonymousProFor a pinned release, put the release in your config and run:
nerd-fonts-installer --config ~/.config/nerd-fonts-installer/config.yaml --font-namesrelease: latest
destination: ~/.local/share/fonts/NerdFonts
refresh_font_cache: true
families:
- JetBrainsMonoRun:
nerd-fonts-installer --config fonts.yaml --dry-run
nerd-fonts-installer --config fonts.yamlrelease: latest
destination: ~/.local/share/fonts/NerdFonts
refresh_font_cache: true
families:
- JetBrainsMono
- Hack
- FiraCode
- Meslo
- SymbolsOnlyUse this when you want the same result every time your setup script runs.
release: v3.4.0
destination: ~/.local/share/fonts/NerdFonts
refresh_font_cache: true
families:
- JetBrainsMono
- HackUse this if you want to inspect the files before touching your real font directory.
release: latest
destination: ./tmp/fonts
refresh_font_cache: false
families:
- HackRun:
nerd-fonts-installer --config fonts.yamlFiles will appear under:
./tmp/fonts/Hack/
#!/usr/bin/env bash
set -euo pipefail
mkdir -p ~/.config/nerd-fonts-installer
cat > ~/.config/nerd-fonts-installer/config.yaml <<'YAML'
release: latest
destination: ~/.local/share/fonts/NerdFonts
refresh_font_cache: true
families:
- JetBrainsMono
- Hack
- FiraCode
YAML
nerd-fonts-installer --dry-run
nerd-fonts-installerThis is useful in dotfiles, Ansible roles, install scripts, or fresh-machine setup scripts.
Config is YAML.
release: latest
destination: ~/.local/share/fonts/NerdFonts
refresh_font_cache: true
families:
- JetBrainsMono
- Hack| Field | Required | Default | Meaning |
|---|---|---|---|
release |
No | latest |
Nerd Fonts release to use. Use latest or a tag like v3.4.0. |
destination |
No | ~/.local/share/fonts/NerdFonts |
Root folder where fonts are installed. |
refresh_font_cache |
No | false |
Run fc-cache -f <destination> after installing. |
families |
Yes | none | Font archive names without .zip. |
Family names must be exact Nerd Font archive names. Use --font-names when in
doubt.
When --config is not provided, the tool checks the NERD_FONTS_INSTALLER_CONFIG
environment variable, then the following locations in order:
./nerd-fonts-installer.yaml./nerd-fonts-installer.yml./nerd-fonts-installer.json./nerd-fonts-installer.conf./nerd-fonts-installer/config.yaml./nerd-fonts-installer/config.yml./nerd-fonts-installer/config.json./nerd-fonts-installer/config.conf- The same app-named files under
$XDG_CONFIG_HOME, when it is set to an absolute path. - The same app-named files under
~/.configwhen$XDG_CONFIG_HOMEis unset, empty, or relative.
Set NERD_FONTS_INSTALLER_CONFIG=/path/to/fonts.yaml to point at a config
without passing --config every time — handy in dotfiles, CI, and containers.
It is honored by --font-names as well.
The recommended location is:
~/.config/nerd-fonts-installer/config.yaml
nerd-fonts-installer [flags]
| Flag | What it does |
|---|---|
--config <path> |
Use a specific config file. |
--dry-run |
Show what would happen without installing. |
--font-names |
Print YAML-ready font family names and exit. |
--interactive |
Open the terminal picker when no config is found. |
--icons <mode> |
Set interactive TUI icons: auto, nerd, unicode, or ascii. Defaults to auto, which avoids requiring Nerd Font glyphs. |
--version |
Print version info and exit. |
Examples:
nerd-fonts-installer --dry-run
nerd-fonts-installer --config fonts.yaml
nerd-fonts-installer --config fonts.yaml --dry-run
nerd-fonts-installer --font-names
nerd-fonts-installer --interactive --icons nerd
nerd-fonts-installer --interactive --icons ascii
nerd-fonts-installer --versionGiven:
destination: ~/.local/share/fonts/NerdFonts
families:
- JetBrainsMono
- HackThe tool writes:
~/.local/share/fonts/NerdFonts/
JetBrainsMono/
JetBrainsMonoNerdFont-Regular.ttf
...
Hack/
HackNerdFont-Regular.ttf
...
Each family gets its own directory. Existing files for that family are replaced after the new archive extracts successfully.
You have two choices:
-
Create a config:
mkdir -p ~/.config/nerd-fonts-installer nano ~/.config/nerd-fonts-installer/config.yaml
-
Or pass a config explicitly:
nerd-fonts-installer --config /path/to/fonts.yaml
If you want to use the terminal picker instead, run:
nerd-fonts-installer --interactiveThe same font appears twice in families.
Remove the duplicate:
families:
- JetBrainsMonoUsually this means the family name or release tag is wrong.
Run:
nerd-fonts-installer --font-namesThen copy the exact family name from the output.
Try refreshing the font cache:
fc-cache -f ~/.local/share/fonts/NerdFontsAlso restart the application where you select fonts. Terminals and editors often need a restart before new fonts appear.
Install a Nerd Font and then choose that exact Nerd Font in your terminal or editor preferences. Installing the font is only half of the job; your app still needs to use it.
For example, choose something like:
JetBrainsMono Nerd Font
Hack Nerd Font
FiraCode Nerd Font
Linux:
- Recommended destination:
~/.local/share/fonts/NerdFonts - Set
refresh_font_cache: true - The tool will run
fc-cachewhen available
macOS:
- You can use a custom destination if you manage fonts manually
fc-cacheis usually not installed and will be skipped- You may prefer installing into a local folder first, then importing fonts with Font Book or another font manager
Requirements:
- Go 1.26 or newer
Build:
go build -trimpath -o bin/nerd-fonts-installer ./cmd/nerd-fonts-installerSmoke test:
./bin/nerd-fonts-installer --version
./bin/nerd-fonts-installer --config config.example.yaml --dry-runRun the full local validation suite:
make verifyRun tests:
make testRun vet:
make vetRun lint:
make lintFormat Go code:
make fmtThe release workflow publishes versioned GitHub releases for v* tags and also
refreshes a moving latest release. Use the fixed download form:
https://github.com/worxbend/nerd-fonts-installer/releases/download/latest/<asset>
The Snap workflow builds snaps on pull requests, main, tags, and manual runs.
It publishes only on non-PR runs:
mainpublishes toedgev*tags publish tostable- manual runs publish to the selected channel
Before publishing snaps, register the nerd-fonts-installer snap name and add a
repository secret named SNAPCRAFT_STORE_CREDENTIALS. Generate it with:
snapcraft export-login --snaps=nerd-fonts-installer \
--acls package_access,package_push,package_update,package_release \
/tmp/snapcraft-login.txtPaste the contents of the generated file into the SNAPCRAFT_STORE_CREDENTIALS
secret, then delete the local file. Never write it inside the repository —
it is a live credential and must not be committed.
MIT. See LICENSE.
The project is intentionally small:
cmd/nerd-fonts-installerowns flags, command flow, and exit codes.internal/configowns config loading, defaults, validation, and discovery.internal/fontsowns downloads, extraction, atomic replacement, and cache refresh.internal/nerdfontsowns GitHub release discovery.internal/tuiowns the Charm Bubble Tea interactive UI.
The goal is not to be a full font manager. The goal is to make Nerd Font installation boring, repeatable, and scriptable.