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.
- Shipped on the Mac App Store, sandboxed as Apple requires, with the six system modules free and the LLM monitor, longer history and alerts as an optional subscription.
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.
- Laptop Doctor omits per-process modules, Port Map, containers, sensors and remote agents — all denied by the App Sandbox. Its alert templates and permission prompts are filtered to match, so it never offers a control it cannot honour.