Fastfetch documentation

A practical reference for fastfetch 2.69.0: build it, write a config, format output, pick logos and modules, script it with JSON, and fix the usual problems. Last reviewed 8 October 2026. Looking for install commands? Start with the install guide.

In short
  • What it is: an open-source (MIT) system information tool written in C, similar to Neofetch, which was archived in 2024.
  • Platforms: Linux, macOS, Windows 8.1+, FreeBSD, OpenBSD, NetBSD, DragonFly BSD, Android (Termux), Haiku and illumos/Solaris.
  • Config: JSONC at ~/.config/fastfetch/config.jsonc, created with fastfetch --gen-config, with an official JSON schema for editor autocomplete.
  • Inside: 76 modules, 540 built-in logos, image logos (sixel, kitty, iTerm2, chafa), a format-string language with optional Lua, and --format json output for scripts.
  • Source of truth: the official wiki and fastfetch -h; this page summarizes them and flags common pitfalls.

1. Getting started

Run fastfetch with no configuration and it prints your OS, hardware and desktop details next to a logo. Everything on this page applies to fastfetch 2.69.0; commands were run against a 2.69.0 build, and configs were validated against its JSON schema. Need to install it first? See the install guide for every platform.

Basic usage

Run fastfetch
$fastfetch
$fastfetch -c neofetch # Neofetch-style layout (bundled preset)
$fastfetch -c all # Every module, to see what your system reports
$fastfetch -c examples/18 # One of the 31 small example presets
$fastfetch --list-presets # Presets fastfetch can find on this machine

A preset name is looked up like this: first as a file path (.jsonc is appended when there is no extension), then in fastfetch/ inside your config directories, then in fastfetch/presets/ inside the data directories, then next to the fastfetch executable. Use -c - to read a config from standard input and -c none to skip loading any config. fastfetch --list-data-paths prints the preset and logo search paths.

Creating your config: fastfetch --gen-config opens an interactive setup in a terminal and writes ~/.config/fastfetch/config.jsonc. It refuses to overwrite an existing file, so move the old one away first. When stdin or stdout is not a terminal, or NO_COLOR is set, it writes a minimal config without asking questions. --gen-config - prints the result to the terminal instead of saving it. There is no --gen-config-force option. Prefer to build a config in your browser? Use the config generator on the homepage.

2. Building from source

Fastfetch builds with CMake and a C23-capable compiler: GCC 13 or newer, or Clang 16 or newer. Since 2.67.0 this is the minimum, and the build stops early with a clear message on older compilers, so Debian 12 (GCC 12) cannot build current releases from source; use a prebuilt binary from GitHub Releases there. pkg-config is recommended so optional libraries are detected. MSVC is not supported.

Linux, macOS and BSD

Compile
$git clone https://github.com/fastfetch-cli/fastfetch.git
$cd fastfetch
$mkdir -p build && cd build
$cmake ..
$cmake --build . --target fastfetch -j$(nproc) # on macOS use -j$(sysctl -n hw.ncpu)
$sudo cmake --install . # optional

cmake --build . without --target fastfetch also builds flashfetch, a benchmark binary you do not need. If the headers for an optional library are missing, the build simply leaves that feature out instead of failing. Run ./fastfetch --list-features afterwards to see what was compiled in.

Useful CMake options

OptionDefaultWhat it does
BINARY_LINK_TYPEdlopenHow libraries are linked: dlopen, dynamic or static. With dlopen the binary still starts when an optional library is missing.
ENABLE_<LIB>ONOne toggle per optional library, for example ENABLE_VULKAN, ENABLE_DBUS, ENABLE_SQLITE3, ENABLE_LUA.
ENABLE_QUICKJSOFF (since 2.69.0)QuickJS scripting is deprecated and disabled by default; migrate format-string scripts to Lua.
ENABLE_IMAGE_LOGOONImage logos (sixel, kitty, iterm, chafa). Turn off for a smaller binary; raw logos still work.
MODULE_DISABLE_<NAME>OFFLeave a module out of the build, for example MODULE_DISABLE_WEATHER.
PACKAGES_DISABLE_<NAME>OFFSkip a package manager by default, for example PACKAGES_DISABLE_NIX.
BUILD_TESTSOFFAlso build the test executables, run with ctest.

