All notable changes to vramwatch are documented here. The format follows Keep a Changelog and the project aims to follow Semantic Versioning.
0.7.0 - 2026-07-19
This is the launch-shape rewrite around one promise: see why a local LLM ran out of accelerator memory and determine what will fit before loading it.
- Replace the exploratory
predict,snapshot, anddevicescommands with the focusedfit,report, anddoctorworkflows. Old names return explicit migration messages and usage status 2.
fit MODEL --quant Q --context Nresolves local/HTTPS GGUFs, Hugging Face repositories, and Ollama registry models without launching them. Remote sources use API/manifest sizes plus a bounded ranged GGUF-header read; sharded Hub files are summed and incomplete/ambiguous/unknown-size inputs fail closed.- Conservative
conservative-v1planning: full-residency weights, exact rational KV-cache widths, expected/runtime-ceiling terms, and a per-device safety margin. It reports separate fits-on-device and fits-right-now verdicts, with unknown current usage kept distinct from zero free memory. A valid non-fit exits 3. - Stable JSON envelopes for fit, doctor, and report, all with schema version 1.
- Explicit provenance across console and JSON: measured
[M], loader-reported[R], model-estimated[E], policy-assumed[A], and user-supplied[U]. doctorchecks provider execution, device capacity/current usage, loader health, resident-model GPU evidence, state storage, and optional metadata registries, with layer-specific remediation.- A private local prediction ledger. Watch matches predictions to resident models, waits for stable observations, and records signed/absolute prediction error.
report --svgemits a shareable hardware/model/context/accuracy card. SVG output strips local paths and URL queries, omits host/process identifiers, supports deterministic--staticrendering, and protects existing files by default.- Native Apple-silicon Metal provider using the recommended working-set budget and conservative non-overlapping Mach free/inactive counters, explicitly modelled as unified memory.
- Native macOS CI/release builds for arm64 and Intel so Metal is linked into shipped binaries; Linux arm64 and Windows/Linux amd64 artifacts remain included.
- The shell installer verifies release archives against the published SHA-256 checksum before extracting them.
- The README now leads with a deterministic animated walkthrough of preflight fit, provenance-aware watch output, doctor diagnostics, and the SVG report.
- GGUF KV metadata now preserves different key and value head dimensions.
- GGUF
general.file_typemapping follows the upstreamllama_ftypeenum, including current K/IQ/TQ/BF16 formats. Optional file type is no longer confused with F32. - Ollama observations retain quantization, digest, artifact path, and VRAM source
for stricter prediction matching. Derived registry tags preserve Ollama's
canonical quant spelling (for example
q4_K_M). - Device providers now state whether capacity and current usage were actually
measured.
fitnever treats an unavailable usage counter as an empty card.
- All preflight size arithmetic saturates on overflow so hostile metadata cannot wrap into an optimistic fit.
- Direct URLs must expose the complete artifact size; a partial response's
Content-Lengthis never mistaken for total model size. - Ranged GGUF responses are parsed incrementally and closed as soon as the architecture is complete; 16 MiB is a ceiling rather than a routine transfer.
- Prediction IDs are validated before constructing ledger paths, and records are written privately through same-directory temp-file replacement.
- The exact documented model-first syntax (
fit MODEL --quant ... --context ...) is covered end to end despite Go's default non-interspersed flag parsing.
0.6.0 - 2026-07-05
Switch the AMD provider from rocm-smi to amd-smi.
- AMD GPUs are now read via
amd-smiinstead ofrocm-smi.amd-smiis AMD's current SMI CLI;rocm-smiis deprecated in its favour, so vramwatch no longer callsrocm-smiat all. It runsamd-smi static --json(identity + capacity) andamd-smi metric --mem-usage --json(live VRAM used/free), joined on the per-GPU index. The new parser handlesamd-smi's JSON-array root and{value, unit}leaves, tolerates any field or block collapsing to"N/A", and corrects theMB-labelled values (which are really MiB). The name-fallback safeguard is preserved: a GPU with no product name shows asAMD GPU N, and an entry with neither VRAM numbers nor identity is skipped rather than shown as a phantom. - The
amd-smiparser is hardened against degraded output (found via adversarial review): a cardamd-smican name but not size — common on Windows, where many queries return"N/A"— is kept with an unknown capacity instead of vanishing;usedis derived fromtotal − free(and vice-versa) when only one is reported; a quoted or floatgpuindex still joins; and an implausibly huge VRAM value is rejected rather than saturating the total.
0.5.0 - 2026-07-05
Feature-complete. Every planned GPU vendor (NVIDIA, AMD) and loader (Ollama,
llama.cpp) is implemented and covered by fixture tests. Still 0.x — the CLI and
JSON shapes can change as field reports arrive — but the capabilities are shipped.
See "Feature status" in the README.
- Measured weights for Ollama. vramwatch now reads the model's GGUF blob (via
the path in
/api/show) for a real weight size, instead of leaving weights as thefootprint − KVremainder. This separates compute/scratch VRAM from weights. Validated on real hardware: qwen2.5:0.5b split as weights 379.4 MiB (the blob size) + KV 48 MiB + compute 32.1 MiB, summing to Ollama's reportedsize_vram. - A golden test pins the
--jsonsnapshot schema, so an accidental change to the machine-readable output (a field added, removed, renamed, or reformatted) fails CI. Regenerate deliberately with-update-golden.
- llama.cpp model names on Windows showed the full path (
path.Basedoesn't split on\); now the basename is shown. Found while validating against a real GGUF. - rocm-smi parser hardened against real-world output. Three defects that would
bite a real Linux+AMD user are fixed: (1) a card value that nests a JSON object
(ROCm 6/7 emit these — metrics, MI300 partition info) no longer makes the whole
parse fail and drop every AMD GPU; (2) a card that reports no VRAM
(headless/masked) is skipped instead of appearing as a phantom 0-byte GPU; (3) the
GPU name no longer falls back to the hex device id (
0x744c) — it uses the product name or a cleanAMD GPU N. Each is covered by a regression test.
docs/VALIDATION.md: end-to-end real-hardware validation (AMD RX 7900 XT + Ollama on Windows). Device VRAM matches the registry/counter, the weights/KV split sums to Ollama's reported VRAM, and the KV cache grows exactly with context (matching the model's real GQA architecture).- Reframed the README "Road to 1.0" section as "Feature status" (feature-complete,
with NVIDIA and AMD-on-Linux implemented + fixture-tested and awaiting field
reports), and renamed VALIDATION.md's "Still to validate" to "Awaiting field
reports". Added an
amd-smifallback to the roadmap.
0.4.0 - 2026-07-05
Focus: real-hardware validation. vramwatch now works on Windows AMD.
- Windows GPU provider. On Windows, where AMD's consumer driver ships no
rocm-smi, vramwatch reads the real VRAM size from the registry (HardwareInformation.qwMemorySize) and usage from the built-inGPU Adapter Memory\Dedicated Usageperformance counter (typeperf), with no extra tooling; NVIDIA stays onnvidia-smi. Validated live against a real Radeon RX 7900 XT, where total/used match the registry and the counter exactly. (Discrete Intel Arc cards go through the same path but are untested; integrated GPUs, which report no dedicated VRAM, are not detected. Multi-GPU usage is left unattributed rather than guessed.) VendorIntel, and an OS-specific provider hook so more platforms can plug in.
- Before this, vramwatch reported "no GPUs detected" on Windows with an AMD card.
0.3.0 - 2026-07-05
Focus: complete per-process attribution.
- Per-process VRAM for AMD on Linux, read from the kernel’s
/proc/<pid>/fdinfoDRM interface (deduplicated by DRM client id, mapped to a device by PCI address). Previously per-process was NVIDIA-only. The reader is vendor-neutral (amdgpu/i915), though only AMD devices are surfaced for now. - The inference footprint is now matched by process name (
ollama/llama-server) when a loader doesn’t report a PID, so per-process VRAM improves the footprint on NVIDIA and AMD instead of being collected and ignored.
- The
rocm-smiquery adds--showbusto recover each device’s PCI address.
0.2.0 - 2026-07-05
Focus: reduce the estimation limitations and document the method in full. Still 0.x, so the tool is young and hasn't been validated on a broad range of real hardware yet (see “Road to 1.0” in the README).
- KV cache dtype support via
--kv-cache-type(and$VRAMWATCH_KV_CACHE_TYPE), so a quantized cache (q8_0,q4_0,f32, …) is estimated correctly instead of silently assuming f16. - GGUF header parsing (
internal/gguf): vramwatch reads the model file’s header directly, giving llama.cpp a real weights/KV split for the first time (architecture + weight size) instead of only a context number. - Weights derived from a GGUF file size are labelled
estimated, and attribution derives the footprint from weights+KV when a loader (llama.cpp) reports no VRAM. - Animated demo GIF hero, generated reproducibly (
make gif).
- New METHODOLOGY.md, covering the attribution model and KV math in depth, with a worked example and a measured-vs-estimated breakdown.
- New FAQ.md.
- README rewritten: a comparison to
nvidia-smi/nvtop/nvitop, an accuracy table, the new--kv-cache-typeworkflow, and trimmed, honest limitations.
0.1.0 - 2026-07-05
Initial public release. Includes, on top of the core tool, the fixes from a full
adversarial code review (correct exit codes, robust nvidia-smi/rocm-smi
parsing, reported-weights-win attribution, known-arch prediction fallback,
install.sh fallback, Windows ANSI).
First public release.
watch: live TUI stacked VRAM bar that updates as the KV cache grows, with a per-segment legend, resident models, and an OOM-risk line.snapshot: one-shot breakdown to the console,--json, or an--svgbranded scorecard (the shareable artifact).--staticfor reproducible output.predict: max context that fits before OOM, and a--context Nfit check for a target context length.devices: diagnostics for detected GPU providers, loader providers, and GPUs.- Within-process VRAM attribution: weights vs KV cache vs compute vs other apps, tiling the device exactly.
- KV-cache estimation from model architecture (GQA/MQA aware, quantized-cache
aware) using the standard
2 · layers · kv_heads · head_dim · bytesformula. - GPU providers: NVIDIA (
nvidia-smi) and AMD (rocm-smi), including per-process attribution where the driver reports it. - Loader providers: Ollama (first-class, pulls architecture from
/api/show) and llama.cpp (best-effort context + model name via/props). demoandmock:PATHdata sources for hardware-free demos, tests, and CI.- Single static, dependency-free binary for Linux, macOS, and Windows.