Skip to content

tuxctl v0.3.3

Choose a tag to compare

@Seqat Seqat released this 30 Sep 00:32
· 26 commits to main since this release
9a0bc13

v0.3.3 redesigns the Overview as a set of cards that uses the whole terminal, and adds what a system monitor is expected to show: component temperatures, GPU usage, CPU power, swap and every local filesystem, colored by load. It also makes risky keys safer: SIGTERM now needs Shift+T, and q asks before quitting. There were no 0.3.1 or 0.3.2 releases.

New

  • Overview cards. CPU, GPU, Memory, Network, Storage and Pinned, each with its model, temperature and power in the title and a graph as wide as the card. At 150 columns and more they form a 2×2 grid with Storage below and Pinned on the right; at 100–149 columns Storage and Pinned sit side by side; narrower terminals stack the cards by priority. Hostname, kernel, uptime and process counts moved into the top border. A short terminal gives up the per-CPU grid first, then graph height, then list rows, and only then whole cards.
  • Temperatures for CPUs, GPUs, NVMe and SATA disks and network adapters, from the kernel's hwmon drivers and thermal zones. A sleeping GPU is never woken to be read.
  • GPU usage. Utilization graph, VRAM, fan and power: through NVML for NVIDIA GPUs on the proprietary driver, through sysfs for amdgpu, and power and fan for nouveau.
  • Colors by load. Utilization, graphs, pinned processes' CPU and temperatures go from light blue through green, yellow and orange to red. Temperatures are colored as a share of the component's critical temperature. True color, 256-color and 16-color terminals are supported.
  • CPU package power where your user can read it: from zenpower, or from RAPL energy counters if an administrator makes them readable (see "Optional setup" in the README for a udev rule and its security trade-off). tuxctl asks for no privileges.
  • Swap and every local filesystem on the Memory and Storage cards.
  • tuxctl --check lists the sensors tuxctl finds on your machine and what would enable the missing ones (drivetemp for SATA disks, readable RAPL counters, a glibc build for NVIDIA).
  • Popups grey out the screen behind them.

Changed

  • Breaking: SIGTERM is requested with T / Shift+T instead of t. Keys that change the system or persistent state (signals, pins) use Shift.
  • q opens the main menu with Exit selected; Enter or q again quits. Ctrl+C still quits immediately.
  • Graphs keep 240 samples and fill the card; the Network graph uses a logarithmic scale, so one spike no longer flattens everyday traffic.
  • Hardware sensors are read only while the Overview is visible.

NVIDIA GPUs

NVIDIA's proprietary driver has no hwmon sensors, so tuxctl loads the driver's own libnvidia-ml.so.1 (NVML) at run time when it finds such a GPU. NVML costs about 20 MiB of memory and a little CPU on the Overview; --no-nvidia-temperature leaves it unloaded. On laptops with runtime power management, NVML is opened only while the GPU is awake, so tuxctl never keeps it powered. The static binaries below cannot load NVML; to see NVIDIA temperatures and usage, build from source with cargo install (see Installation).

Performance

Measured with the static release binary on an AMD Ryzen 5 7500F at the default interval: 0.6% CPU when idle on Overview, 13.4 redraws per second under 240 Hz mouse hover, and about 2.7 MiB of RSS after 15 minutes, with no growth after warm-up. Measured alternately with v0.3.0 on the same machine (3 runs each), CPU is unchanged within run-to-run noise. The binary is about 20% larger (1.74 MB). A glibc build that loads NVML uses about 31 MiB.

Verification

  • 505 unit tests and 6 command-line integration tests passing (glibc; 502 + 6 on musl)
  • cargo fmt --check PASS
  • cargo check PASS
  • cargo clippy --all-targets --all-features -- -D warnings PASS (glibc and musl)
  • cargo test PASS
  • cargo build --release --locked PASS (glibc and musl)
  • scripts/smoke.py 38/38 on the glibc and musl release builds
  • CI green, including MSRV 1.88 and the redraw guards at the default and 250ms intervals

Minimum supported terminal size: 40×15. Minimum supported Rust version: 1.88.

Installation

Linux only

Prebuilt binary (x86_64 or aarch64):

arch=$(uname -m)
base=https://github.com/Seqat/tuxctl/releases/download/v0.3.3
curl -LO "$base/tuxctl-$arch-unknown-linux-musl.tar.gz" -LO "$base/SHA256SUMS"
sha256sum -c --ignore-missing SHA256SUMS
tar xzf "tuxctl-$arch-unknown-linux-musl.tar.gz"
install -Dm755 "tuxctl-$arch-unknown-linux-musl/tuxctl" ~/.local/bin/tuxctl

From source (Rust 1.88 or newer; needed for NVIDIA temperatures and usage):

cargo install --git https://github.com/Seqat/tuxctl --tag v0.3.3 --locked