Windows (MSYS2 CLANG64)

Install MSYS2, open the MSYS2 / CLANG64 shell (not plain MSYS2 / MSYS), install the toolchain, then follow the Linux steps above. Use CLANGARM64 and the matching mingw-w64-clang-aarch64-* packages for ARM64.

MSYS2 CLANG64
$pacman -Syu mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-pkgconf mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-vulkan-headers mingw-w64-clang-x86_64-opencl-icd mingw-w64-clang-x86_64-cppwinrt

Optional libraries and dynamic loading

On Linux the only hard requirements are libc, libdl, libm and libpthread, plus the Linux headers at build time. Everything else is loaded at run time when present, and the matching module or feature quietly degrades when it is not. Examples:

LibraryUsed for
libvulkan, libOpenCL, libEGL/libGLXThe Vulkan, OpenCL and OpenGL modules, and GPU detection fallbacks
libwayland-client, libxcb-randr/libXrandr, libdrmDisplay detection on Wayland, X11 and bare consoles
libdbusBluetooth, Player and Media modules, XFCE theme detection
libsqlite3, librpmrpm, moss and soar package counts (librpm is needed on openSUSE)
ImageMagick 7 (libmagickcore)Image logos on Linux and BSD (ImageMagick 6 still works but is deprecated). Windows, macOS and Android use the OS image framework instead.
libchafaThe chafa logo type
Lua 5.3 to 5.5Lua scripting in format strings (Lua 5.1 and LuaJIT are not supported)

The complete list is in the official Dependencies wiki page. On Windows 8.1 the Universal C Runtime must be installed manually and a terminal with ANSI escape support (such as ConEmu) is needed; Windows 7 is not supported.

3. How fastfetch works and how to keep it fast

Fastfetch is a C program that asks the operating system directly instead of running helper commands. On Linux it reads files such as /proc and /sys, on macOS it uses sysctl, IOKit and system frameworks, and on Windows it uses native Win32 and registry APIs. Neofetch, in contrast, is a Bash script that starts many external programs. Optional libraries are loaded on demand (see above), so a missing one never stops the program.

Measure first, then tune

Find slow modules
$fastfetch --stat # print the time each module took
$fastfetch --show-errors # print why a module failed or fell back
$hyperfine 'fastfetch --pipe false' # overall run time
SettingDefaultMeaning
--stat / display.statfalsePrints the execution time of each module in milliseconds, plus the total.
--show-errors / display.showErrorsfalsePrints errors from modules that could not detect something.
general.processingTimeout5000Milliseconds to wait for child processes (used by command, some detections). -1 disables the timeout.
general.threadtrueUse separate threads for HTTP requests (publicip, weather), so network modules do not block local ones.
general.detectVersiontrueDetect versions of the terminal, shell, editor and similar. Mainly useful to switch off when benchmarking.
--pipe / display.pipeautoRemoves colors and the logo. Auto-enabled when stdout is not a terminal; --pipe false forces the normal output.

In practice the usual causes of a slow run are modules that talk to the network (publicip, weather), command modules that run slow shell scripts, and disks on unresponsive network mounts. Remove those modules and run --stat again.

4. Logos, images and colors

Fastfetch ships 540 built-in ASCII logos and can draw real images in terminals that support a graphics protocol.

Built-in logos

Choose a logo
$fastfetch --list-logos # names of all built-in logos
$fastfetch --print-logos # draw them all (long)
$fastfetch --logo debian # force a specific logo
$fastfetch --logo-type small # small variant of the detected logo
$fastfetch --logo none # no logo, keep the logo colors for keys

