Releases: RamenFast/sysmon
Release list
SysMon 3.2.0
SysMon 3.2.0 — the Performance page
The Windows XP Task Manager's Performance tab, in SysMon's own hand.
An LED meter beside a scrolling scope graph for each resource, etched
boxes of totals underneath, a status bar along the bottom. Everything
on one screen, no scrolling to find a number. It is the page the
window opens on now; Overview and Processes are one tab away.
What's on it
- CPU: busy % with kernel time (system + irq + softirq) as a
second trace, or one small graph per thread in/proc/stat
order. A carved two-way switch picks; auto chooses by width, and
the choice survives a restart. - Memory: used, with the page cache beneath it.
- GPU: busy, with VRAM as a second trace.
- Disk and Network: read/write, down/up, autoscaled with the
ceiling written in the corner so a spike never hides what follows. - Thermals: CPU and GPU temperature over time, the busy clock
beside it. No warnings. The heat is shown next to the clock it
costs, and the data speaks. - Totals, Physical memory, Commit charge (
Committed_AS,
CommitLimit, and SysMon's own peak since launch, labelled as such),
Kernel memory (slab, page tables, stacks). - A status bar: processes, CPU, commit, GPU, temperature.
Every graph sits on a dark instrument field tinted to the theme, with a
graticule that moves exactly one step per sample. Clicking a meter
opens that card on the Overview; clicking a graph opens Processes
sorted by that resource. Narrow (430 px) and wide (two columns from
760 px) layouts, all eleven themes, greyscale draws the second trace
dashed.
Still audited
Three new numbers, each checked live against the tool a skeptic would
open: kernel time against mpstat (%sys + %irq + %soft, and never
above busy), commit charge and kernel memory against /proc/meminfo.
The audit is now 66 of 66. Its first run on this branch also
caught a naming bug live: a python3 -I -c "from multiprocessing.resource_tracker import …" launcher was shown as a
bare python3; it is now named by the module, like -m.
Cost
Measured on the same software-rendered display, interleaved with the
installed 3.1.0, child processes counted: the Performance page costs
9.7% of a core (combined) or 11.1% (32 per-thread graphs)
against the 3.1.0 Overview's 11.05%. Memory within 2 MB. The
sampler is unchanged.
That "child processes counted" is a lesson from the review: the first
cut spawned a gsettings subprocess per graph per frame to ask about
reduced motion, and scripts/perf.sh only counted the binary's own
ticks, so it reported 10.9% while the real figure was 28%. The read is
now once per theme change, perf.sh counts cutime+cstime, and the
A/B script fails if the page costs more than the Overview.
Agent surface
sysmon ctl page performance(pages: performance, overview,
processes)sysmon ctl cpugraph auto|combined|per_threadprobe cpucarrieskernel_percent;probe memorycarries
committed_bytes,commit_limit_bytes,slab_bytes,
kernel_stack_bytes,page_tables_bytes. Older consumers see
nothing removed.- Settings:
start_page,cpu_graph_mode. A 3.1 settings file opens
on Performance with the graph decided by width.
Receipts
Spec first (docs/dev/PERFORMANCE-VIEW.md), failure modes V1–V9
listed before the code (docs/dev/FAILURE-MODES.md), a kittest
(ui_performance) that proves the meter and the graph are the same
number, per-thread order, no clipping at 430 and 1240 px, the toggle
persisting, and the click-throughs. 44 e2e screenshots on X11 and a
native Wayland run. Conformance 17/17. A read-only Opus 5.5 reviewer read the diff and
the screenshots before release and returned 24 findings; every one is
addressed, the four P1s with a failing test first: the hidden
subprocess cost above, inline python -c "import x" naming that
mislabelled real processes (now strict and Python-only), one wrongly
typed key in settings.json wiping every other preference (now that
key alone falls back), and the meter and graph being published under
two locks (now one).
SysMon 3.1.0
SysMon 3.1.0 — can I trust the numbers?
This release started with one question: are these statistics right?
So every number the window shows was put next to the tool a skeptic
would open beside it (free, turbostat, mpstat, sensors, df,
lspci, the firmware's DIMM tables), on real hardware, idle and under
load.
3.0.3 agreed on 34 of 50 checks. 3.1.0 agrees on 56 of 56.
The audit ships with the repo (scripts/accuracy-audit.sh), so you can
run it on your own machine.
What was wrong, and is now right
- The CPU's busy clock read up to 2.1 GHz low. It was one instant
read per core, so a core that was busy for most of the window but
idle at the moment of the read reported its idle clock. It now comes
from the clock each core actually delivered over the window (ACPI
CPPC, the same counters turbostat reads, over the same window):
4 MHz from turbostat idle and 62 MHz under load, where it was
855–1655 MHz off. - GPU clocks were a coin toss. RDNA4's clock moves every few
milliseconds between 0 and boost, and a single read can land anywhere
in that range. It's now the mean across the update window. - "Weird things about RAM." Three totals are now told apart:
installed (your sticks, read from firmware), usable (what the
kernel gets), and reserved (the difference). The subtitle names the
sticks and the speed they actually run at. Process memory now comes
fromstatm, which matchesps(the old figure ran up to 6.4 MiB
low). - Per-process CPU moved in 4% steps in
sysmon probe. It now
measures over a full second, so the steps are 1%. - Sensors showed −62 °C and 0 °C from unconnected inputs. They're
now markedplausible: falseand folded away in the window. - Disk numbers now have a referee too. Partition write rate, busy %
and per-process disk writes are checked againstiostatand
pidstatwhile a known 64 MB/s writer runs (67.3 vs 67.1 MB/s). - A shared
sysmon servegave some clients zeros. While one client
kept it busy, another's first ask for different sections answered
with every rate at 0 (or an old average under a new label). Each
section now has its own window. - Plus:
probeprinted1.6357687711715698wheretapprinted
1.5370705;sysmon probe | headcrashed with exit 101 (and a full
disk exited 0 as if the answer arrived: now exit 4); a freshly
startedsysmon serveanswered its first question with all-zero
rates; the GPU name could read "Device 7551";bash -lc "…"showed
its command text as its name; group-by-app merged unrelated Python
programs into one row. All fixed, each with a failing test first.
New
- The Inspector. Click any process and its whole story opens beside
the table: where it came from (the parent chain, each step
clickable), live CPU and memory, its memory told honestly (resident
vs fair share vs what quitting it would free), open files, OOM score,
cgroup, working directory, children to drill into, and its sockets. - Overview ↔ Processes, both ways. A top-3 row opens the Inspector
on that process; "all by memory" opens the table sorted that way; the
strip above the table links each figure back to its card. - Group by app. A browser's forty renderers become one row.
- °F, °C, or both ("131°F · 55°C"). Sizes in decimal GB by default,
binary one click away. - A sensors card you can read. Grouped by what each sensor measures
(CPU, each drive by model, motherboard), with plain names, heat bars
against each sensor's own limit, and fan duty beside rpm, so a fan
driven at 50% that reads 0 rpm stands out. - 29 hand-painted glyphs for sections, process states and sensors.
- GPU VRM temperatures; a busy clock and IO wait on the CPU
card. - The right-click menu now always acts on the process you right-clicked,
even if the list re-sorts while the menu is open.
Lighter
The sampler costs 54% less CPU than 3.0.3 (12.7% → 5.8% of a core
sampling everything at 1 Hz, measured interleaved on the same machine).
The GUI is unchanged. The GPU clock poller parks with no timer when
nobody's watching, so an idle sysmon serve still costs nothing.
For scripts and agents
sysmon ctl temperature celsius|fahrenheit|both. JSON stays in °C.- New fields:
cpu.frequency_busy_mhz+frequency_busy_source,
cpu.iowait_percent,cpu.temperature_source,
memory.installed_bytes,memory.modules[],gpu.clock_source,
gpu.temperature_vrm_*_celsius,processes[].display_name,
sensors.chips[].kind,temps[].plausible,fans[].duty_percent. sysmon schemadocuments every field; a contract test now fails if a
live field goes undocumented.sysmon probe processestakes 1 s (was 0.25 s) for honest
per-process CPU. Probe only the sections you need, or ask a running
instance, for instant answers.--backgroundworks from a Wayland session, and aquitsent while
the GUI is still starting is honored.
Install
sudo apt install ./sysmon_3.1.0_amd64.deb # Debian / Ubuntu / Mint
sudo dnf install ./sysmon-3.1.0-1.x86_64.rpm # Fedora / RHELMotherboard fan and voltage sensors need your board's Super-I/O driver
(sudo modprobe nct6775 on most AMD boards).
Built in Jcode with Claude Opus
5.5, with two read-only Opus 5.5 workers: one audited (22 findings),
one reviewed the result (11 more, all fixed before release).
Receipts: cargo test --release green, clippy clean, conformance
17/17, e2e on X11 and native Wayland, accuracy audit 56/56.
SysMon 3.0.3
Closing the loop opened by v3.0.2: the agent skill now lives in the repo, and drift fails the release.
Why
v3.0.2 fixed a documented socat example that silently failed on the machine it documented. The same bug had also reached the agent skill — which lives outside version control (~/.claude/skills/, ~/.agents/skills/), is never reviewed alongside the code, and would have drifted again with nothing to catch it. That was written down as a known gap rather than fixed. This release fixes it.
What changed
- The skill is authored at
docs/skill/SKILL.md— in the repo, reviewed with the code it describes, covered by the same gates. scripts/install-skill.shinstalls the mirrors, or verifies them with--check(exit 4 on drift, with the fix in the message).- C16 in
scripts/conformance.shfails the release when a mirror diverges. Mutation-proven: appending one line to a mirror drops the score to 16/17 and names both the file and the remedy.
The Hermes mirror is deliberately not installed by the script. Skills sync there on a manual ping only, so concourse doctor reporting it absent is the honest state rather than something to paper over — and the script says so where the next reader will find it.
Removed, honestly
Nothing. This is additive: a source of truth, an installer, and a gate.
Install
# Debian / Ubuntu / Mint
sudo apt install ./sysmon_3.0.3_amd64.deb
# Fedora / RHEL (built on Mint, rpm --test verified — reports welcome)
sudo dnf install ./sysmon-3.0.3-1.x86_64.rpm
# from source
sudo apt install build-essential curl git # apt
sudo dnf install gcc make curl git # dnf
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/RamenFast/sysmon && cd sysmon
cargo build --release && sudo install -m755 target/release/sysmon /usr/local/bin/Verify: sysmon --version → sysmon 3.0.3 (v3).
SHA256SUMS covers every asset; sha256sum -c SHA256SUMS checks them all at once.
Receipts
conformance 17/17 (all three of C13/C14/C15/C16 mutation-proven) · cargo test --release green · scripts/e2e.sh green on a private Xvfb · skill mirrors verified byte-identical to the repo source.
Built with Claude on Ben's machine. GPLv3.
SysMon 3.0.2
A documentation fix with teeth, found by running the manual instead of reading it.
What was wrong
docs/AGENTS.md, docs/API.md and the sysmon agent skill all demonstrated the raw control socket with socat — which is not installed on the machine those docs describe. An agent following the documented example got silence. An instruction that fails on the very machine it documents is worse than no instruction, because the reader trusts it and ends up debugging the documentation instead of their problem.
# before (printed nothing — socat absent)
echo '{"verb":"snapshot","sections":["network"]}' | socat - UNIX:$XDG_RUNTIME_DIR/sysmon/ctl.sock
# after (nc ships with the base system; verified against a live `serve` first)
echo '{"verb":"snapshot","sections":["network"]}' | nc -U $XDG_RUNTIME_DIR/sysmon/ctl.sockAnd a check so it cannot come back
scripts/conformance.sh is 15 checks → 16. C15 extracts every external tool named in a docs code block and fails if this machine does not have it. Mutation-proven: putting socat back drops the score to 15/16 and names both the file and the missing tool.
Removed, honestly
Nothing. socat still works fine if you have it — the docs now simply lead with the tool that is actually present.
Known gap, said out loud
C15 covers the repo's own docs. The agent skill files live outside the repo (~/.claude/skills/, ~/.agents/skills/) and had drifted the same way; both were fixed by hand this round, but nothing would catch it next time. Logged in docs/SERIOUS-TODOS.md rather than left as a quiet assumption.
Install
# Debian / Ubuntu / Mint
sudo apt install ./sysmon_3.0.2_amd64.deb
# Fedora / RHEL (built on Mint, rpm --test verified — reports welcome)
sudo dnf install ./sysmon-3.0.2-1.x86_64.rpm
# from source
sudo apt install build-essential curl git # apt
sudo dnf install gcc make curl git # dnf
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/RamenFast/sysmon && cd sysmon
cargo build --release && sudo install -m755 target/release/sysmon /usr/local/bin/Verify: sysmon --version → sysmon 3.0.2 (v3).
SHA256SUMS covers every asset; sha256sum -c SHA256SUMS checks them all at once.
Receipts
conformance 16/16 · cargo test --release green · scripts/e2e.sh green on a private Xvfb · every example in the skill and in docs/AGENTS.md re-run verbatim against the installed binary, including the socket round-trip and a subscribe stream.
Built with Claude on Ben's machine. GPLv3.
SysMon 3.0.1
A patch release for v3.0.0, and an honest one: everything here was found by pointing two adversarial verifiers at the released binary and telling them to prove its conformance claim wrong. Most attacks bounced. Three landed.
What was wrong
| v3.0.0 | v3.0.1 | |
|---|---|---|
sysmon tap -i NaN |
panicked — raw Rust backtrace, exit 101 | exit 3, with the valid range in the fix |
tap -i 0 / -i 999999 |
silently clamped to 0.2 / 60 | refused as bad arguments — your ask is not quietly rewritten |
--json on an error, on a terminal |
ignored: prose on stderr, nothing parseable on stdout | a complete error envelope, every time |
a tap reading of 0.825 |
printed 0.824999988079071 |
prints 0.825, exactly as v2.2.2 did |
The third one is the subtle one. Adding event to each stream line was done by round-tripping the snapshot through serde_json::Value, which re-types every f32 as f64. The value is the same; the text is not, and a consumer displaying or diffing it would have seen numbers change for no reason anyone could explain. It is now spliced into the serialized text, so the typed serializer keeps its precision.
Also
docs/API.md claimed pause, resume and interval work against sysmon serve. They do not, and never did — serve samples on demand, so there is nothing to pause and no interval to set (drive cadence from the client with tap --interval N). The schema was right and the prose was wrong. The prose now matches, and the schema is the authority.
Removed, honestly
Nothing. Two behaviors changed and both are the point of the release: a bad --interval is now refused instead of clamped, and --json is now honored where it previously wasn't.
The harness grew
scripts/conformance.sh is 13 checks → 15, and the release cannot ship without them:
- C13 fuzzes fourteen hostile inputs (
NaN,±inf,0, negatives,1e400, empty, unicode, doubled flags) and fails on any panic or any exit outside 0/2/3/4. - C14 checks four error paths for a complete
--jsonenvelope.
Both are mutation-proven: reverting the interval guard drops the score to 13/15 and names the panic. A check that cannot fail is not a check.
Rejected, with evidence
Not every finding was real, and the ones that weren't are worth naming. It was claimed that --help and --version must emit JSON — they are discovery output for humans, phosphor (the house exemplar) prints prose for both, and the envelope rule governs replies. It was claimed the enveloped unknown-command error is a regression — it is the v3.0.0 fix, and the old behavior printed nothing parseable at all. One "panic" was the harness's own bug: it grepped combined output, so a process listed in a probe could match the word. It reads stderr only now.
Install
# Debian / Ubuntu / Mint
sudo apt install ./sysmon_3.0.1_amd64.deb
# Fedora / RHEL (built on Mint, rpm --test verified — reports welcome)
sudo dnf install ./sysmon-3.0.1-1.x86_64.rpm
# from source
sudo apt install build-essential curl git # apt
sudo dnf install gcc make curl git # dnf
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/RamenFast/sysmon && cd sysmon
cargo build --release && sudo install -m755 target/release/sysmon /usr/local/bin/Verify: sysmon --version → sysmon 3.0.1 (v3).
SHA256SUMS covers every asset; sha256sum -c SHA256SUMS in the download directory checks them all at once.
Receipts
conformance 15/15 · cargo test --release green (unit, contract, a11y, kittest UI, live accuracy, live network) · scripts/e2e.sh green on a private Xvfb · the f32 fix verified byte-for-byte against the v2.2.2 binary.
Built with Claude on Ben's machine. GPLv3.
SysMon 3.0.0
A compact system monitor for AMD-GPU Linux desktops, with an API an agent can drive without ever seeing a pixel.
v3.0.0 is not a rewrite. It is v2's engine held to the house standard until it passed — and then wired so it cannot quietly stop passing.
v2.2.2 → v3.0.0, honestly
| v2.2.2 | v3.0.0 | |
|---|---|---|
sysmon schema |
prose map; no status/ts; nothing strict |
carries the envelope; strict JSON schemas for the envelope, the stream line and probe's result; every verb's arguments, enums and exit codes published |
| enum lists in the schema | hand-written, free to drift | read from the code that enforces them — a theme can't exist in the docs and not in the binary |
ts |
float unix seconds | ISO-8601 with a UTC offset (2026-08-01T22:14:07+00:00); ts_epoch rides along for arithmetic |
| stream lines | anonymous JSON objects | every line carries event: "snapshot" |
| an unknown command | raw stderr, nothing parseable on stdout | the same envelope as any other error, with a fix |
ctl theme nosuchtheme |
exit 1 | exit 3 — the instance classifies its own failure and the code rides on the wire as exit |
| themes | ten rooms, all moods | eleven — a Greyscale a11y floor, colourless by assertion, WCAG AAA, auto-selected under desktop high contrast |
| motion | egui's linear default | 120 ms smoothstep, and instant when the desktop asks for reduced motion |
| conformance | believed | scripts/conformance.sh — 13 checks against a real binary, and a release gate |
Everything v2 emitted, v3 still emits. Every key and every exit code of 2.2.2 was diffed against 3.0.0 before this shipped; all changes are additive.
Highlights
- The standard is executable.
scripts/conformance.shruns every clause of the workspace agent-first CLI standard against a real binary — envelope, ISO-8601 timestamps, fix-bearing errors, exit codes 0/2/3/4 each provoked, isatty auto-switch proven both ways, stdout purity, stream self-identification, language law, native install. It prints13/13on a terminal and one envelope in a pipe, andrelease.shrefuses to publish without it. - A schema that cannot lie. A command printed by
sysmon schemaand repeated in the docs had returnednullsince v2.0 (.result.top_processes; the field is at.result.network.top_processes). Fixed — then made unrepeatable: a test harvests everyjqpath out of the live schema and out ofdocs/API.mdand runs each one against a real probe. - Greyscale. Ten rooms existed and every one was a mood. This is the room that still reads when colour can't be relied on.
- Two flakes killed at the root. The UI test failed ~1 run in 6 (a fixed-frame wait for a context menu, plus a live process ranking that re-sorted mid-interaction): 0 failures in 25 runs now. Three network tests were blaming sysmon for a rate limiter — they probed with 1 KB and depended on 20 MB, so a 429 read as "the collector saw 0 B/s". They now ask for a real megabyte, fall back to a second host, and skip honestly.
Removed, honestly
- Nothing was removed from the wire.
tschanged type (float → ISO-8601 string) — if you were doing arithmetic on it, readts_epoch, which carries the same instant. sysmon --versionnow says(v3), not(v2).- The old
run_steps(8)-style waits are gone from the context-menu path in the UI suite; if you copied that pattern, prefer waiting for the thing to exist.
Install
# Debian / Ubuntu / Mint
sudo apt install ./sysmon_3.0.0_amd64.deb
# Fedora / RHEL (built on Mint, rpm --test verified — reports welcome)
sudo dnf install ./sysmon-3.0.0-1.x86_64.rpm
# from source
sudo apt install build-essential curl git # apt
sudo dnf install gcc make curl git # dnf
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/RamenFast/sysmon && cd sysmon
cargo build --release && sudo install -m755 target/release/sysmon /usr/local/bin/Double-clicking the package in a file manager works too.
Verify: sysmon --version → sysmon 3.0.0 (v3).
SHA256SUMS covers every asset on this release; sha256sum -c SHA256SUMS in the download directory checks them all at once.
Receipts
conformance 13/13 · cargo test --release green across three consecutive full runs (unit, contract, a11y, kittest UI, live accuracy, live network attribution) · scripts/e2e.sh green on a private Xvfb: 22 theme/page screenshots, pop-out drag-dock, single-instance forward, clean shutdown · old-vs-new structural diff over every documented verb · no Python and no GTK anywhere in the 455-package dependency tree or the packaging.
Built with Claude on Ben's machine. GPLv3.
SysMon 2.2.2
A compact system monitor for AMD-GPU Linux desktops — and a system
state API you can script against. One Rust binary: the window, the
engine, the CLI, the socket.
v2.2.2 is the "refix everything" round: the two v2.2.0 visuals
that were diagnosed instead of fixed are now fixed in code, the app
can never again be mysteriously slow, the sensors walk found
everything it was missing, and the icon finally got its redraw.
v2.2.1 → v2.2.2, honestly
| v2.2.1 | v2.2.2 | |
|---|---|---|
| pin button, selected | glyph recolored toward the accent while the face tinted toward the accent — converged, washed out in every theme | the glyph never chases the accent (phosphor's rule): ink glyph on the accent-eased carved face; readable in all ten rooms |
| scrollbars | stone-colored handles a few shades from their rail — camouflage | text-grade handles (ink idle → accent while dragged), 11 px wide; readable in all ten rooms by construction |
| a slow window | silent | disclosed: the GUI names its render adapter at startup; a CPU-rasterizer fallback (no usable Vulkan driver) warns on stderr with the fix, toasts in-window, and ctl status carries renderer + renderer_hint |
| sensors | temps + fans, and a channel-numbering assumption that silently dropped readings (k10temp's Tccd1) | the walk honors hwmon index gaps (new accuracy identity pins it), and adds voltage rails, power draw vs cap, fan rated max, and drive temps with the drive named (sda · KINGSTON…) via drivetemp/nvme — with a gentle in-card hint naming modprobe drivetemp when drives are temp-less |
| icon | the v1-era placeholder | phosphor-language redraw: two glow traces on a monitor, ice-blue magnifying glass showing them magnified |
| tests | 41 green | 44 green (sensor census vs sysfs, icon render chain, + the standing suites) |
Idle self-cost, re-measured on software rendering (the worst
case — Xvfb/llvmpipe): 7.9% of one core at a 2 s cadence, repaints
strictly event-driven (zero work between samples). On real hardware
the paint cost lives on the GPU.
Removed, honestly
Nothing removed. The wire format only grew (all additions optional:
voltages, power, max_rpm, device, device_model on sensor
chips; renderer/renderer_hint on a GUI's status) — existing
consumers keep parsing.
Install
# Debian / Ubuntu / Mint
sudo apt install ./sysmon_2.2.2_amd64.deb
# Fedora / RHEL (built on Mint, rpm --test verified — reports welcome)
sudo dnf install ./sysmon-2.2.2-1.x86_64.rpm
# from source
sudo apt install build-essential curl git # apt
sudo dnf install gcc make curl git # dnf
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
git clone https://github.com/RamenFast/sysmon && cd sysmon
cargo build --release && sudo install -m755 target/release/sysmon /usr/local/bin/Verify: sysmon --version → sysmon 2.2.2 (v2).
SHA256SUMS covers every asset above.
Built by Ben with Claude Code
(Claude Fable 5).
SysMon 2.2.1
Upgrade-day fix: a plain sysmon launch used to raise whatever GUI was
already running — install a new version with the old window up and you
keep looking at the old UI. Now the new binary compares versions over the
control socket: a same-version instance is raised as before; an older
instance is asked to quit and replaced, with a console line saying so.
Installing a release and relaunching now always shows the version you
installed.
Also: the README was tightened into a single evergreen description
(feature history lives here in the release notes, not on the front page).
No other behavior changes. 42 tests green, full e2e pass, live takeover
receipt: a running 2.2.0 was replaced by this binary during verification.
SysMon 2.2.0
The first feedback release: seven asks from daily driving, all landed.
The process table grew up
- Sort by anything — every column (VRAM, Read/s, Net ↓/↑, …, even Command)
sorts from a whole-header click target with a painted ▲▼ affordance; the
active direction carries the accent, metric columns default biggest-first,
and the choice survives restarts. - Horizontal scrollbar — when the columns outgrow the window the table
scrolls sideways under a real, always-visible bar.
Compare processes (new)
Ctrl+click selects up to five processes — in the table or the overview
top-3 rows — and each one wears its own color. Right-click → Combined
details (or the toolbar's Compare button) opens one window with their
summed CPU / memory / GPU / VRAM / disk / network, a share bar per metric
showing who owns how much, and a color-coded block per process. Shift+click
range-selects; Esc clears.
Getting around
- Right-click any process on the Overview (or in a details window) →
"Open in process viewer" — the table opens scrolled to it, selected.
A filter that would hide it is cleared, with a toast saying so.
Chrome
- The pin button is phosphor's now: carved face that eases toward the
accent, press nudge, the proper push-pin glyph, and thePshortcut. - Scrollbars finally live in the room — solid, sharp, stone handle on a
recessed rail, accent while dragged, in every palette. - Menu options glow under the pointer (they previously gave no hover
feedback at all), with engraved marks and an accent spine on the active row.
Receipts
- 42 tests green (
cargo test): parsers, live accuracy cross-checks,
net attribution, icon chain, and the kittest a11y suite — now also covering
header sorting, multi-select → combined details, the right-click jump,
Escape-clear, and the pin (button +P). - Full e2e on Xvfb+openbox: 20 theme×page screenshots, pop-out drag-dock,
single-instance, contract checks, clean shutdown. - README screenshots regenerated from this build.
- No wire/API changes; settings gain
sort_column/sort_descending
(older files load unchanged, v1 files still migrate).
SysMon 2.1.0
Ten rooms. Switching themes changes the room, not just the paint.
New in 2.1.0
- Four new palettes: Paper (warm reading light, leather
accent), Basalt (bevel city — carved gray stone, steel-blue
accent), Amber CRT (service-terminal amber phosphor), and
Chromacore (the 1905 green terminal this design language grew
from). All ten get equal care: full token blocks, stone triples,
light/dark-aware graph colors. - Two new graph palettes —
amberandterminal— and theme
companions: Amber CRT brings amber graphs, Chromacore brings
terminal greens, Basalt goes mono, Paper warms to sunset. - Deeper UI test suite: the AccessKit harness now walks every
palette asserting the applied style, drives units/compact through
the menu, toggles pop-outs from the card header, and pushes verbs
through the real ctl command queue. The e2e script screenshots all
ten themes per run. - Release-per-main-commit, executable:
scripts/release.sh
refuses dirty trees, version drift, re-tags, and stale README
install commands — then tags, builds, checksums, and publishes.
Every commit on main is a versioned release with its deb + rpm.
Nothing removed; every v2.0.0 surface unchanged. sysmon ctl theme paper|basalt|amber|chromacore and the menu both reach the new rooms.
Install
# Debian / Ubuntu / Mint
sudo apt install ./sysmon_2.1.0_amd64.deb
# Fedora / RHEL (built on Mint, rpm --test verified — reports welcome)
sudo dnf install ./sysmon-2.1.0-1.x86_64.rpm
# from source
git clone https://github.com/RamenFast/sysmon && cd sysmon
cargo build --release && sudo install -m755 target/release/sysmon /usr/local/bin/Verify: sysmon --version → sysmon 2.1.0 (v2). SHA256SUMS
covers every asset.
Built by Ben with Claude Code
(Claude Fable 5).

