A donut.c-inspired fetch tool that spins your distro logo in 3D with live-updating system info.
Takes any ASCII/Unicode distro logo, turns each character into a point cloud
based on its visual density, and renders it as a rotating 3D relief with
Blinn-Phong shading. System info is gathered natively from /proc, /sys,
and GTK config — no external dependencies required.
Based on gentoo.c.
make
./fetch
Press any key to stop — the keypress passes through to the shell, so it works as a startup fetch. Ctrl-C works too.
sudo make install
PREFIX=~/.local make install if you don't want it system-wide.
Add this repo to your flake.nix. The package is built using the unstable channel. You can overwrite this by setting inputs.nixpkgs.follows = "nixpkgs" (if your default is 25.11).
inputs = {
...
areofyl-fetch.url = "github:areofyl/fetch";
...
}You also need to import the nix package in your home.nix. Check nix/home-module.nix for the options. Most are the same but hyphens can not be used so camel-case has been used for those options instead.
{ pkgs, inputs, ... }:
{
import = [ inputs.areofyl-fetch.homeManagerModules.default ];
programs.fetch = {
enable = true;
labelColor = "red";
info = [];
speed = 1.0;
spin = "xy";
};
}By default it auto-detects your distro and grabs the logo from fastfetch (if installed) with its original per-character colors preserved. Works with any of fastfetch's 500+ distro logos!
You can also specify one directly:
./fetch -l arch
./fetch -l NixOS
./fetch -l asahi
Or drop a custom logo in ~/.config/fetch/logo.txt:
# distro: gentoo
-/oyddmdhs+:.
-odNMMMMMMMMNNmhy+-`
...
Without fastfetch, the built-in Gentoo logo is used.
All system info is gathered natively — no fastfetch or neofetch needed:
- OS —
/etc/os-release - Host —
/proc/device-tree/modelor/sys/class/dmi/id/product_name - Kernel —
uname() - Uptime —
/proc/uptime - Packages — emerge, pacman, dpkg, rpm, xbps, apk
- Shell —
$SHELL+ version - Display —
/sys/class/drm/card*/modes - WM — env vars + process detection
- Theme/Icons/Font —
~/.config/gtk-3.0/settings.ini - CPU —
/proc/cpuinfoor device-tree (Apple Silicon) - GPU — DRM device uevent
- Memory/Swap —
/proc/meminfo - Disk —
statvfs() - Battery —
/sys/class/power_supply(energy_now/energy_full) - Local IP —
ip addr
Stats like memory, battery, and uptime update in real-time while the logo spins.
Create ~/.config/fetch/config to customize:
# fields — list to show, in this order
# remove or comment out to hide
os
host
kernel
uptime
packages
shell
display
wm
theme
icons
font
terminal
cpu
gpu
memory
swap
disk
ip
battery
locale
colors
# appearance
# label_color=magenta (red, green, yellow, blue, magenta, cyan, white)
# separator=─ (character for the title separator)
# shading=.,-~:;=!*#$@ (characters for 3D shading, supports UTF-8)
# 3d
# light=top-left (top-left, top-right, top, left, right, front, bottom-left, bottom-right)
# spin=xy (x, y, or xy)
# speed=1.0 (rotation speed)
# size=1.0 (logo scale, e.g. 2.0 for double size)
# height=36 (override render height in rows)
| Flag | Description |
|---|---|
-l, --logo <name> |
Use a logo from fastfetch by name |
--rotate-x |
Lock rotation to X axis only |
--rotate-y |
Lock rotation to Y axis only |
-s, --speed <float> |
Speed multiplier (default 1.0) |
--size <float> |
Scale the logo (e.g. 2.0 for double size) |
--height <n> |
Override render height in rows |
--no-info |
Just the logo, no system info |
--no-color |
Disable coloring |
--frames <n> |
Stop after n frames |
--infinite |
Run forever |
--shading-chars <str> |
Custom shading ramp, supports UTF-8 |
-h, --help |
Show help |
CLI flags override config file settings.
PRs are welcome! If you want to add a feature, fix a bug, or package fetch for your distro, go for it. I try to keep the codebase small and easy to understand, so smaller PRs are easier to merge than big ones.
If you want to chat about ideas before writing code, reach out on Reddit or open an issue.
Each character in the logo gets a weight based on its visual density — M is
heavy, . is light, █ is full, ░ is thin. That weight becomes a height,
turning the flat logo into a 3D relief. Surface normals come from the height
gradient, and everything gets rotated + projected + shaded every frame with a
z-buffer. Single file C, no deps beyond libm.