Most distributions have a _small variant (for example arch_small); a few, such as Windows, do not. --logo-position auto (new in 2.69.0) moves a wide logo above the output when fewer than 32 columns would remain for text; the default is still left.

Image logos

Point --logo at an image and choose the protocol your terminal speaks with --logo-type. On Linux and BSD, fastfetch must have been built with ImageMagick; on Windows, macOS and Android it uses the operating system's image support (since 2.69.0, Windows Terminal shows sixel logos out of the box).

--logo-typeHow it drawsTerminals reported to work
sixelSixel graphics; widest terminal supportWindows Terminal, foot, WezTerm, mintty, xterm (with sixel enabled)
kittyKitty graphics protocol, image encoded by fastfetch; the only type where fastfetch decodes GIF/APNG animationkitty, Ghostty, WezTerm
kitty-directKitty protocol, file path handed to the terminal; the fastest option. Set --logo-width and --logo-height.WezTerm, Warp (png, jpg, webp), kitty and Ghostty (png only)
kitty-icatRuns kitten icat (needs the kitten binary in PATH)kitty
itermiTerm2 inline image protocol. Set --logo-width and --logo-height.iTerm2, WezTerm, Konsole
chafaConverts the image to Unicode block art with libchafaAny terminal (needs a build with chafa support)
rawPrints a pre-converted binary file as isWhatever the file was made for
Image examples
$fastfetch --logo ~/Pictures/avatar.png --logo-type kitty
$fastfetch --logo ~/Pictures/avatar.png --logo-type sixel --logo-width 30
$fastfetch --logo ~/Pictures/avatar.png --logo-type chafa # works almost everywhere
$fastfetch --logo ~/Pictures/avatar.png --logo-type kitty --logo-cache regen # rebuild the cached rendering

Image logos are cached; the cache is invalidated when the source file changes but not when you only change --logo-type, so run --logo-cache regen after switching types. (--logo-recache was replaced by --logo-cache in 2.69.0.) Set logo.animationFrame to 0 to play an animated GIF/APNG with the kitty type. If an image does not show, add --show-errors to see why. Apple's Terminal.app supports neither sixel nor the kitty or iTerm protocols.

Custom logos, padding and random images

Text logo with padding and color overrides
{
  "logo": {
    "type": "file",
    "source": "~/logos/mylogo.txt",
    "padding": { "top": 1, "left": 2, "right": 4 },
    "color": { "1": "blue", "2": "light_white" }
  }
}
  • file prints a text file and replaces $1 to $9 with the colors from logo.color (write $$ for a literal $); file-raw and data-raw print exactly what they are given.
  • Random logo: a wildcard such as "source": "~/logos/*.png" makes fastfetch pick one matching file at random on each run (Linux, macOS, BSD).
  • Command output as logo: { "type": "command-raw", "source": "pokeget random --hide-name" } works in a JSONC config only.
  • Disable the logo: --logo none, or "logo": null in the config.
  • Paths may use ~ and environment variables. On Linux, quote or escape spaces in paths; on Windows use %USERPROFILE% syntax.

Colors

