Skip to content

zhor v0.1.0

Latest

Choose a tag to compare

@Petyok Petyok released this 19 Aug 11:23

First release. A pill in the Hyprland bar, a process list on click, and a CLI that says what is stalling the machine.

  • CPU is a tick-to-tick delta, not ps -o pcpu. That average covers a process's whole lifetime, so a panel quietly eating half a core for twelve hours reports 22% while it is at 57% right now. Cross-checked against top across 16 processes: 56.0 vs 55.5.
  • PSI (/proc/pressure) is read alongside, and the verdict order matters. Memory stall outranks CPU contention, because during a stall every process looks busy and the CPU ranking names the wrong one. When the machine is blocked on memory, zhor blames footprint and swap instead.
  • zhor exits 1 under pressure, so zhor >/dev/null || collect-diagnostics needs no parsing. --json for machines.
  • zhor recent reads a log the daemon keeps. This is the part a snapshot cannot give you: a freeze gets asked about after it has ended, and by then the box looks calm. Alerts land in ~/.local/state/zhor/events.jsonl, deduplicated per process, self-rotating at 2000 lines.
  • Buttons, not automation: SIGSTOP/SIGCONT, renice -n 19, and SIGTERM escalating to SIGKILL on a second click. Greyed out for processes you don't own, where kill would only return EPERM.
  • Nothing is killed automatically, on purpose. rustc at 250% CPU is a correct rustc, and an autokiller would eat exactly that.

Install:

git clone https://github.com/Petyok/zhor ~/zhor && ~/zhor/install.sh

Needs quickshell and python3. No pip dependencies. ~/zhor/uninstall.sh returns hyprland.conf byte for byte.

Full list in CHANGELOG.md.

⚠️ The buttons send real signals to real processes — they do exactly what they say, which is the dangerous part.
🤖 100% vibecoded.