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 againsttopacross 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. zhorexits 1 under pressure, sozhor >/dev/null || collect-diagnosticsneeds no parsing.--jsonfor machines.zhor recentreads 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, andSIGTERMescalating toSIGKILLon a second click. Greyed out for processes you don't own, wherekillwould only return EPERM. - Nothing is killed automatically, on purpose.
rustcat 250% CPU is a correctrustc, and an autokiller would eat exactly that.
Install:
git clone https://github.com/Petyok/zhor ~/zhor && ~/zhor/install.shNeeds quickshell and python3. No pip dependencies. ~/zhor/uninstall.sh returns hyprland.conf byte for byte.
Full list in CHANGELOG.md.
🤖 100% vibecoded.