readme
This commit is contained in:
2 files changed
+342
No files matched your search
@@ -0,0 +1,307 @@
|
|||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<img src="assets/nyi.svg" width="128" alt="nyi">
|
||||||
|
|
||||||
|
# nyi
|
||||||
|
|
||||||
|
**an animated 3D fetch tool.**
|
||||||
|
|
||||||
|
`donut.c` had a baby with `neofetch`. Your distro logo gets extruded into a
|
||||||
|
solid, lit from an angle you pick, and spun in your terminal while the system
|
||||||
|
info renders next to it.
|
||||||
|
|
||||||
|
[](LICENSE)
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## it runs where you run
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td width="33%" align="center"><img src="assets/demo-desktop.gif" alt="Linux desktop"><br><sub><b>Linux</b> · desktop</sub></td>
|
||||||
|
<td width="33%" align="center"><img src="assets/demo-laptop.gif" alt="Linux laptop"><br><sub><b>Linux</b> · laptop</sub></td>
|
||||||
|
<td width="33%" align="center"><img src="assets/demo-macos.gif" alt="macOS"><br><sub><b>macOS</b></sub></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><img src="assets/demo-android.gif" alt="Android / Termux"><br><sub><b>Android</b> · Termux</sub></td>
|
||||||
|
<td align="center"><img src="assets/demo-ios.gif" alt="iOS / iSH"><br><sub><b>iOS</b> · iSH / NewTerm</sub></td>
|
||||||
|
<td align="center"><sub>same binary, no runtime deps</sub></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## what it does
|
||||||
|
|
||||||
|
- **real 3D.** the logo is extruded into a solid and shaded per-pixel from a
|
||||||
|
configurable light direction — not a pre-rendered animation.
|
||||||
|
- **native info.** everything comes straight out of `/proc`, `/sys`, sysctl,
|
||||||
|
DRM/EDID and your GTK config. no runtime dependencies.
|
||||||
|
- **any logo.** ships with its own pyramid, and borrows any logo `fastfetch`
|
||||||
|
knows (`nixos`, `arch`, `gentoo`, `debian`, `void`, …) when it's installed.
|
||||||
|
drop in your own ASCII art too.
|
||||||
|
- **sub-cell shading.** `sextants` (2×3) and `blocks` (2×2) modes for terminals
|
||||||
|
that draw the Symbols for Legacy Computing block, or a plain ASCII ramp
|
||||||
|
everywhere else.
|
||||||
|
- **mobile aware.** knows Termux (`getprop`, `$PREFIX` dpkg) and iSH.
|
||||||
|
- **declarative.** first-class Nix flake with NixOS and home-manager modules.
|
||||||
|
|
||||||
|
## install
|
||||||
|
|
||||||
|
<details open>
|
||||||
|
<summary><b>Nix</b> (flake)</summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run github:elwrcl/nyi
|
||||||
|
```
|
||||||
|
|
||||||
|
Or add it to your flake inputs and pull in the module — see
|
||||||
|
[Nix modules](#nix-modules) below.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>From source</b> (any distro)</summary>
|
||||||
|
|
||||||
|
Needs Rust 1.74 or newer.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/elwrcl/nyi
|
||||||
|
cd nyi
|
||||||
|
make
|
||||||
|
sudo make install # installs to /usr/local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
`PREFIX` and `DESTDIR` work the way you'd expect:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make install PREFIX="$HOME/.local"
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>Fedora / RHEL / openSUSE</b> (rpm)</summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rpmbuild -ba nyi.spec
|
||||||
|
```
|
||||||
|
|
||||||
|
The spec pulls the `main` tarball and builds with `make`. Note that `cargo`
|
||||||
|
needs network access to fetch `libc` — vendor it first if you're building in a
|
||||||
|
sandbox like OBS or Koji.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>Android</b> (Termux)</summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pkg install rust make git
|
||||||
|
git clone https://github.com/elwrcl/nyi && cd nyi
|
||||||
|
make && make install PREFIX="$PREFIX"
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>iOS</b> (iSH)</summary>
|
||||||
|
|
||||||
|
iSH emulates a 486-class x86 with no SSE, so the usual `i686` build traps on
|
||||||
|
its first floating-point instruction. Cross-compile for `i586` instead — the
|
||||||
|
result is a static musl binary with nothing to install alongside it:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make ish # -> dist/nyi-ish, 636K, statically linked i386
|
||||||
|
```
|
||||||
|
|
||||||
|
Put it in iCloud Drive, then in iSH:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir -p /mnt/icloud
|
||||||
|
mount -t ios . /mnt/icloud # pick the folder in the iOS file picker
|
||||||
|
install -m 755 /mnt/icloud/nyi-ish /usr/local/bin/nyi
|
||||||
|
nyi --frames 60
|
||||||
|
```
|
||||||
|
|
||||||
|
Everything is emulated, so keep `--frames` modest. a-Shell can't run this —
|
||||||
|
it's not an emulator, and iOS won't execute a downloaded ELF.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nyi # spin the detected distro logo next to your info
|
||||||
|
nyi -l nixos # borrow a fastfetch logo
|
||||||
|
nyi --infinite --speed 2 # run until you hit a key
|
||||||
|
nyi --no-info --size 2 # just the shape, twice as big
|
||||||
|
```
|
||||||
|
|
||||||
|
| flag | what it does |
|
||||||
|
| --- | --- |
|
||||||
|
| `-l, --logo <name>` | use a logo by name. `triangle` (aka `pyramid`, `nyi`) is built in; anything `fastfetch --list-logos` prints also works |
|
||||||
|
| `--rotate-x` / `--rotate-y` | lock rotation to one axis |
|
||||||
|
| `-s, --speed <float>` | rotation speed multiplier (default `1.0`) |
|
||||||
|
| `--size <float>` | logo scale, `0.5`–`5.0` |
|
||||||
|
| `--depth <float>` | extrusion depth, `0.1`–`10.0`. unset, it's derived from the logo's character variance so flat art doesn't look paper-thin |
|
||||||
|
| `--height <n>` | render height in rows. unset, it matches the info block |
|
||||||
|
| `--no-info` | logo only |
|
||||||
|
| `--no-color` | drop the logo coloring |
|
||||||
|
| `--frames <n>` | stop after `n` frames (default `2000`) |
|
||||||
|
| `--infinite` | run forever — any key or `Ctrl-C` exits |
|
||||||
|
| `--shading-mode <mode>` | `ascii` (default), `blocks` (2×2) or `sextants` (2×3) |
|
||||||
|
| `--shading-chars <str>` | custom ramp, dimmest first. UTF-8 is fine |
|
||||||
|
| `--box` | draw a border around the info block |
|
||||||
|
| `--config <path>` | use this config instead of the default |
|
||||||
|
| `--dump-logo <name>` | print a logo in `logo.txt` form, taken from fastfetch |
|
||||||
|
| `--fetch-logo <name>` | the same, downloaded — for machines without fastfetch |
|
||||||
|
| `-V, --version` · `-h, --help` | version / help |
|
||||||
|
|
||||||
|
Sub-cell modes need a terminal that renders the Symbols for Legacy Computing
|
||||||
|
block — kitty, Ghostty, foot and NewTerm all do.
|
||||||
|
|
||||||
|
## configuration
|
||||||
|
|
||||||
|
`$XDG_CONFIG_HOME/nyi/config`, defaulting to `~/.config/nyi/config`.
|
||||||
|
|
||||||
|
List the field names you want, one per line, **in display order**. Delete or
|
||||||
|
comment out a line to hide that field. Settings go in the same file as
|
||||||
|
`key=value` and are order-independent.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
# fields, in the order they're drawn
|
||||||
|
os
|
||||||
|
kernel
|
||||||
|
uptime
|
||||||
|
packages
|
||||||
|
shell
|
||||||
|
wm
|
||||||
|
terminal
|
||||||
|
cpu
|
||||||
|
gpu
|
||||||
|
memory
|
||||||
|
disk
|
||||||
|
colors
|
||||||
|
|
||||||
|
# an extra mount point beyond / (repeatable, up to 8)
|
||||||
|
disk=/home
|
||||||
|
|
||||||
|
# settings
|
||||||
|
label_color=magenta # red green yellow blue magenta cyan white, or "38;5;213"
|
||||||
|
separator=- # repeated under the user@host title; "" leaves it blank
|
||||||
|
box=0
|
||||||
|
shading_mode=sextants
|
||||||
|
logo_outer=magenta # extruded sides
|
||||||
|
logo_inner=white # front and back faces
|
||||||
|
light=top-left # top-left top-right top left right front bottom-left bottom-right
|
||||||
|
spin=xy # x, y or xy
|
||||||
|
speed=1.0
|
||||||
|
size=1.0
|
||||||
|
depth=1.0
|
||||||
|
height=20
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>all available fields</summary>
|
||||||
|
|
||||||
|
`os` `host` `kernel` `uptime` `packages` `shell` `display` `wm` `theme`
|
||||||
|
`icons` `font` `cursor` `terminal` `cpu` `gpu` `memory` `swap` `disk` `ip`
|
||||||
|
`battery` `locale` `colors`
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### borrowing a logo without fastfetch
|
||||||
|
|
||||||
|
`fastfetch` keeps its ~500 logos as string literals compiled into a 3.2 MB
|
||||||
|
binary. nyi doesn't carry them, and it doesn't reach for the network while it
|
||||||
|
draws either — a fetch tool that blocks your shell on a DNS lookup is a broken
|
||||||
|
fetch tool. Instead you export a logo once, and it becomes an ordinary
|
||||||
|
`logo.txt`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# on a machine that has fastfetch
|
||||||
|
nyi --dump-logo apple > ~/.config/nyi/logo.txt
|
||||||
|
|
||||||
|
# on one that can't run it — iSH, a lean Termux, a container
|
||||||
|
nyi --fetch-logo apple > ~/.config/nyi/logo.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
`--fetch-logo` pulls a single text file from [`logos/`](logos) over `curl` or
|
||||||
|
`wget`. It is the only thing in nyi that opens a socket, it only runs when you
|
||||||
|
name it on the command line, and it shells out rather than linking a TLS stack
|
||||||
|
— one `libc` dependency is why the binary is 600 KB. Point it somewhere else
|
||||||
|
with `NYI_LOGO_URL` if you'd rather host your own.
|
||||||
|
|
||||||
|
The `logos/` directory is generated, not maintained by hand:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make && ./tools/dump-logos.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### your own logo
|
||||||
|
|
||||||
|
Drop ASCII or Unicode art in `$XDG_CONFIG_HOME/nyi/logo.txt`. Denser
|
||||||
|
characters (`@`, `M`, `#`) come out taller in the relief, sparse ones (`.`,
|
||||||
|
`,`) stay low — the art doubles as a heightmap. ANSI colors in the file are
|
||||||
|
preserved; without them, `logo_outer` / `logo_inner` decide the palette.
|
||||||
|
|
||||||
|
An optional first line picks a distro's color scheme:
|
||||||
|
|
||||||
|
```
|
||||||
|
# distro: nixos
|
||||||
|
```
|
||||||
|
|
||||||
|
## Nix modules
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
inputs.nyi.url = "github:elwrcl/nyi";
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, in a NixOS or home-manager configuration:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
imports = [ inputs.nyi.nixosModules.default ]; # or homeManagerModules.default
|
||||||
|
|
||||||
|
programs.nyi = {
|
||||||
|
enable = true;
|
||||||
|
info = [ "os" "kernel" "uptime" "cpu" "memory" "colors" ];
|
||||||
|
labelColor = "38;5;213";
|
||||||
|
shadingMode = "sextants";
|
||||||
|
light = "top-left";
|
||||||
|
spin = "xy";
|
||||||
|
disks = [ "/home" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Every option is documented in [`nix/settings.nix`](nix/settings.nix). Anything
|
||||||
|
the module doesn't cover yet goes through `extraConfig`, which is appended to
|
||||||
|
the generated config verbatim. There's an overlay at `overlays.default` if you
|
||||||
|
just want the package.
|
||||||
|
|
||||||
|
## building
|
||||||
|
|
||||||
|
```nix
|
||||||
|
nix develop # cargo, rustc, clippy, rustfmt, rust-analyzer, fastfetch
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make # release build, copied to ./nyi
|
||||||
|
make check # --version and a one-frame smoke test
|
||||||
|
cargo test # unit tests
|
||||||
|
cargo clippy --all-targets -- -D warnings
|
||||||
|
cargo fmt --check
|
||||||
|
```
|
||||||
|
|
||||||
|
The build stamps a codename into `--version` via `NYI_CODENAME`; the Makefile
|
||||||
|
and the Nix package both pass `nyiotxa`.
|
||||||
|
|
||||||
|
## license
|
||||||
|
|
||||||
|
[ISC](LICENSE) © elwrcl
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256" role="img" aria-label="nyi">
|
||||||
|
<title>nyi</title>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="face" x1="0" y1="0" x2="0" y2="1">
|
||||||
|
<stop offset="0.00" stop-color="#5ef08a"/>
|
||||||
|
<stop offset="0.22" stop-color="#f2e05a"/>
|
||||||
|
<stop offset="0.48" stop-color="#f0603c"/>
|
||||||
|
<stop offset="0.74" stop-color="#c14ee0"/>
|
||||||
|
<stop offset="1.00" stop-color="#4f7ff0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="side" x1="0" y1="0" x2="0" y2="1">
|
||||||
|
<stop offset="0.00" stop-color="#2f9c58"/>
|
||||||
|
<stop offset="0.22" stop-color="#a08f2a"/>
|
||||||
|
<stop offset="0.48" stop-color="#9c3721"/>
|
||||||
|
<stop offset="0.74" stop-color="#7a2e91"/>
|
||||||
|
<stop offset="1.00" stop-color="#2c4a99"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- left face: lit -->
|
||||||
|
<path d="M128 24 L24 216 L128 216 Z" fill="url(#face)"/>
|
||||||
|
<!-- right face: extruded side, in shadow -->
|
||||||
|
<path d="M128 24 L232 216 L128 216 Z" fill="url(#side)"/>
|
||||||
|
<!-- ridge -->
|
||||||
|
<path d="M128 24 L128 216" stroke="#0d0d12" stroke-width="3" stroke-opacity="0.35"/>
|
||||||
|
<!-- scanlines, echoing the ascii ramp -->
|
||||||
|
<g stroke="#0d0d12" stroke-opacity="0.16" stroke-width="2">
|
||||||
|
<path d="M89 96 L167 96"/>
|
||||||
|
<path d="M76 120 L180 120"/>
|
||||||
|
<path d="M63 144 L193 144"/>
|
||||||
|
<path d="M50 168 L206 168"/>
|
||||||
|
<path d="M37 192 L219 192"/>
|
||||||
|
</g>
|
||||||
|
<path d="M128 24 L232 216 L24 216 Z" fill="none" stroke="#0d0d12" stroke-opacity="0.45" stroke-width="4" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
Reference in new issue
Block a user