New feature
Dedicated CPU / Memory / GPU / Network pages. The catch-all
"System" page is gone; each resource now has its own focused screen
with the full picture, no overlap. The Electron Live tab gets matching
cards.
CPU page
Per-core utilization bars + average headline, load average (1 / 5 /
15 min), current vs max frequency, CPU temperature, top 3
CPU-consuming processes, battery (when present).
Memory page
Memory-pressure bar (the cache-excluded "would-this-swap?" metric),
used / total GB, swap usage, breakdown by active / inactive / cached,
top 3 RAM-consuming processes, primary disk usage.
GPU page (new)
Cross-platform best-effort detection:
- macOS (Apple Silicon + Intel) via
ioreg -a -r -c IOAccelerator
— IOAccelerator'sPerformanceStatisticsdict, parsed with
plistlib. No sudo required. Apple Silicon has unified memory, so
we show the currently allocated MB with no fixed total. - NVIDIA (any OS) via
nvidia-smi --query-gpuCSV — util, VRAM,
temperature, power. - Linux AMD via
/sys/class/drm/card*/device/gpu_busy_percent+
mem_info_vram_*.
When no GPU is detectable, the page renders a friendly "GPU stats not
available" with a user-facing reason ("NVIDIA driver tools are not
installed", "macOS did not expose GPU statistics", etc.) — not
jargon.
Network page (new)
Active outbound interface (discovered via the kernel route table),
current down / up throughput, per-interface table with cumulative
totals since the OS counters last reset (typically boot).
Wire-protocol additions
system.* gains cpu_freq_mhz, cpu_freq_max_mhz, load_1m/5m/15m,
ram_swap_*, ram_active/inactive/cached_gb, and an ifaces[] array
of the top-3 interfaces. New top-level gpu block with
{available, vendor, name, util_pct, vram_used_mb, vram_total_mb, temp_c, power_w, count}. Full schema example in docs/protocol.md.
Migration
The firmware page enum bumped from 8 → 12 IDs. PAGE_SYSTEM (id 1) is
kept as a reserved/deprecated slot and masked from display, so the
v0.1.11 pages_enabled_mask / pages_order blobs in NVS remain valid
across the upgrade — bit 1 is silently stripped at restore time, the
8-byte porder blob is detected and falls back to defaults. No
manual reset is needed; just update the firmware via Settings →
Updates.
Upgrading
- Pages live in firmware — flash via Settings → Updates →
"Update firmware". - GPU collector + cards live in the agent + UI — updating the
Electron app brings both.
After flashing, the device immediately picks up the 4 new pages. Use
Settings → Pages to reorder them and the auto-advance setting
from v0.1.9+ still cycles through whatever you've enabled.
Other notes
No removals — the system.* field shape stays backwards compatible
(legacy cpu_pct, ram_pct, net_up/down_kbps continue to be
emitted alongside the new fields). Old v0.1.11 firmware on a v0.1.12
agent keeps rendering the same metrics it always did.
Diagnosed and reviewed across multiple rounds with the codex agent —
including the implementation pass that caught the deprecated-page
counting bug, the sparse-id "all enabled" sentinel, line-scraping
ioreg fragility, and jargon error strings. All 3 firmware envs
compile clean. 176/176 agent tests pass (11 new GPU tests).