Releases: kinncj/Heimdall
Release list
v2.2.7
UI + CLI polish for the unified-memory work, plus a couple of build fixes.
Fixed
- Top view: GB10
gpu.vramdetail wrapped and broke the panel. The(shared)detail was longer than a discrete card's, so it wrapped and mangled the GPU box. It's now clipped to the line and shortened to42/122 GB shared. heimdall-clihid unavailable metrics. It only emitted OK metrics, so Applegpu.vram,npu.util, and anything needing the helper vanished with no reason. Newunavailableobject (name →{status, detail});metricsis unchanged so existing scripts keep working.
Added
npu.utilis Unavailable-with-reason everywhere instead of a bare dash (Apple ANE / Intel AI Boost / AMD XDNA expose no counter).
Build
scripts/release.shbuilds macOS with CGO and refuses a CGO-free darwin binary off a Mac —make releaseon a Mac is no longer a footgun.- Makefile stamps
-X main.versionfromgit describeso local builds report a real version, notdev.
v2.2.6
Linux CPU power was blank next to a busy GPU — now filled and labelled.
Added
power.cpuon Linux from the RAPLcoresubdomain. The privileged path only read the RAPL package (power.pkg), so the top view's CPU power column was blank while the GPU showed 60W+ and the package ~17W. It now also reads thecore(pp0) subdomain aspower.cpu(cores only).
power.pkg is labelled "CPU package" and power.cpu "CPU cores" — both are the CPU socket only. A discrete GPU is a separate rail (power.gpu), which is why power.pkg can sit well below power.gpu; Linux has no whole-system power counter like macOS SMC PSTR. Absent on CPUs with no core subdomain. power.npu stays unavailable (Intel/AMD NPUs expose no power counter, same as Apple ANE).
v2.2.5
GPU VRAM reporting on unified-memory hosts, and a broken nvidia-smi now says why.
Added
- GPU VRAM on unified-memory NVIDIA (GB10 Grace-Blackwell).
nvidia-smireportsmemory.used/memory.totalas[N/A]on GB10 (no discrete VRAM), so hosts like promaxgb10 showed GPU util but nogpu.vram. It's now derived from per-process GPU memory (--query-compute-apps=used_memory) over system RAM total, e.g.34% 41.6 / 121.6 GB (shared). Idle reads a stable0%. Discrete cards are unchanged.
Fixed
- A broken nvidia-smi silently blanked GPU instead of saying why. When nvidia-smi is installed but exits non-zero — most often a
Driver/library version mismatchafter a driver upgrade without a reboot — everygpu.*key vanished.gpu.util/gpu.vramnow come backunavailablecarrying the nvidia-smi reason, so the fix (reboot) is obvious. The blank itself is host driver state, not a Heimdall bug. - Apple Silicon
gpu.vramexplains the dash. Unified memory has no discrete VRAM, so the metric was just absent. It now readsunavailablewithunified memory (no discrete VRAM).
v2.2.4 — helper no longer shadows in-process power/GPU
Patch release.
Fixed
- Running the helper could blank out the power/GPU it was meant to provide. The privileged adapter trusted any successful helper reply — even an empty one — and so a reachable-but-empty helper shadowed the daemon's own in-process reading. On Apple Silicon (IOReport/SMC are unprivileged) bootstrapping the helper made
power.*/gpu.*vanish on a Mac that worked fine without it. The adapter now uses the helper only when it returns anokmetric, else falls back to in-process — additive, never subtractive. Also covers Windows hosts where the helper would shadow thenvidia-smiread.
If your Mac lost power/GPU after starting the helper, this fixes it; you can also just not run the helper on Apple Silicon (IOReport is unprivileged).
v2.2.3 — Windows process CPU/mem fix
Patch release.
Fixed
- Windows process table showed every process at 0% CPU and 0% memory.
tasklisthas no CPU column and the parser dropped its memory column, sopand the top view listed real processes with fake zeros. Windows now readsWin32_PerfFormattedData_PerfProc_Processfor real instantaneous CPU% and working-set memory (% of total RAM), withtasklist(pid + name) as a fallback. macOS/Linux (ps) unchanged.
Deploy the v2.2.3 daemon to Windows hosts to get real per-process CPU/memory.
v2.2.2 — top-view process table fix
Patch release.
Fixed
- First-run wizard stored
process-intervalas0s, so thettop view's process table was empty out of the box. The wizard now prompts for it and suggests2s, storing what you accept. The flag/config default stays0s(off) for headless services — ADR 0017 opt-in posture unchanged. Daemons already started with--process-intervalare unaffected; set0in the wizard to keep it off. - systemd
ExecStartpaths in the privileged-metrics guide now use/usr/local/bin(manual install dir), with a note that AUR installs use/usr/bin.
Re-run the daemon's first-run setup (or pass --process-interval 2s) on hosts where the top-view process table was blank.
v2.2.1 — AMD GPU metrics + richer GPU panel
Patch release: GPU coverage for AMD hardware and a fuller GPU panel.
Added
- AMD GPU metrics —
gpu.util,gpu.vram,gpu.temp,power.gpuon AMD (discrete Radeon and the Strix Halo iGPU). Prefersamd-smi(ROCm), falls back to the in-treeamdgpusysfs nodes — both unprivileged, works with no extra install.npu.utilisunavailableon XDNA until the driver exposes a counter. - Richer GPU panel —
gpu.clock,gpu.mem.util, andgpu.fanon both NVIDIA (nvidia-smi) and AMD. The top view shows clock / mem / fan; anything unavailable renders—. - Per-platform privileged-metrics guides — separate macOS, Linux+NVIDIA, Linux+AMD, and Windows guides (with
amd-smiinstall + Windows service setup).
Deploy the v2.2.1 daemon to AMD hosts to pick up the GPU panel; the hub does not need upgrading.
v2.2.0 — Hliðskjálf: full-screen top view + responsive TUI
A mactop/btop-style single-host view, a vendor-neutral NPU rename, new collectors, and a screen-aware TUI — backward compatible across a mixed fleet.
Added
- Full-screen
topview (Hliðskjálf) — presston a focused host: per-core CPU bars, braille sparklines (CPU/memory/power), GPU/NPU, network & disk, and a process list that fills the screen. Live-refreshing;escback,qquits. Works on macOS, Linux, and Windows. - Responsive across four width tiers (wide grid → iPhone-portrait key-numbers), so it stays readable over SSH from Termius on a phone — and the host detail view is now responsive too.
- New collectors
mem.swap,cpu.load,cpu.freq— each renders—(never a fake 0) where the platform can't supply it (load on Windows, clock on Apple Silicon).cpu.freqreads/syscpufreq on Linux.
Changed
t/p— the process table now opens onp;tis the new top view.- ANE → NPU — accelerator power is the vendor-neutral
power.npu; the legacypower.anekey is accepted and normalised on ingest, so a mixed fleet with older daemons keeps working (additive wire, no proto change).
Upgrade
heimdall-daemon update (and the other binaries). To see the new metrics in the top view, run the v2.2.0 daemon on each host; the hub does not need upgrading (it relays the additive metrics).
See ADR 0020 and docs/guides/12-top-view.md for details.
v2.1.1 — macOS power fix for Apple Silicon Pro/Max
Fixed
-
macOS reported 0 W on Apple Silicon Pro/Max (e.g. M3 Max). Those chips report 0 for the IOReport per-domain CPU/ANE energy counters and only a sub-watt GPU figure, so package power collapsed to ~0 W. Base M-series Macs populate the counters and were unaffected — the variable was the SoC, not the version.
Heimdall now reads the SMC
PSTR("System Total Power") rail — the same unprivileged source mactop/btop use — as the package figure on macOS. The daemon gets real power in-process, no privileged helper needed. Source precedence is now SMC → powermetrics → IOReport sum, so a phantom sub-watt IOReport total can no longer shadow a real reading.Linux (RAPL/hwmon) and Windows (WMI) paths are unchanged.
Upgrade: heimdall-daemon update (and the other binaries), or reinstall from the release assets.
v2.1.0 — ephemeral runs & agent onboarding
Heimdall v2.1.0 — ephemeral runs & agent onboarding
Released: 2026-06-29 · Type: MINOR (additive) · Follows v2.0.0
A quality-of-life follow-up to the everything socket release. Nothing changes in
the transport or the security model — daemons still never listen, the hub is still
the sole listener. v2.1.0 adds two things: ephemeral runs that never rewrite
your config, and broader agent/CLI onboarding so any harness can talk to a
fleet out of the box.
Highlights
--no-save / --ephemeral on every binary
Every binary persists resolved flags to its config file so the next run repeats
them. That is the right default for a daemon you set up once — but wrong for a
one-off. v2.1.0 adds two equivalent flags that run with the given options without
writing them back:
# spin up a hub on a throwaway port without making :19090 the new default
heimdall-hub --listen :19090 --no-save
# point a dashboard at another hub for one session, leave config untouched
heimdall-dashboard --hub other-hub:9090 --ephemeralThe flag itself is never persisted, and it is built in at the catalog layer so it
works uniformly across heimdall-hub, heimdall-daemon, heimdall-dashboard,
heimdall-helper, and heimdall-cli.
Agent onboarding for any harness
The heimdall-cli guide gained drop-in snippets beyond
the Claude Code trio:
- a
.github/copilot-instructions.mdblock for GitHub Copilot, - a portable CLI wrapper plus an OpenAI-style tool schema for Hermes,
OpenAI-compatible, and custom harnesses, - three real, unedited
claude -ptranscripts — a free-form"check my fleet",
the/fleetslash command, and a targeted risk question — showing what fleet Q&A
actually looks like, including hub discovery and capability-gap reporting.
Run-as-a-service guide
The Privileged Metrics guide now has a
complete, verified systemd setup: helper as root, daemon as your user, a
shared heimdall group, and a /run/heimdall socket matching the v2 0660 helper
socket. The fleet guide cross-links it.
Upgrade guide
Drop-in. No config migration, no wire change — a v2.1.0 binary interoperates with a
v2.0.0 hub or daemon.
heimdall-dashboard update # each binary self-updates
heimdall-<binary> --version # confirm v2.1.0Or pull fresh binaries from the release page.
Documentation map
- Guides:
heimdall-cli·
Privileged metrics / run-as-a-service ·
Monitor a fleet - Reference: Configuration · Deployment ·
CHANGELOG - Previous release: v2.0.0 — the everything socket release