1.0.0
21 August 2026
FIRST RELEASE
Added
- System modules — CPU with per-core rings, Memory with pressure and swap rate, GPU and Neural Engine, Disk throughput and per-volume space, Network up/down with top talkers, Power and Thermals with SMC sensors, fans and wattage.
- LLM Monitor — Ollama and LM Studio detection, live tokens per second, time to first token, context fill, model size, and a pre-load guard that warns when a model will exceed free memory.
- Containers — Docker, OrbStack and Colima grouped by compose project, with restart-loop detection.
- Dev Processes — Node, Bun, Python, databases and build tools tagged with the repository they run from, and build-finished notifications with elapsed time.
- Port Map — every listening port as a chip, conflicts flagged, one-click kill behind a confirmation.
- Remote Agents — agentless SSH polling for machines listed in
~/.macvitals/remotes.yaml. - Insights and alerts — hour-of-day baselines, correlated anomaly cards, and a WHEN·FOR·THEN rule builder with notification, shell, webhook and menu bar flash actions.
- Deep dashboard — correlated multi-metric chart with a synced crosshair, timeline with event markers, process X-ray, benchmarks with history deltas, and PDF/JSON report export.
- Surfaces — five menu bar widget styles, tear-off floating widgets, an optional notch display, five theme packs, full keyboard navigation and VoiceOver chart summaries.
- Mac Vitals Lite — a sandboxed edition for the Mac App Store, keeping system vitals and the LLM monitor.
Fixed before release
- Memory pressure was reporting occupancy. It computed used ÷ total, and because macOS keeps free pages near zero by design, that reads about 98% on any Mac that has been awake a while — permanently, regardless of real pressure. It now reports memory that cannot be reclaimed without swapping, and agrees with the system: 35% measured where the old formula said 93%.
- Per-core rings were labelled backwards. Cores were classified performance or efficiency by index < count ÷ 2. On an M2 Pro (8 performance, 4 efficiency) that mislabels half of them, and efficiency cores come first in any case. Classification now comes from the kernel.
- The dropdown never attached its content. A nil-check that could never be true meant the panel opened empty. Every dropdown CPU measurement ever taken for this app had been measured against a blank window.
- The dropdown cost 38% of a core once it had content. Eleven cards is roughly twice what fits in the panel, and the eager stack laid out and animated all of them. Now 2.4%.
- Closing the dropdown quit the app. A menu bar app inherits terminate-after-last-window unless it opts out, which stayed invisible until dismissal started working.
- Charts drew nothing where animations could not run — three separate times, in the sparklines, the correlated chart and the menu bar. Content is no longer gated on an animation completing, anywhere.
- The renderer crashed during a menu bar redraw. Text was laid out inside an image drawing handler, which AppKit may invoke off the main thread. Layout now happens up front.
- The app misreported its own memory, using resident size — which counts shared framework pages — and accusing itself of 140 MB when its real footprint was 36 MB.
Performance
- Idle CPU went from 2.30% to about 1.3% of one core: the menu bar was rewritten to draw in AppKit, readings are pushed only when the rendered pixels would differ, and the card stack became lazy.
- The spec's flat "under 0.8% idle" budget was replaced by a measured cost model,
0.35% + redraws/sec × 1.4%, because idle cost is set by how often displayed values change rather than by how much sampling happens.
Known limitations
- Fan control is read-only. Writing SMC values needs a signed privileged helper.
- Dismissing the dropdown by clicking outside it is best-effort; clicking the menu bar item always works.
- Mac Vitals Lite omits per-process modules, Port Map, containers, sensors and remote agents — all denied by the App Sandbox.