# Changelog
All notable changes to this project are documented here. The format is based on
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [0.2.2] - 2026-09-22
### Changed
- Replace all 25 bundled logos with traditional ASCII adaptations of the
original project artwork, with source attributions and separate artwork terms.
- Refresh the README illustration and project cover.
## [0.2.1] - 2026-09-21
### Fixed
- Bound external commands to two seconds, including custom modules and logos;
terminate and reap timed-out children.
- Detect the window manager from the current desktop or process ancestors,
rather than unrelated sessions' processes.
- Let later `exec` definitions replace earlier labels, case-insensitively.
- Truncate values when zero or one terminal columns remain.
- Match the macOS VM statistics structure to Apple's revision 2 layout.
### Added
- QEMU execution tests for Linux ARM64, RISC-V64 and LoongArch64, alongside
native Linux x86_64 and macOS ARM64/Intel tests.
- CLI regression tests for configuration precedence, terminal width,
session detection and command timeouts.
## [0.2.0] - 2026-07-23
### Added
- **macOS support** (Apple Silicon and Intel). A new darwin platform layer
(`src/sys/darwin.rs`) binds `extern "C"` directly to libSystem — `statfs`
(`$INODE64` off arm64), `sysctlbyname`, mach `host_statistics64`, libproc's
`proc_pidinfo`, `gethostname`, `isatty`/`TIOCGWINSZ` — plus the CoreGraphics
active-display list. Raw syscalls are not a stable ABI on macOS, and std
already links libSystem there, so the zero-external-dependency rule holds.
Every detection module gained a `target_os = "macos"` path: OS from
SystemVersion.plist with the marketing-codename map ("macOS 26.4 (Tahoe)
arm64"), Kernel "Darwin x.y.z", CPU brand string (+ nominal max frequency
on Intel), Memory and Swap matching `vm_stat`/Activity Monitor, Disk on the
shared APFS container (used = total − available, as fastfetch reports it),
Host as the device tree's `product-name` over the `hw.model` board id (no
model table to age), GPU from the IOAccelerator registry (+ core count),
DE "Aqua" / WM "Quartz Compositor", Packages as brew/brew-cask/macports
directory counts, Battery via `pmset`, Terminal via
`$TERM_PROGRAM`(+`_VERSION`): Apple Terminal, iTerm2, Warp.
- Apple logo, taken verbatim from fastfetch like the rest of the set:
`--logo macos` (aliases `apple`, `osx`, `mac`); `auto` always picks it on
macOS.
- CI builds, tests, lints and **runs** purefetch on real macOS runners (arm64
and Intel), asserting the darwin output lines; the MSRV job compile-checks
`aarch64-apple-darwin` too.
- Nix flake: `aarch64-darwin` and `x86_64-darwin` systems; `meta.platforms`
now includes darwin.
### Changed
- The platform layer moved from `src/sys.rs` to `src/sys/{mod,linux,darwin}.rs`;
`hostname()` and the parent-chain pid/name lookup used by Shell/Terminal
live there now. No behavior change on Linux.
## [0.1.12] - 2026-07-15
### Fixed
- Disk on an impermanence/tmpfs root: when `/` is a tmpfs (erase-your-darlings
setups) the whole-pool detection keyed on `/` being ZFS, so it fell back to
`statfs("/")` and reported the few-MiB RAM root instead of the pool. It now
also locates the pool via `/nix` (where the store lives), so the disk reads as
the real pool on tmpfs-root ZFS systems too.
## [0.1.11] - 2026-07-05
### Fixed
- Debian and Devuan logos rendered every literal `$` doubled (a visibly fatter
swirl than fastfetch's): the art files are taken verbatim from fastfetch,
whose format escapes a literal `$` as `$$`, but the renderer printed both
characters. `$$` now renders as one `$` — and `$0` stays literal with and
without color — so upstream art files render identically to fastfetch.
- OS on Debian derivatives (Ubuntu, Mint, Pop!\_OS, ...): `/etc/debian_version`
was preferred unconditionally, so the OS line showed the Debian *base*
codename instead of the distro version (e.g. "Ubuntu trixie/sid (noble)"
instead of "Ubuntu 24.04 (noble)"). The file is now used only when
os-release says `ID=debian`.
- Disk on filesystems whose fragment size differs from the preferred I/O size
(e.g. NFS): block counts are now multiplied by `f_frsize`, as `df` does,
falling back to `f_bsize` only when a filesystem leaves `f_frsize` at 0.
- GPU on hybrid systems: with the NVIDIA proc interface present, other
adapters (e.g. the Intel iGPU) were hidden; they are now appended via
`lspci`. Single-GPU NVIDIA systems still spawn no subprocess (the second
vendor is detected from `/sys/class/drm` first).
- `--logo-file` with an unreadable path and `--logo-exec` with a failing
command now print a warning on stderr instead of silently dropping the logo.
- Uptime under one minute shows seconds instead of "0 mins".
- A flag value that literally reads `--config`/`--no-config` (e.g. a strange
`--logo-file` name) is no longer misread by the config-file pre-scan.
### Changed
- MSRV 1.70 is now verified for real: a dedicated CI job builds and tests on
Rust 1.70, and `Cargo.lock` is kept in the v3 format so pre-1.78 cargo can
parse it (the v4 lockfile broke `git clone` + `cargo build` on 1.70–1.77).
- Leaner crates.io package: `assets/cover.png`, `.github/` and the Nix flake
files are excluded from the published `.crate`.
- Documented: the verbatim fastfetch import in 0.1.10 reintroduced non-ASCII
art in four logos (manjaro/nixos block glyphs, garuda `°`, mint `´`),
superseding 0.1.8's "all logos are 7-bit ASCII" — deliberate, art now tracks
fastfetch byte-for-byte.
## [0.1.10] - 2026-07-05
### Added
- Multi-color logos: a logo's `.txt` can define several colors (a `COLORS:` line
of SGR params) selected by `$1`..`$9` markers in the art, fastfetch-style, so
distro logos render in their real multi-tone colors. A literal `$` is any `$`
not followed by a digit, so the Debian swirl still renders correctly.
- Unit tests for the pure parsing/formatting helpers (IEC/percent formatting,
ANSI width & strip, lspci / cpuinfo parsing, ppid & uptime & DRM-connector
parsing, config-line and logo-marker handling).
### Changed
- All bundled distribution logos are now taken from fastfetch (which builds on
neofetch's set) and render in their native colors, replacing the previous mix
of adapted single-color art. Attribution and the MIT notices for both projects
are in [CREDITS.md](CREDITS.md).
## [0.1.9] - 2026-07-04
### Fixed
- `--no-logo` / `--logo none` now suppress a logo configured via `--logo-file` /
`--logo-exec` (e.g. from the config file). Logo sources are resolved by argument
order, so a command-line flag overrides one coming from the config.
- GPU (lspci fallback): AMD adapters showed the `[AMD/ATI]` vendor tag instead of
the model. Drop the vendor tag and a trailing `(rev …)`, so the marketing name
(e.g. `Radeon RX 7900 XTX`, `Raphael`) is shown. NVIDIA/Intel unaffected.
- KDE Plasma version: prefer the full `plasmashell --version` (e.g. `6.2.4`) over
the major-only `KDE_SESSION_VERSION`, which is now only a fallback.
- `--config` with no path now errors, consistent with the other value-taking flags.
- No more trailing whitespace on logo-only output rows.
### Changed
- A standalone `--exec` (without `--modules`) now appends its line to the default
layout instead of being silently ignored.
## [0.1.8] - 2026-07-04
### Fixed
- Memory: report `MemTotal - MemAvailable` (matching `free`/htop). The previous
ZFS-ARC subtraction under-reported used memory — the ARC genuinely occupies RAM.
- Disk on a ZFS root: report the whole pool via `zpool list` (labelled
`Disk (<pool>)`) instead of only the root dataset's few GiB.
### Changed
- Logos: `nixos` and `manjaro` are now pure ASCII (were solid block-glyph art).
All 24 bundled logos are strictly 7-bit ASCII.
## [0.1.7] - 2026-07-04
### Added
- Config file: any option can be set (one `key value` per line) in
`$PUREFETCH_CONFIG`, `~/.config/purefetch/config`, or `/etc/purefetch/config`,
so plain `purefetch` reproduces a custom setup. `--config` / `--no-config`.
- `--logo-exec <CMD>`: use a custom logo from a command's output, regenerated
each run (e.g. for status-driven logos).
## [0.1.6] - 2026-07-04
### Added
- `--exec <LABEL:command>`: add a custom info line from a shell command, placed in
`--modules` by its (lowercased) label. Repeatable.
## [0.1.5] - 2026-07-04
### Added
- `--modules <LIST>`: choose which info modules to show, in order, with `-` for a
separator (e.g. `os,host,kernel,-,cpu,gpu,memory,swap,-,shell`).
## [0.1.4] - 2026-07-04
### Added
- `--logo-file <PATH>`: use a custom logo read verbatim from a file (ANSI and
all), for fastfetch-style custom logos.
- `--no-color-blocks`: hide the trailing ANSI color blocks.
## [0.1.3] - 2026-07-04
### Changed
- Rewrote the logo generator in Rust (`examples/genlogos.rs`) and dropped the
Python tooling, so the project is 100% Rust again.
## [0.1.2] - 2026-07-04
### Fixed
- Distro logos rendered in the wrong color: the logo generator emitted an
incomplete SGR (missing the `38;2;` truecolor prefix), so every logo appeared
washed out instead of its brand color. Affected 0.1.0 and 0.1.1.
## [0.1.1] - 2026-07-04
### Added
- More bundled distro logos: gentoo, endeavouros, kali, elementary, zorin,
artix, rocky, almalinux, centos, devuan, mx, garuda.
- `riscv64` and `loongarch64` support (raw syscalls), joining x86_64 and aarch64.
### Fixed
- CPU detection on riscv (and ppc / some ARM SoCs), which lack a `model name`
field in `/proc/cpuinfo` — fall back to `uarch` / `isa` / `cpu` / `Hardware`.
## [0.1.0] - 2026-07-04
Initial release.
### Added
- fastfetch-style system information with a distro logo, written entirely in Rust
with **zero external dependencies** (`std` + raw x86_64/aarch64 Linux syscalls).
- Info modules: OS, Host, Kernel, Uptime, Packages, Shell, Display, DE, WM,
Terminal, CPU, GPU, Memory, Swap, Disk, Locale, Battery, plus the color blocks.
- ZFS-aware memory usage (subtracts the reclaimable ARC).
- Bundled logos: debian, arch, ubuntu, fedora, mint, manjaro, pop, opensuse,
alpine, void, nixos, tux — auto-detected from `/etc/os-release`.
- CLI: `--logo`, `--no-logo`, `--no-color`, `--version`, `--help`.
- Dual-licensed MIT OR Apache-2.0.
[Unreleased]: https://github.com/ooonea/purefetch/compare/v0.2.2...HEAD
[0.2.2]: https://github.com/ooonea/purefetch/compare/v0.2.1...v0.2.2
[0.2.1]: https://github.com/ooonea/purefetch/compare/v0.2.0...v0.2.1
[0.2.0]: https://github.com/ooonea/purefetch/compare/v0.1.12...v0.2.0
[0.1.12]: https://github.com/ooonea/purefetch/compare/v0.1.11...v0.1.12
[0.1.11]: https://github.com/ooonea/purefetch/compare/v0.1.10...v0.1.11
[0.1.10]: https://github.com/ooonea/purefetch/compare/v0.1.9...v0.1.10
[0.1.9]: https://github.com/ooonea/purefetch/compare/v0.1.8...v0.1.9
[0.1.8]: https://github.com/ooonea/purefetch/compare/v0.1.7...v0.1.8
[0.1.7]: https://github.com/ooonea/purefetch/compare/v0.1.6...v0.1.7
[0.1.6]: https://github.com/ooonea/purefetch/compare/v0.1.5...v0.1.6
[0.1.5]: https://github.com/ooonea/purefetch/compare/v0.1.4...v0.1.5
[0.1.4]: https://github.com/ooonea/purefetch/compare/v0.1.3...v0.1.4
[0.1.3]: https://github.com/ooonea/purefetch/compare/v0.1.2...v0.1.3
[0.1.2]: https://github.com/ooonea/purefetch/compare/v0.1.1...v0.1.2
[0.1.1]: https://github.com/ooonea/purefetch/compare/v0.1.0...v0.1.1
[0.1.0]: https://github.com/ooonea/purefetch/releases/tag/v0.1.0