Everywhere a color is accepted (--color-keys, display.color.keys, logo.color, {#...} in format strings) you can use:

FormExamples
Named colorsred, light_blue, bold_red, underline_bright_green (prefixes: bold_, bright_, dim_, italic_, underline_, blink_, inverse_, strike_)
24-bit hex#FF8800 or #F80
256-color index@196 (0 to 255)
Raw ANSI code38;5;208, 1;35, 38;2;255;0;0

Run fastfetch -h color for the named-color list. There is no background-color prefix; write the ANSI code (for example 44) instead. The colors module draws your terminal's 16-color palette, which is handy for checking a theme.

5. Configuration file (JSONC)

Fastfetch reads JSONC: JSON with // comments and trailing commas. A config.json5 in the same folder is also understood. Unknown keys are reported as errors, which makes typos easy to find.

Where fastfetch looks for config.jsonc

The first file found wins. Run fastfetch --list-config-paths to see the exact folders on your machine; a (*) marks the one that exists.

PlatformFolders searched, in order (each contains fastfetch/config.jsonc)
Linux and BSD$XDG_CONFIG_HOME (if set), ~/.config/, ~/, each folder in $XDG_CONFIG_DIRS, /etc/xdg/, /etc/
macOS$XDG_CONFIG_HOME (if set), ~/.config/, ~/Library/Preferences/, ~/Library/Application Support/, ~/, /etc/
Windows%USERPROFILE%\.config\, %ProgramData%\, %APPDATA%\, %LOCALAPPDATA%\, %USERPROFILE%\

The current directory is not searched, so a config.jsonc next to where you run the command is ignored unless you pass it with -c. In each folder fastfetch also accepts fastfetch/config.json5.

A complete starter config

Add the $schema line and editors such as VS Code and Helix give you autocomplete and validation.

config.jsonc
{
  "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
  "logo": {
    "type": "auto",
    "padding": { "right": 2 }
  },
  "display": {
    "separator": ": ",
    "color": { "keys": "blue" },
    "key": { "width": 12 },
    "percent": { "type": 3 }
  },
  "modules": [
    "title",
    "separator",
    "os",
    "host",
    "kernel",
    "uptime",
    "packages",
    "shell",
    "display",
    "cpu",
    "gpu",
    "memory",
    "disk",
    "battery",
    "break",
    "colors"
  ]
}

The display block

KeyPurpose
separatorText between key and value, default ": "
color.keys, color.title, color.output, color.separatorColors for each part of a line
key.widthPads keys to this width so values line up
key.typestring (default), icon (needs a Nerd Font), both, both-0 to both-4 (icon plus name with 0 to 4 spaces), or none
percent.typeHow percentages look; see the table below
bar.width, bar.char.elapsed, bar.char.totalSize and characters of percentage bars
constantsStrings you can reuse in format strings as {$1}, {$2}, ...
percent.typeResult
1Number only
2Bar only, colored by thresholds
3Number and bar
6Bar only (other output hidden)
9Colored number (the default)
10Monochrome bar with colored number

The value is a bit mask (number = 1, bar = 2, hide others = 4, color the number = 8, single-color bar = 16). Individual modules such as memory and disk can override it with their own percent object, for example { "type": 3, "green": 30, "yellow": 70 }. Module options exist only in the JSON config; the old --<module>-<option> command-line flags were removed in 2.52.0.

Bundled presets

PresetWhat it is
neofetchLayout modeled on Neofetch
screenfetchLayout modeled on screenFetch
archeyLayout modeled on Archey
paleofetchLayout modeled on paleofetch
allEvery module, for discovery and for checking what your system reports
ciNo logo, timing and errors on: for CI logs and debugging
examples/2 ... examples/3231 small configs, each demonstrating one idea. Read them for inspiration.

Load one with fastfetch -c <name>. Browse the presets folder on GitHub, or copy one into your config folder and edit it.

Themes and dotfiles

Community themes (Catppuccin, Nord, Tokyo Night, Gruvbox and so on) are ordinary config files. Keep yours in your dotfiles repository and load it by path with fastfetch -c ~/dotfiles/fastfetch/nord.jsonc, or symlink it to ~/.config/fastfetch/config.jsonc. Our themes and dotfiles guide explains how to adapt one and what to check before trusting a downloaded config (the command module and command-raw logos run shell commands).

6. Format strings

The format option of a module is a template with {placeholders}. List a module's placeholders with fastfetch -h <module>-format.

List placeholders
$fastfetch -h cpu-format
$fastfetch -h memory-format
A custom CPU line
{
  "type": "cpu",
  "format": "{name} ({cores-physical}C/{cores-logical}T) @ {freq-max}"
}

Use named placeholders. Numbered ones ({1}, {2}) are deprecated because their order can change between releases. A placeholder that cannot be resolved (for example a typo) is printed as written, which makes mistakes easy to spot. Write {{ to print a literal {.

Truncating, padding and slicing

SyntaxEffectResult for Arch Linux (brackets added to show spaces)
{name:4}Keep the first 4 bytesArch
{name:-4}Same, with … appended when cutArch…
{name<15}Pad on the right to 15 (left-aligned)[Arch Linux ]
{name>15}Pad on the left to 15 (right-aligned)[ Arch Linux]
{name|15}Center in 15 (needs 2.64.0 or newer)[ Arch Linux ]
{name~0,4}Slice from index 0 up to (not including) 4Arch
{name~5}Slice from index 5 to the endLinux
{name~-5,-1}Negative indexes count from the endLinu
Two gotchas: lengths are counted in bytes, so multi-byte characters count as several and can be cut in half. And an omitted end index does not mean “to the end”: {name~2,} and {name~-5,} produce an empty string. Leave out the comma to slice to the end ({name~2}).

Conditional text

Print the cycle count only when the system reports one
{
  "type": "battery",
  "format": "{capacity}{?cycle-count} ({cycle-count} cycles){?}"
}
  • {?name}text{?} prints text only when the variable is set; {/name}text{/} prints it only when the variable is not set.
  • For numbers, “set” means greater than zero, so a 0 counts as not set. Use the conditional form for values that some systems do not report, because a bare placeholder can print a raw sentinel such as -2147483648.
  • {-} ends the format string; everything after it is discarded.

Colors inside format strings

Named color, reset, and a hex color
{
  "type": "title",
  "format": "{#bold_green}{user-name}{#}@{##58A6FF}{host-name}{#}"
}

{#color} starts a color and {#} resets it; the color can be any form from the colors table above. For a hex color write two hashes: {##FF8800}. {#keys}, {#title}, {#output} and {#separator} reuse the configured colors. In JSON, a raw escape must be written as \u001b, never \e.

Environment variables and constants

Constant and environment variable
{
  "display": { "constants": ["prod"] },
  "modules": [
    { "type": "custom", "key": "Env", "format": "{$1} @ {$HOME}" }
  ]
}

{$NAME} inserts an environment variable. {$1} is the first entry of display.constants and {$-1} the last. If a variable is not set, or is only a shell variable that was never exported (HOSTNAME and USER often are not), the placeholder is printed as written. For names, prefer the title module's {user-name} and {host-name}.

Lua scripting (advanced)

Since 2.64.0 a format string that starts with lua: is run as Lua (5.3 to 5.5). The module's values arrive as a table, and the script must return a string; returning nothing hides the module. fastfetch --list-features shows whether your build includes Lua. QuickJS (JavaScript) scripting is deprecated and off by default as of 2.69.0.

Lua format string
{
  "type": "title",
  "format": "lua:local a = ...; return string.format('Hello %s@%s', a.userName, a.hostName)"
}

7. Module reference (76 modules)

Fastfetch 2.69.0 has 76 modules. In modules you can write a module as a string ("cpu") or as an object ({ "type": "cpu", "key": "Processor", "format": "..." }). Every module accepts key, keyColor, keyWidth, keyIcon, outputColor and format; set key to a single space to hide a key. Run fastfetch --list-modules for the list in your build and fastfetch -s <a>:<b> --format json to see all the raw data a module produces.

Hardware and firmware 31

type valueWhat it shows
cpuCPU name, frequency, etc.
cpucacheCPU cache sizes
cpuusageCPU usage. Collecting data takes some time
gpuGPU names, memory sizes, types, etc
memorySystem memory usage information
swapSwap (paging file) space usage
physicalmemorySystem physical memory devices
diskPartitions, space usage, file system, etc
diskioPhysical disk I/O throughput
physicaldiskPhysical disk information
btrfsLinux BTRFS volumes
zpoolZFS storage pools
boardMotherboard name and other information
biosFirst-stage bootloader information (name, version, release date, etc.)
bootmgrSecond-stage bootloader information (name, firmware, etc.)
chassisChassis type information (desktop, laptop, etc.)
hostYour computer's product name
tpmInformation about the Trusted Platform Module (TPM) security device
batteryBattery information
poweradapterPower adapter name and charging watts
displayResolutions, refresh rates, etc
monitorSame as Display module, but with a different default output format
brightnessCurrent brightness level of your monitors
cameraAvailable cameras
keyboardList connected keyboards
mouseList connected mice
gamepadList connected gamepads
bluetoothList connected Bluetooth devices
bluetoothradioList Bluetooth radios (supported versions, vendors, etc.)
soundSound devices, volume levels, etc
codecHardware video acceleration codec types (decode / encode)

Operating system and shell 17

type valueWhat it shows
osOS or Linux distribution name and version
kernelSystem kernel version
uptimeHow long the system has been running
packagesList installed package managers and count of installed packages
shellCurrent shell name and version
terminalCurrent terminal name and version
terminalfontFont name and size used by the current terminal
terminalsizeCurrent terminal size
terminalthemeCurrent terminal theme (foreground and background colors)
initsystemInit system (pid 1) name and version
processesNumber of running processes and threads
topProcesses with the highest CPU, memory or disk I/O usage
usersUsers who are currently logged in
localeSystem locale name
editorInformation about the default editor ($VISUAL or $EDITOR)
versionFastfetch version and build information
loadavgSystem load averages

Desktop and appearance 9

type valueWhat it shows
deDesktop environment name
wmWindow manager name and version
lmLogin manager (desktop manager) name and version
wmthemeCurrent window manager theme
themeCurrent desktop environment theme
iconsIcon style name
fontSystem font names
cursorCursor style name
wallpaperFile path of the current wallpaper

Network and media 8

type valueWhat it shows
localipList local IP addresses (IPv4 or IPv6), MAC addresses, etc
publicipYour public IP address and related information
wifiConnected Wi-Fi info (SSID, connection and security protocol)
dnsConfigured DNS servers
netioNetwork I/O throughput
weatherWeather information
mediaName of the currently playing song
playerMusic player name that is currently active

Graphics APIs 3

type valueWhat it shows
vulkanHighest Vulkan version supported by the GPU
openglHighest OpenGL version supported by the GPU
openclHighest OpenCL version supported by the GPU

Layout and custom output 8

type valueWhat it shows
titleTitle, including your username and hostname
separatorA separator line
breakAn empty line
colorsDisplay the terminal's 16-color palette
customA custom string, with or without key
commandRun custom shell scripts
datetimeCurrent date and time
logoQuery built-in logo for JSON output

Placeholders for the most-used modules

Names below come from fastfetch -h <module>-format in 2.69.0. Several more exist for each module.

ModulePlaceholdersNotable options
cpu{name} {vendor} {cores-physical} {cores-logical} {freq-base} {freq-max} {temperature} {march}temp (off by default), showPeCoreCount
gpu{vendor} {name} {driver} {type} {core-count} {dedicated-total} {dedicated-used} {temperature}driverSpecific, hideType, detectionMethod, temp
memory, swap{used} {total} {percentage} {percentage-bar}percent
disk{size-used} {size-total} {size-percentage} {filesystem} {mountpoint} {name} {is-external}folders, hideFolders, hideFS, showExternal, showSubvolumes, percent
battery{capacity} {status} {temperature} {cycle-count} {technology} {time-formatted} {model-name}temp, percent
display{width} {height} {refresh-rate} {scaled-width} {scaled-height} {inch} {ppi} {name} {type} {hdr-enabled}compactType, order
os{name} {pretty-name} {version} {codename} {id} {arch} {build-id}
kernel{sysname} {release} {version} {arch}
uptime{days} {hours} {minutes} {seconds} {formatted} {boot-time}
packages{all} {pacman} {dpkg} {rpm} {brew} {flatpak-all} {snap} {nix-all} {apk} {xbps} {winget} {scoop-user} {choco}Per-manager counts; disable some at build time with PACKAGES_DISABLE_*
shell, terminal{pretty-name} {process-name} {exe-name} {version} {pid}
host{name} {family} {version} {vendor} {sku}
media{combined} {title} {artist} {album} {status} {player-name}
wifi{ssid} {bssid} {status} {protocol} {signal-quality} {rx-rate}

The desktop modules are called de and wm in config files, and their default keys are “DE” and “WM”. The command module runs a shell command and shows its output, and custom prints any string, so almost anything can be added to the output.

Run a shell command (Arch example)
{
  "type": "command",
  "key": "Updates",
  "text": "checkupdates | wc -l"
}
Security note: command modules and command-raw logos execute shell commands with your permissions. Read any config you did not write before using it.

Not on the page yet? Every module has a page in the official wiki, for example Modules-GPU, with its platform support and all options.

8. Command-line options and exit codes

OptionWhat it does
-h, --help [topic]Help for all options, or for one (-h logo-type, -h cpu-format, -h color)
-v, --version, --version-rawVersion string, or just major.minor.patch for scripts
-c, --config <file|preset>Load a config file or bundled preset; - reads stdin, none loads nothing
--gen-config [path]Interactively create a config (see section 1); - prints it instead
-s, --structure <a:b:c>Show only these modules, in this order, e.g. -s os:kernel:cpu
--structure-disabled <a:b>Hide these modules from the structure
--print-structurePrint the default module list
--format default|jsonNormal or machine-readable output
-l, --logo, --logo-typePick a logo or image (section 4)
--pipe [bool]Disable colors and the logo; auto-detected when output is redirected
--stat, --show-errorsTiming per module; print module errors
--list-modules, --list-logos, --list-presetsList what this build supports
--list-config-paths, --list-data-pathsWhere configs, presets and logos are searched
--list-featuresOptional libraries compiled into this binary (Lua, sqlite3, Vulkan and so on)
--key-language <code>Translate module keys (for example de, fr, ja, zh)

Module settings (CPU temperature, disk filters and so on) are set in the config file only; the old per-module command-line flags such as --gpu-driver-specific no longer exist.

Exit codes

Fastfetch exits with 0 on success. Errors such as an unknown option or a config file that cannot be found exit with a non-zero status, and the value is not always 1 (an unknown option currently yields 144, a missing config 158). In scripts, test for non-zero rather than for exactly 1. Modules that cannot detect something are skipped; they do not change the exit code. Use --show-errors to see them.

JSON output for scripts and tools

--format json prints an array with one object per module, with raw numbers (bytes, MHz) instead of formatted text. Never parse the colored text output. Combine with -s to limit work to the modules you need:

JSON output
$fastfetch -s cpu:memory --format json
$fastfetch -s memory --format json | jq '.[0].result.used' # bytes in use
$fastfetch --format json | jq '.[] | select(.type=="CPU") | .result.cpu' # CPU model
Shape of the output (abridged); a failed module has "error" instead of "result"
[
  { "type": "CPU",    "result": { "cpu": "…", "cores": { "physical": 4, "logical": 4 }, "…": "…" } },
  { "type": "Memory", "result": { "total": 16876494848, "used": 484343808 } }
]

In 2.69.0, modules chosen with --structure honor their options from the JSON config. For AI agents and automation, see also the AGENTS.md guide and the llms.txt index of this site.

Migrating from Neofetch

Neofetch was archived in April 2024. Its Bash config cannot be converted automatically, but the concepts map directly:

NeofetchFastfetch
neofetch (default look)fastfetch -c neofetch
~/.config/neofetch/config.conf~/.config/fastfetch/config.jsonc (rewrite it; start with --gen-config)
--ascii_distro arch--logo arch
--ascii_colors 1 2--logo-color-1 red --logo-color-2 green
--off--logo none
--source /path/image.png--logo /path/image.png --logo-type kitty (or sixel, iterm, chafa)
--disable gpu--structure-disabled gpu
--stdout--pipe true (or just pipe the output)
--json--format json
custom ASCII file with ${c1} color tagssame file with $1 tags, see the migration note

A step-by-step comparison is on the homepage: Neofetch to Fastfetch migration.

9. Troubleshooting

Start with fastfetch --show-errors; most problems print a reason there.

Output is black and white, or the logo is missing

Cause: stdout is not a terminal (a pipe, a file, some wrappers), so fastfetch switches to plain output.
Fix: run fastfetch --pipe false. In a shell startup file, see the Powerlevel10k note below.

Icons show as question marks or boxes

Cause: the font does not contain the glyphs. Fastfetch's default output is plain text; icons appear only with display.key.type set to icon/both or in community configs that use Nerd Font symbols.
Fix: install a Nerd Font and select it in your terminal, or switch back to "key": { "type": "string" }.

An image logo does not display

Cause: the terminal does not support the chosen protocol, fastfetch was built without image support, or the file cannot be read. When it fails, fastfetch falls back to the built-in logo.
Fix: run with --show-errors; try --logo-type chafa (works almost everywhere) or the protocol your terminal documents; set --logo-width and --logo-height if the image overlaps text; use --logo-cache regen after changing the type. Check --list-features for ImageMagick/chafa on Linux.

Adding fastfetch to ~/.bashrc breaks scp, sftp or rsync

Cause: non-interactive SSH sessions also read ~/.bashrc; extra text on stdout corrupts the file-transfer protocol (errors such as “Received message too long”).
Fix: run it in interactive shells only: [[ $- == *i* ]] && fastfetch.

Powerlevel10k instant prompt shows a warning or no colors

Cause: with the instant prompt enabled, console output during zsh startup must be avoided or produced before the instant-prompt block.
Fix: put fastfetch above the instant-prompt block in ~/.zshrc, or use --pipe false if colors are missing.

My GPU shows as "Device 1234" or the wrong name

Cause: an outdated PCI ID database.
Fix: update hwdata/pci.ids (and amdgpu.ids for AMD), or add { "type": "gpu", "driverSpecific": true } to the modules to read names, memory and clocks from the vendor driver. With detectionMethod you can choose which backend is tried first. On hybrid laptops, a powered-off discrete GPU may not be listed until it is used.

CPU temperature is missing

Cause: the module does not show temperature unless you enable it, and the kernel must expose a sensor.
Fix: use { "type": "cpu", "temp": true }. On Linux check that /sys/class/hwmon has a k10temp (AMD) or coretemp (Intel) entry; tempSensor can pick a specific one. Virtual machines often have none.

Package counts are missing or lower than expected

Cause: a package manager is not supported by your build, is skipped via PACKAGES_DISABLE_*, or its database cannot be read (for example sqlite3/librpm support missing for rpm on openSUSE).
Fix: check fastfetch --list-features, use --show-errors, and read {all} or per-manager placeholders in the packages format.

Fastfetch is slow

Run fastfetch --stat to see the time per module, remove the slow ones (usually network or custom command modules), and lower general.processingTimeout if a child process hangs. Measure the total with hyperfine 'fastfetch --pipe false'.

Build error about C23 or an unsupported compiler

Cause: the compiler is older than GCC 13 or Clang 16.
Fix: install a newer toolchain, or download a prebuilt binary from GitHub Releases (this is the case on Debian 12).

Wrong or missing information on an exotic system

Check the official Support Status page, then search or ask in Discussions. For a confirmed bug, open an issue upstream and attach the output of fastfetch -c all --pipe true --show-errors.