A microscopic fetch script in Rust, for NixOS systems.
Find a file
NotAShelf c301ce0feb
lock stdout
To help prevent race conditions, and ensuring safe output
2024-11-09 21:13:12 +03:00
.github update demo again, again 2024-08-15 20:45:46 +03:00
benches add benchmarking for individual functions (#9) 2024-08-15 17:43:39 +00:00
nix add benchmarking for individual functions (#9) 2024-08-15 17:43:39 +00:00
src lock stdout 2024-11-09 21:13:12 +03:00
.envrc additional nix tooling 2024-08-05 03:48:51 +03:00
.gitignore nix package 2024-08-04 01:14:17 +03:00
Cargo.lock increment cargo version 2024-08-17 21:14:09 +03:00
Cargo.toml increment cargo version 2024-08-17 21:14:09 +03:00
flake.lock nix package 2024-08-04 01:14:17 +03:00
flake.nix provide a microfetch package 2024-08-15 21:07:58 +03:00
LICENSE initial commit 2024-08-03 19:06:29 +03:00
README.md improve credits section; reorganize README 2024-08-15 21:07:40 +03:00

https://deps.rs/repo/github/notashelf/microfetch

Microfetch

Stupidly simple, laughably fast fetch tool. Written in Rust for speed and ease of maintainability. Runs in a fraction of a millisecond and displays most of the nonsense you'd see posted on r/unixporn or other internet communities. Aims to replace fastfetch on my personal system, but probably not yours. Though, you are more than welcome to use it on your system: it's pretty fast...

latest demo

Features

  • Fast
  • Really fast
  • Minimal dependencies
  • Actually really fast
  • Cool NixOS logo (other, inferior, distros are not supported)
  • Reliable detection of following info:
    • Hostname/Username
    • Kernel
      • Name
      • Version
      • Architecture
    • Current shell (from $SHELL, trimmed if store path)
    • Current Desktop (DE/WM/Compositor and display backend)
    • Memory Usage/Total Memory
    • Storage Usage/Total Storage (for / only)
    • Shell Colors
  • Did I mention fast?

Motivation

Fastfetch, as its name indicates, a very fast fetch tool written in C, however, I am not interested in any of its additional features and I very much dislike the defaults. Microfetch is a fetch tool that you would normally write in Bash and put in your ~/.bashrc but actually really fast because it opts-out of all customization options provided by Fastfetch. Why? Because I can.

I cannot re-iterate it enough, Microfetch is annoyingly fast.

Benchmarks

Microfetch's performance is mostly hardware-dependant, however, the overall trend seems to be < 2ms on any modern (2015 and after) CPU. Below are the benchmarks with Hyperfine on my desktop system.

Command Mean [ms] Min [ms] Max [ms] Relative Written by raf?
microfetch 1.3 ± 0.0 1.3 1.4 1.00 yes
fastfetch 31.9 ± 0.8 30.8 33.8 24.08 ± 0.98 no
pfetch 254.2 ± 4.8 246.7 264.9 191.97 ± 7.10 no
neofetch 735.4 ± 9.5 721.1 752.8 555.48 ± 19.08 no

As far as I'm concerned, Microfetch is faster than almost every fetch tool there is. The only downside of using Rust is introducing more "bloated" dependency trees and increasing build times. The latter is easily mitigated with Nix's binary cache, though.

To benchmark individual functions, Criterion.rs is used. See Criterion's Getting Started Guide for details or just run cargo bench to benchmark all features of Microfetch.

Installation

Microfetch is packaged in nixpkgs. You can get it through the unstable channel for the time being. The Nix flake can also be used for bleeding-edge builds.

Non-Nix users will have to build Microfetch with cargo. It is not published anywhere but I imagine you can use cargo install --git to install it from source.

cargo install --git https://github.com/notashelf/microfetch.git

Microfetch is currently not available anywhere else. Though, does it really have to be?

Customizing

You can't.

Why?

Customization, of any kind, is expensive: I could try reading environment variables, parse command-line arguments or read a configuration file but all of those increment execution time and resource consumption by a lot.

Really?

To be fair, you can customize Microfetch by, well, patching it. It's not the best way per se, but it will be the only way that does not compromise on speed.

The Nix package allows passing patches in a streamlined manner by passing .overrideAttrs to the derivation.

Contributing

I will, mostly, reject feature additions. This is not to say you should avoid them altogether, as you might have a really good idea worth discussing but as a general rule of thumb consider talking to me before creating a feature PR.

Contributions that help improve performance in specific areas of Microfetch are welcome. Though, prepare to be bombarded with questions if your changes are large.

Hacking

A Nix flake is provided. nix develop to get started. Direnv users may simply run direnv allow to get started.

Non-nix users will need cargo and gcc installed on their system, see Cargo.toml for available release profiles.

Thanks

Huge thanks to everyone who took the time to make pull requests or nag me in person about current issues. To list a few, special thanks to:

Additionally a big thank you to everyone who used, talked about or criticized Microfetch. I might have missed your name here, but you have my thanks.

License

Microfetch is licensed under GPL3. See the license file for details.