- Go 100%
Co-authored-by: riomoo <alister@kamikishi.net> Co-committed-by: riomoo <alister@kamikishi.net> |
||
|---|---|---|
| cmd/nbl | ||
| docs/images/svgs | ||
| .gitignore | ||
| go.mod | ||
| LICENSE | ||
| README.md | ||
Nibblefetch
system info, for systemd-less systems
LICENSE
WHAT IS THIS?
Nibblefetch is a fast, lightweight system info tool written in Go. It's like neofetch, but built for systems that don't run systemd.
It works on:
- Void Linux (xbps)
- Artix Linux (pacman)
- Gentoo (portage)
- Alpine Linux (apk)
- Devuan (dpkg)
- Windows (yes, really)
- Any unknown Linux... it tries its best
WHAT IT SHOWS
_______ vinny@voidbox
\_____ `- ─────────────
/\ ___ `- \ OS Void Linux
| | / \ | | Kernel 6.9.3_1
| | \___/ | | Uptime 2d 4h 12m
\ `-_____ \/ Shell zsh
`-______\ Display sway (Wayland)
CPU AMD Ryzen 5 @ 3.6GHz (12)
Memory 4012 MiB / 15987 MiB
Packages 847 (xbps)
███ ███ ███ ███ ███ ███ ███ ███
███ ███ ███ ███ ███ ███ ███ ███
Fields displayed:
- OS: distro name from
/etc/os-releaseor registry - Kernel: from
uname -ror Windows NT version - Uptime: from
/proc/uptimeorGetTickCount64 - Shell: from
$SHELLor Windows env vars - Display: Wayland compositor, X11/XLibre WM, or Win32 DWM
- CPU: vendor, model, frequency, core count
- Memory: used / total in MiB
- Packages: installed count + package manager name
INSTALL
From source (requires Go 1.26+):
git clone https://github.com/riomoo/nibblefetch
cd nibblefetch
go build -o ./bin/nbl ./cmd/nbl
sudo mv ./bin/nbl /usr/local/bin/
Or just run it directly:
go run ./cmd/nbl
USAGE
nbl [OS] [flags]
Test a specific distro's logo:
nbl void
nbl artix
nbl gentoo
nbl alpine
nbl devuan
nbl windows
CPU display flags:
| Flag | What it does |
|---|---|
| (default) | Full name + frequency + cores |
--no-freq |
Strip frequency, keep full name |
--short-cpu / -s |
Abbreviate vendor (e.g. i7-12700K) |
--short-freq-cpu |
Short name + compact frequency |
Other flags:
| Flag | What it does |
|---|---|
--small-logo |
Compact box logo (Windows only) |
-h, --help |
Show help |
CPU FLAG EXAMPLES
Given a CPU: Intel Core i7-12700K @ 3.60GHz
nbl → Intel Core i7-12700K @ 3.60GHz (12)
nbl --no-freq → Intel Core i7-12700K (12)
nbl -s → i7-12700K (12)
nbl --short-freq-cpu → i7-12700K @ 3.6GHz (12)
DISPLAY DETECTION
Nibblefetch figures out your display server without any deps:
WAYLAND_DISPLAY set? → Wayland (compositor name)
DISPLAY set? → X11 (WM name) or XLibre
XWayland detected? → X11 (XWayland)
Nothing? → None / TTY
Windows? → Win32 (DWM)
It scans /var/log/Xorg.0.log (and ~/.local/share/xorg/) to
detect XLibre vs plain X.Org without needing root.
PACKAGE MANAGERS SUPPORTED
| Distro | Manager | Command |
|---|---|---|
| Void | xbps | xbps-query -l |
| Artix | pacman | pacman -Q |
| Gentoo | portage | qlist -I |
| Alpine | apk | apk info |
| Devuan | dpkg | dpkg-query |
| Windows | registry + scoop + choco | (no subprocess) |
On Windows, package counting is fully concurrent and subprocess-free —
it reads the registry, ~/scoop/apps, and C:\ProgramData\chocolatey\lib
in parallel.
ADDING A NEW DISTRO
Three steps:
1. Add package counting in sys_linux.go:
func countMyDistroPackages() string {
out, err := runCommand("mypkgmgr", "list")
if err != nil { return "N/A" }
return countLines(out) + " (mypkgmgr)"
}
2. Add a logo in main.go inside getLogo():
case "mydistro":
t := Theme{Primary: brightBlue, Secondary: blue, ...}
return Logo{
Theme: t,
Lines: []string{ /* your ASCII art */ },
}
3. Connect it in countPackages():
case "mydistro":
return countMyDistroPackages()
COLORS & THEMES
Each distro logo has a Theme with four fields:
type Theme struct {
Primary string // logo + username color
Secondary string // info label color
Tertiary string // info value color
Dim string // divider + separator color
}
Standard ANSI codes are used throughout. The color swatch at the bottom of the output shows all 16 terminal colors.
PLATFORM NOTES
┌───────────────────────────────────────────────────────┐
│ Linux build: go build -o ./bin/nbl ./cmd/nbl │
│ Windows build: go build -o ./bin/nbl.exe ./cmd/nbl │
│ │
│ Cross-compile Linux → Windows: │
│ GOOS=windows go build -o ./bin/nbl.exe ./cmd/nbl │
│ │
│ Cross-compile Windows → Linux: │
│ GOOS=linux go build -o ./bin/nbl ./cmd/nbl │
└───────────────────────────────────────────────────────┘
Platform-specific code lives in sys_linux.go and sys_windows.go,
gated by Go build tags. main.go is fully portable.
PROJECT LAYOUT
nibblefetch/
└── cmd/
└── nbl/
├── main.go — shared types, logos, rendering,
│ entry point
├── sys_linux.go — Linux: OS detect, CPU, memory,
│ packages, display
└── sys_windows.go — Windows: registry, WinAPI calls,
package counting
WHY NOT SYSTEMD?
I wanted to support as many systemd-less distros as I could - Void, Artix, Gentoo, Alpine, Devuan the distros that do things their own way.
Nibblefetch written in Go, runs anywhere.