kotochain /
macos-menu-bar-monitor
CPU & memory in your macOS menu bar. Native Swift/AppKit, no Electron, no Dock icon.
Loading repository data…
ariwisnu / repository
Lightweight native macOS menu bar system monitor for CPU, GPU, memory, disk, network, battery, temperatures, fans & Bluetooth — a free open-source Stats / iStat Menus / Activity Monitor alternative for Apple Silicon & Intel.
A free and open‑source Activity Monitor, Stats and iStat Menus alternative for Apple Silicon (M1/M2/M3/M4) and Intel Macs.
English · Bahasa Indonesia
Keep an eye on your Mac without ever opening Activity Monitor. Every metric is a separate menu bar item that opens a clean, live popover. Turn modules on or off to save CPU and battery — pay only for what you actually want to watch.
┌────────────────────────────── your menu bar ──────────────────────────────┐
… cpu 23% 69% ↓1.2M ↑40K 61° 100%⚡ 14:05
└──────────────────────────────────────────────────────────────────────────────┘
│
▼ left-click any item
╭────────────────────────────╮
│ CPU ⚙︎ │
│ ◯ 23% System 6% │
│ User 17% │
│ Temp 61°C │
│ ▁▂▃▅▇▅▃▂▁ (live history) │
│ Cores ▇▅▃▂ ▂▁▃▅ … │
╰────────────────────────────╯
Every metric, live in your menu bar.
Left‑click any menu bar item to open its live popover. Real captures on Apple M3.
| Module | Menu bar shows | Popover detail |
|---|---|---|
| 🧠 CPU | total load % | per-core bars, system/user split, temperature, live sparkline, chip name |
| 🎮 GPU | utilization % | utilization, VRAM in use, GPU name (Intel / AMD / Apple) |
| 🧩 Memory | used % | used/free/total, app·wired·compressed·cached, swap, sparkline |
| 💽 Disk | primary used % | read/write throughput + sparklines, per-volume capacity bars |
| 🌐 Network | ↓ / ↑ speed | up/down + sparklines, interface, Wi‑Fi/Ethernet, local IP, totals |
| 🔋 Battery | % (+ charge bolt) | status, time remaining, cycle count, health, condition, temperature |
| 🌡️ Sensors | hottest CPU temp | every SMC temperature, fan RPM and power sensor |
| 📶 Bluetooth | connected count | paired devices, connection state, signal strength |
| 🕒 Clock | current time | multiple world clocks with date and GMT offset |
SMAppService (macOS 13+) or a LaunchAgent (macOS 12).NSStatusItem + SwiftUI popovers. No Electron, no
background webview, no telemetry.| Better Mac Stats | Activity Monitor | iStat Menus | |
|---|---|---|---|
| Price | Free & open source | Free | Paid |
| Lives in the menu bar | ✅ 9 modules | ❌ | ✅ |
| Per‑core CPU + temps + fans | ✅ | partial | ✅ |
| Apple Silicon and Intel | ✅ | ✅ | ✅ |
| App size | < 1 MB | — | ~30 MB |
| Open source / hackable | ✅ | ❌ | ❌ |
Inspired by the excellent exelban/stats; Better Mac Stats focuses on a tiny, readable, dependency‑free codebase you can build and extend in minutes.
xcode-select --install).git clone https://github.com/ariwisnu/better-mac-stats.git
cd better-mac-stats
Scripts/build.sh # → dist/BetterMacStats.app (arm64)
UNIVERSAL=1 Scripts/build.sh # universal arm64 + x86_64
open dist/BetterMacStats.app # launch
Scripts/run.sh # build (if needed) + launch
Scripts/test.sh # run the unit tests
Why scripts instead of
swift build? The Command Line Tools bundled with Swift 6.3.2 ship a brokenlibPackageDescriptionthat fails to link any SwiftPM manifest (even an empty one), andxcodebuildneeds full Xcode. The scripts compile directly withswiftc.Package.swiftis included and builds normally in a healthy Xcode.
| Tab | What you can change |
|---|---|
| General | Launch at login · refresh interval (500 ms – 10 s) |
| Modules | Enable/disable each module · drag to reorder the menu bar |
| Appearance | Menu bar icons · color‑coded values · °C/°F · bytes vs bits/s |
| Clock | Add/remove world clocks · 24‑hour and seconds per zone |
Sources/
BetterMacStatsCore/ Pure data layer (no AppKit) — readers, models, formatting
Readers/ CPU · Memory · Network · Disk · Battery · GPU · SMC · Bluetooth · Clock
Models/ Util/
BetterMacStats/ The app — AppKit menu bar, SwiftUI popovers, settings
Tests/ Unit tests
Widget/ Optional WidgetKit extension
Scripts/ build · run · test · typecheck
Everything uses public macOS APIs: host_processor_info / host_statistics64
(CPU & memory), getifaddrs (network), the IOKit registry (disk I/O, GPU,
battery), IOPSCopyPowerSourcesInfo (battery), AppleSMC (temperatures, fans,
power) and IOBluetooth (devices). The clean Core ↔ App split keeps the
data layer unit‑testable and reusable (including by the widget).
Widget/ contains an optional WidgetKit widget (small + medium) showing CPU,
memory and battery. Because a Widget Extension is a separate .appex bundle, it
needs full Xcode: add a Widget Extension target, include
Widget/BetterMacStatsWidget.swift + the BetterMacStatsCore sources, and use
Widget/Info.plist.
Contributions to any of these are very welcome. ⭐ Star the repo to follow along!
Does it work on Apple Silicon? Yes — M1, M2, M3 and M4. Temperatures are read straight from the SMC. Intel Macs are supported too.
Will it drain my battery? No. It idles around 0.4% CPU, and disabled modules are not polled at all. Increase the refresh interval to use even less.
Does it phone home? Never. No network calls, no analytics, no telemetry.
Why is a metric missing? Some Macs don't expose certain sensors (e.g. fanless Macs, desktops without a battery). Those degrade to a friendly empty state.
Issues and pull requests are welcome. The codebase is small, documented and has no
dependencies — a great place to learn macOS system programming. Run Scripts/test.sh
before sending a PR.
MIT © contributors. Inspired by exelban/stats.
If Better Mac Stats is useful to you, please ⭐ star the repository — it helps a lot!
macOS menu bar system monitor · Activity Monitor alternative · Stats alternative · iStat Menus alternative · CPU GPU memory disk network battery temperature fan Bluetooth monitor · Apple Silicon M1 M2 M3 M4 · Intel · Monterey Ventura Sonoma Sequoia
Selected from shared topics, language and repository description—not editorial ratings.
kotochain /
CPU & memory in your macOS menu bar. Native Swift/AppKit, no Electron, no Dock icon.