Repository navigation
Compared to fastfetch and neofetch
fastfetch is the direct performance
benchmark for retch — mature, C-based, and extremely fast. retch aims to beat its
runtime (see Continuous Performance Benchmarks)
via a concurrent, Rust-based fetch pipeline (see How It Works). Compared
field for field since v0.19.0: as of v0.20.10, on Linux, retch is ~3.7x faster in the
default mode, ~2.3x in --long and ~1.2x in --full, and level in --short — see
Real-hardware benchmarks. On an M3 Pro Mac (v0.20.20) and an
Intel + NVIDIA laptop (v0.20.19) retch is ahead in all four modes. Windows has not been measured with the matched configs yet. What retch adds that fastfetch doesn't do:
- Native EDID display parsing (monitor vendor/model, refresh rate, preferred resolution) rather than relying on external tools
- Input-device classification that declines to guess — see Keyboard and mouse classification below, where fastfetch reports a mouse as a keyboard and vice versa on common wireless hardware
- A dedicated
--fullmode with weather, FUSE-mount-aware disk detection, and full per-sensor temperature readings, layered on top of lighter default modes - A TOML config engine with CLI-flag/config-file merge logic and
--generate-config/--write-config/--merge-confighelpers
retch has a field for every fastfetch module it overlaps with. On Linux all of them work, and
on macOS all but tpm (deliberately; see below). On Windows six are not implemented yet:
keyboard, mouse, brightness, power-adapter, login-manager and tpm, and those
fields are simply absent there. Beyond that, where the two tools differ it is deliberate:
-
retch reports more:
-
opencl: fastfetch prints a platform version even when the platform exposes no device (normal for Mesa's rusticl untilRUSTICL_ENABLEis set). retch reports a platform only when it has a device. -
disk-ioon Windows andbrightnesson macOS: fastfetch reports neither. - Bluetooth on Windows: fastfetch misses Bluetooth LE peripherals.
-
keyboardon macOS: retch finds a connected Bluetooth keyboard that fastfetch misses.
-
-
retch measures differently: for
disk-ioandnet-io, fastfetch sleeps 1 s to sample a rate. retch averages over its own run instead, so the fields add no time in--long, but the figure is an average over the run rather than an instantaneous rate. - retch reports less: on Linux, keyboards and mice the kernel cannot tell apart are left out rather than guessed. See the next section.
What is still open is platform-specific; see Cross-platform parity.
retch and fastfetch both read the kernel's input-device tables, but they disagree about
what to do when those tables are wrong — and on common wireless hardware they are.
This section is about Linux. macOS (supported since v0.16.0) does not have the problem
at all: it publishes one IOHIDDevice per HID interface, each carrying its own primary
usage, so the kernel states each device's role instead of leaving it to be inferred from
capability bitmaps. retch filters to HID usage page 1 and reports usage 6 as a keyboard and
usage 2 as a mouse — and a composite device such as an internal keyboard-and-trackpad is
correctly listed under both fields, because it genuinely is both. On the machine used for
this comparison retch also lists a connected Bluetooth keyboard that fastfetch misses
(confirmed connected rather than merely paired via system_profiler).
A peripheral paired through a Logitech Unifying/Bolt receiver is presented to the kernel with a merged capability set: the receiver synthesizes one descriptor covering every device class it can carry. Measured on one receiver carrying an MX Keys keyboard and an MX Master 3 mouse, every kernel-visible signal is identical for the two:
| source | MX Keys (keyboard) | MX Master 3 (mouse) |
|---|---|---|
/proc/bus/input/devices handlers |
sysrq kbd leds mouse6 event26 |
sysrq kbd leds mouse5 event25 |
capabilities/rel |
0x1943 |
0x1943 |
capabilities/key (alphabet block) |
present | present |
udev ID_INPUT_*
|
POINTINGSTICK |
POINTINGSTICK |
USB HID bInterfaceProtocol
|
00 |
00 |
| HID report descriptor prologue | 05 01 09 06 a1 01 |
05 01 09 06 a1 01 |
The report descriptor looks authoritative and is not: it declares "Usage: Keyboard" for both, because it is synthesized by the receiver driver rather than read from the device.
fastfetch 2.66 classifies from these capabilities, so on that hardware it lists the MX Master 3 and MX Vertical as keyboards, the MX Keys as a mouse, and repeats the MX Vertical in both lists — nine "mice" including the keyboard, both Wacom tablet endpoints, and a phantom PS/2 node.
retch classifies exclusively — a device is a keyboard, a mouse, or neither, never both:
-
Keyboard — a
kbdhandler and the full alphabetic key block. The handler alone is not enough: power buttons, lid switches,Video Busnodes, PC speakers, HDMI audio nodes, vendor hotkey drivers and webcam consumer-control endpoints all registerkbd. -
Mouse — a
mouseNhandler. Covers mice, touchpads and tablets. -
Both — a merged receiver endpoint. Resolved via the HID++ driver's battery
model_name("MX Keys Wireless Keyboard"/"Wireless Mouse MX Master 3"), the one place on the system where the device's real class survives. - Still ambiguous — listed in neither field.
Results are de-duplicated by name, since one physical peripheral routinely registers several evdev nodes under the same name.
Step 4 is a deliberate trade. A paired-but-idle device exposes no battery node, so it is
omitted rather than guessed into the wrong list — the same principle as suppressing
Users: 0 instead of printing a count that could not be determined. retch will
occasionally show fewer devices than fastfetch; it should not show them under the wrong
heading. If you would rather see everything the kernel reports, warts included, fastfetch
is the better fit here.
Separately from the fastfetch comparison, some retch fields were first implemented only on
Linux/macOS. The Windows side was closed as its own series, using native Win32 FFI and no
PowerShell spawns (for example domain via GetComputerNameExW and terminal-size via
GetConsoleScreenBufferInfo in v0.6.0). What is still open:
-
Windows:
- No
keyboard,mouse,brightness,power-adapter,login-managerortpmyet. - In Windows Terminal the logo renders above the text rather than beside it.
-
chafalogo mode is ignored even when requested on the command line.
- No
-
macOS:
bluetoothshows no on/off state on macOS 26 and later (justApple Bluetooth), because the power property it reads no longer exists. Until v0.20.16 it reportedOff.
Deliberately not implemented on Windows, because there is no faithful native source:
-
load: Windows has no load average. -
editor: it comes only from$VISUAL/$EDITOR. - conhost's
terminal-font: only Windows Terminal has a config file retch can parse.
tpm is deliberately absent on macOS: Macs have a Secure Enclave, not a TPM, and fastfetch
reports none there either.
The Continuous Performance Benchmarks dashboard
tracks runtime on every push to main, but those numbers come from GitHub-hosted CI
runners — shared, virtualized, and noisy from run to run. One-off local runs can be
skewed too (e.g. a slow FUSE mount adding hundreds of milliseconds to statvfs during
disk detection). Neither is a faithful picture of what you'll see on real hardware.
This section collects retch vs fastfetch timings measured on actual physical
machines, with CPU/OS context per machine so the numbers are meaningful and
reproducible rather than runner-dependent.
- Best-of-N warm runs via
hyperfine;just bench-comparein the repo automates the pairwise comparison. -
Since v0.19.0 each mode is matched field for field:
retch [--<mode>]againstfastfetch -c benches/fastfetch/<mode>.jsonc, a config generated from retch's own field table (src/fields.rs) byscripts/fastfetch_configs.py, for all four modes. fastfetch's network timeouts are set to retch's (2 s public IP, 4 s weather); its sampling waits keep fastfetch's defaults, because that is a real design difference being measured.domain,domain-search,archandcpu-freqhave no fastfetch equivalent; each config lists them as unmatched. -
Before v0.19.0 the pairs were NOT like for like, although this page said they were:
retch --shortvsfastfetch -c none,retchvsfastfetch,retch --longvsfastfetch -c all.-c nonemeans "load no config" (fastfetch's built-in 20-module default), plainfastfetchloads the user's own config when one exists, and-c allruns every module. None of those is the set of fields retch shows, so the older tables below compare different workloads. They are kept as history, not as a current claim. - No FUSE vaults mounted during the run (unmount cryfs/EncFS first — see
NOTES.md§3); same terminal and shell for both tools.
Median wall-clock time (lower is better); the Faster column names the quicker tool and by how much. One block per physical machine.
Current: retch v0.20.10 · 29 September 2026 · hyperfine -N medians (40 runs
short/default, 20 long, 12 full, 3 warmup) · fastfetch 2.68.1 · on AC, powersave
governor, quiet platform profile · the matched per-mode configs described above.
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
| short | 2.62 ms | 2.55 ms | level (fastfetch by 0.07 ms) |
| default | 3.91 ms | 14.33 ms | retch, 3.66× |
| long | 221 ms | 510 ms | retch, 2.30× |
| full | 431 ms | 519 ms | retch, 1.21× |
What changed between v0.19.0 (below) and v0.20.10, each change measured before and after
in one sitting and explained in NOTES.md:
-
cpu-usagewaits only for what remains of its 200 ms sampling interval after the other probes, not a fixed 200 ms after them (--long404 → 218 ms). The minimum interval is now--long's floor on Linux and macOS. - The CPU core string, the interface list and the CPU name moved off the serial path, and
probes start before the serial setup so thread wake-up overlaps it (
--short~4.0 → ~2.8 ms).--shortdiffers from fastfetch by a few tenths of a millisecond, and which one leads varies between sittings and with AC vs battery. - The
audioprobe stopped scanning the process table and reading/proc/asoundcodec files, which query the hardware (v0.20.6; default ~6 → ~3.5 ms here, and ~115 ms per run saved on a Raptor Lake SOF laptop). - Weather is one request to wttr.in instead of two in sequence (845 → 564 ms), and since
v0.20.10 over plain HTTP like fastfetch, dropping the TLS handshake (~570 → ~375 ms). That
took
--fullfrom behind fastfetch to ahead of it.--fullis still bound byweather.
v0.20.5 · 28 September 2026 · same run counts · on battery, powersave governor:
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
| short | 2.88 ms | 2.57 ms | fastfetch, 1.12× |
| default | 7.26 ms | 14.54 ms | retch, 2.00× |
| long | 232 ms | 514 ms | retch, 2.22× |
| full | 642 ms | 523 ms | fastfetch, 1.23× |
v0.19.0 (the first matched run, kept for comparison) · fastfetch 2.69.0:
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
| short | 3.6 ms | 2.5 ms | fastfetch, 1.4× |
| default | 35 ms | 12 ms | fastfetch, 2.9× |
| long | 383 ms | 275 ms | fastfetch, 1.4× |
| full | 1.12 s | 0.38 s | fastfetch, 2.9× |
At v0.19.0 fastfetch was faster in every mode once both tools showed the same fields. Every "retch is faster" figure before that came from comparing different workloads (see Methodology).
-
v0.19.0 moved
cpu-usageto--long. On Linux and macOS it needs two samples at least 200 ms apart, and that wait was ~80% of the default mode: default fell from 271 to 35 ms on this machine. -
In a fresh
fedora:latestcontainer on the same laptop the default mode is level (6.3 vs 6.1 ms), with short 3.6 vs 2.3 ms, long 347 vs 331 ms and full 1.08 vs 0.87 s. So the remaining default-mode gap on bare metal is in probes that find real devices there. - macOS is measured below; Windows has not been measured with the matched configs yet.
Dell Inspiron 16 7630 2-in-1, two GPUs (Intel Iris Xe + NVIDIA MX550 render-offload) · 11 October
2026 · hyperfine -N medians (40 runs short/default, 20 long, 12 full, 3 warmup) · fastfetch
2.68.1 · on AC, powersave governor, balanced platform profile.
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
| short | 3.32 ms | 5.81 ms | retch, 1.75× |
| default | 5.78 ms | 19.88 ms | retch, 3.44× |
| long | 224 ms | 526 ms | retch, 2.35× |
| full | 503 ms | 597 ms | retch, 1.19× |
-
v0.20.19 fixed
--shorthere (v0.20.18 in the same sitting: 8.42 ms, behind fastfetch). Thegpuprobe read and walked the 1.6 MBpci.idsonce per GPU, ~4 ms for the Intel iGPU (its entry is near the end of the file) plus ~1.5 ms for the NVIDIA card, whose name the driver then replaced anyway. retch now takes the name udev resolved at boot, reads the NVIDIA driver's name first, and falls back topci.idsonly when neither has one. The AMD machine above never paid this: AMD names come fromamdgpu.ids.
MacBook Pro (Mac15,6), 12 cores (6P + 6E), 18 GB · Current: retch v0.20.20 · 14 October
2026 · hyperfine 2.0.0 --shell=none medians (40 runs short/default, 20 long, 12 full, 3
warmup) · fastfetch 2.70.0 · on AC (battery held at 80%, not charging) · the matched
per-mode configs described above. A second sitting straight after agreed within ~5% in every
mode, and fastfetch's --full did return a public IP and weather.
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
| short | 6.62 ms | 14.61 ms | retch, 2.21× |
| default | 90.1 ms | 146 ms | retch, 1.62× |
| long | 228 ms | 705 ms | retch, 3.09× |
| full | 430 ms | 708 ms | retch, 1.65× |
- The default mode is bound by
phys-mem(~83 ms inRETCH_TIMING=1), thenaudio(~51 ms) anddisplay(~30 ms); every other probe is under 8 ms. -
--longsits on its ~200 mscpu-usagesampling floor (see the Linux block above). - The v0.20.15 figures below were taken on battery and these on AC, so compare the ratios rather than the absolute times.
v0.20.15 · hyperfine -N, on battery, fastfetch 2.69.0 with
benches/fastfetch/<mode>.jsonc:
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
| short | 7.0 ms | 17.0 ms | retch, 2.4× |
| default | 108–126 ms | 145–161 ms | retch, ~1.3× |
| long | 231 ms | 674 ms | retch, 2.9× |
| full | 500 ms | 751 ms | retch, 1.5× |
-
v0.20.14 fixed the default mode here.
phys-diskrandiskutilonce per whole disk, serially, ~0.2 s a call: ~1 s of the run. It now reads IOKit (0.15 ms); v0.20.13 measured 305–322 ms in the same sitting. -
v0.20.15 fixed
--short(43–46 → 7.0 ms). It was all thediskfield: thesysinfocrate's free-space query (CoreFoundation's "available for important usage", ~9 ms per volume). retch now readsstatfs, as fastfetch anddfdo, so on macOS "free" no longer counts purgeable space and can read lower than Finder.
Old methodology. These tables pair retch with fastfetch's built-in default and
-c all, not with the same fields. See Methodology above before quoting them.
Re-measured September 2026 · hyperfine with -N (no intermediate shell), 15–20 runs after
warmup, medians · fastfetch 2.65.2 · retch v0.17.6. The July 2026 figures for v0.3.50 are
kept in the second table below, because the two tell different stories and the older one
should not be quoted as current.
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
short (--short vs -c none) |
45 ms | 79 ms | retch, 1.8× |
| standard (default vs default) | 142 ms | 1339 ms | retch, 9.4× |
long (--long vs -c all) |
424 ms | 1488 ms | retch, 3.5× |
full (--full vs -c all) |
1314 ms | 1468 ms | retch, 1.1× |
Under those (unmatched) pairs, retch was faster in every Windows mode. --full was the last one behind,
and by much more than the v0.13.2 version of this table said: it read 1445 ms against
1334 ms (1.08×), but re-measured before v0.17.6 it was 3226 ms against 1732 ms (1.86×),
and --long had drifted from 286 ms to ~900 ms. Two probes were responsible:
-
gamepadstill spawned PowerShell (Get-PnpDevice, ~2.0–2.5 s inside retch). It is now one native SetupAPI enumeration (~100 ms) applying exactly the same predicate. -
shellreports the shell's version by spawning the shell, which on Windows means starting PowerShell (~200–570 ms). It ran serially after the concurrent probes, so every--longand--fullrun paid it on the critical path; it now runs inside the concurrent scope. The v0.11.2 sweep below had clearedshellbecause removing it from a--fieldsset moved that harness by only 19 ms — but that harness does not model--long, as the same section warns. Absolute elapsed-time marks insidecollect()are what found it.
--full's lead is thin and network-bound: its wall-clock is set by weather and
public-ip, which fastfetch's -c all runs as well, so the tails overlap (retch's slowest
run 1.77 s against fastfetch's 1.60 s). The medians held in both run orders.
Compare the ratios, not the absolute numbers, across these tables. Absolutes drift with
how busy the machine is — fastfetch's own -c none reads 78 ms here and 65 ms in the
previous table, unchanged binary — while the ratio is the stable claim.
What --short actually cost, and why the previous explanation here was wrong. The
v0.13.1 text said a per-field sweep had put the process-startup floor at ~314 ms with 41 of
56 fields inside 20 ms of it, so "the floor itself is the cost… a startup problem rather than
a probing one." Every number in that was real and the conclusion was not. Two sysinfo calls
were being made on every run regardless of which fields were selected, and both reached for
Windows performance counters, whose first touch in a process costs ~180–195 ms:
-
System::load_average()was ungated. On Windows sysinfo has no native load average and synthesises one from a PDH counter sampled every 5 seconds into a process-local static that starts at zero — so in a program that exits in well under a second it can only ever return0.00, 0.00, 0.00. retch never displayed it, and paid ~190 ms for it. -
CpuRefreshKind::everything()asked for CPU frequency on every run. TheCpufield needs only brand and core count, which come from the static CPU list; requesting frequency is what madeSystem::new_with_specificscost 195.5 ms instead of 0.5 ms.
The sweep could not see this, because its own baseline paid it too. The sweep timed each
field against a --fields os control, and --fields os pays both costs — so subtracting the
control cancelled exactly the constant being hunted, and "41 of 56 fields within 20 ms of the
floor" is that cancellation seen from the other side rather than evidence of a cheap field
set. The honest floor is the command that probes nothing: retch --version measures
17.9 ms against fastfetch --version at 46.8 ms, so retch's own startup was never
slow — it begins about 2.6× faster than fastfetch. If you sweep fields on any platform, build
the baseline from --version, or instrument absolute elapsed time from process start.
July 2026, retch v0.3.50 (kept for comparison):
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
short (--short vs -c none) |
164 ms | 74 ms | fastfetch, 2.2× |
| standard (default vs default) | 273 ms | 1348 ms | retch, 4.9× |
long (--long vs -c all) |
1554 ms | 1340 ms | roughly tied |
What changed: retch's Windows gap had been process-spawn overhead — several probes each shelled out to PowerShell (~0.5–1.8 s of interpreter startup apiece), while fastfetch uses native Win32 APIs and spawns nothing. Since probes run concurrently, each mode's wall-clock was set by its slowest spawn. Those probes were migrated to native Win32 FFI, one per release:
-
v0.3.44 —
netdefault-route lookup (~977 ms → native), cutting--short~1149 → ~163 ms. -
v0.3.46 —
phys-disk(Get-PhysicalDisk, ~1684 ms) → storage IOCTLs (~210 ms). -
v0.3.47 —
phys-mem(Win32_PhysicalMemory×2, ~600 ms) →GetSystemFirmwareTableSMBIOS (~152 ms). -
v0.3.48 —
bluetooth(~1765 ms) →bthprops+ SetupAPI (~150 ms). Thebthpropshalf was itself replaced in v0.10.2: it is BR/EDR-only, so it never reported a Bluetooth Low Energy peripheral as connected. Connected devices now come fromSystem.Devices.Connectedon each device node via SetupAPI, at no measurable cost. -
v0.3.49 —
cpu-usagedropped a serial 200 ms sleep viaGetSystemTimeswindow-diffing. -
v0.3.50 —
camera(Get-PnpDevice, ~1359 ms) → SetupAPI (~155 ms). This was the last standard-mode PowerShell pole, so standard mode fell ~1558 → ~273 ms.
Cumulative over the series: short 1149 → 164 ms, standard 1993 → 273 ms, long 3462 → 1554 ms.
-
v0.11.2 —
dns(Get-DnsClientServerAddress, ~3409 ms) →GetAdaptersAddresses(~385 ms). -
v0.13.1 —
battery(Get-CimInstance Win32_Battery, ~2531 ms) → the battery device's own IOCTLs (~10 ms over the startup floor), taking--longfrom behind fastfetch to ~2× ahead. -
v0.17.6 —
gamepad(Get-PnpDevice, ~2.0–2.5 s) → one SetupAPI enumeration (~100 ms). That was the last field that shelled out to PowerShell to query the system. The only PowerShell launch left isshellasking the running shell for its own version, and since v0.17.6 that runs concurrently rather than on the critical path.
(An earlier version of this section said Windows --long was still behind fastfetch, at
3076 ms against 1467 ms. That was true in September 2026 before v0.13.1, and is kept here
only as the record of why battery was next; the current figures are in the table at the
top of this section.)
Two method notes worth keeping, both learned by getting them wrong. -NoProfile does
not help these spawns: bare powershell -Command exit costs 893 ms with a profile and
878 ms without, so the cost is interpreter startup plus real cmdlet work, not profile
loading (the ~642 ms profile figure elsewhere in these notes is about pwsh, PowerShell 7,
not Windows PowerShell 5.1). And timing a field in isolation does not predict its effect on
a mode: shell measures 1284 ms alone but only 19 ms when removed from the full set,
because it overlaps other probes.
Measured July 2026 · hyperfine, 10 runs after 3 warmup runs · fastfetch 2.65.2 · retch
v0.4.3 · no FUSE vaults mounted · just bench-compare.
Old methodology (see above): fastfetch here ran its built-in default and
-c all, not the fields retch shows, so this block is not a like-for-like comparison. The matched Linux figures are in the first block of this section.
| Mode | retch | fastfetch | Faster |
|---|---|---|---|
short (--short vs -c none) |
9.5 ms | 16.7 ms | retch, 1.8× |
| standard (default vs default) | 346 ms | 1095 ms | retch, 3.2× |
long (--long vs -c all) |
469 ms | 1097 ms | retch, 2.3× |
On Linux — retch's primary target — the concurrent, scoped-thread Rust pipeline is faster
than fastfetch in every mode, including --short. This is the mirror image of the
Windows machine above, where a fixed process-startup margin still leaves --short behind;
here retch leads from the smallest invocation on up. Both figures are each tool's own
default invocation (not like for like; see the note above): fastfetch's default and
-c all runs both land near ~1.1 s on this machine — a stable, reproducible cost (σ ≈
10 ms), driven substantially by the package-manager enumeration its default config performs
on Fedora — while retch keeps standard mode around ~350 ms and full --long diagnostics
under ~500 ms.
(More real-hardware machine blocks welcome — one #### block per physical machine, with
CPU/OS context and just bench-compare figures.)
neofetch was the original inspiration for
this entire category of tool but the repository is archived and no longer maintained
(last commit July 2024). retch (like fastfetch) is a spiritual successor: same "logo beside a field list"
presentation, but with active development, better performance (compiled Rust vs. Bash),
and cross-platform support (Linux, macOS, Windows) rather than Linux/macOS/BSD-only.
If you're still on neofetch, migrating to retch or fastfetch gets you the same
familiar output with active maintenance behind it.