Another system fetch util but specialized for Xorg and Xlibre, window managers, non systemd systems.
Find a file
riomoo bbba1695c4
declaring 1.0
Co-authored-by: riomoo <alister@kamikishi.net>
Co-committed-by: riomoo <alister@kamikishi.net>
2026-04-09 06:16:41 +00:00
cmd/nbl declaring 1.0 2026-04-09 06:16:41 +00:00
docs/images/svgs declaring 1.0 2026-04-09 06:16:41 +00:00
.gitignore declaring 1.0 2026-04-09 06:16:41 +00:00
go.mod declaring 1.0 2026-04-09 06:16:41 +00:00
LICENSE declaring 1.0 2026-04-09 06:16:41 +00:00
README.md declaring 1.0 2026-04-09 06:16:41 +00:00

Nibblefetch

system info, for systemd-less systems


LICENSE

Custom badge


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-release or registry
  • Kernel: from uname -r or Windows NT version
  • Uptime: from /proc/uptime or GetTickCount64
  • Shell: from $SHELL or 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.