A minimal, extendable macOS menu bar system monitor — inspired by iStat Menus.
CPU · Memory · Battery · Network · Temperature · Fans
Click the gauge icon in the menu bar and everything that matters is one panel: live CPU history, memory pressure, battery health, network throughput, every temperature sensor your Mac has, and fan speeds. Hover any card for the full story.
- 📊 CPU — stacked user/system history chart with the current load and CPU temperature in the corner. Hover: usage breakdown + the five hungriest processes.
- 🧠 Memory — pressure and usage rings, iStat-style. Hover: App/Wired/Compressed/Free breakdown and a top-processes list that matches Activity Monitor's numbers (it uses the same footprint metric).
- 🔋 Battery — level ring with time remaining, health ring. Hover: a 24-hour level history (hover a bar for that hour), charge details, max capacity, and cycle count.
- 🌐 Network — live upload/download. Hover: a five-minute activity chart with per-direction peaks, Wi-Fi name, local and public IPs.
- 🌡️ Temperature — every SMC sensor on your machine, grouped and color-coded from cool teal to alarming red; toggle raw sensor names on when you want the hardware's identity.
- 🌀 Fans — live RPM with each fan's min/max range (fanless Macs correctly report "No fans detected").
- 🚨 Threshold alerts — the menu bar icon grows a red badge when CPU passes 90%, memory pressure 80%, CPU temperature 90°, or battery drops below 10% while discharging; the panel explains why.
- ⚙️ Settings — hide cards you don't care about, drag to reorder them, start at login, and a privacy switch for the public-IP lookup.
curl -fsSL https://raw.githubusercontent.com/ShovonCodes/mac-usage/main/bootstrap.sh | bashThat fetches the latest code, builds the app, wraps it into a real
MacUsage.app bundle, installs it into /Applications, and launches it.
A gauge icon appears in the menu bar; click it to open the stats panel.
Quit from the panel's Quit button.
The installer asks whether the app should start automatically at login —
press Enter for yes, or answer n. You can change your mind any time in
the app: gear icon → "Launch at login".
After installing:
- Spotlight finds it: ⌘Space → "Mac Usage".
- It behaves like any other installed app — no terminal needed again.
Prefer not to pipe curl into bash? Clone and run the installer yourself — it's the same thing:
git clone https://github.com/ShovonCodes/mac-usage.git
cd mac-usage
./install.sh- macOS 13 (Ventura) or newer
- Xcode Command Line Tools (
xcode-select --installif you don't have them) — these include the Swift compiler and Swift Package Manager, so there is nothing else to install
No Xcode project, no dependencies — plain Swift Package Manager.
Run the install command again. It always fetches the latest code, rebuilds, and replaces the installed app in place — there is no separate updater.
curl -fsSL https://raw.githubusercontent.com/ShovonCodes/mac-usage/main/uninstall.sh | bashQuits the app, deletes it, removes the login item, and clears preferences.
Manual alternative: quit the app, drag /Applications/MacUsage.app to the
Trash, and (if you enabled start-at-login) remove it from
System Settings → General → Login Items.
Everything is read locally from the kernel, IOKit, and the SMC. The app makes exactly one kind of network request: the public-IP lookup for the network panel (api.ipify.org, cached for 10 minutes, only while the panel is open) — and the "Fetch public IP" switch in Settings turns it off entirely. No analytics, no update pings, nothing else.
- Menu bar shows only an icon — all stats live in the click-to-open panel.
- Hovering a card expands a detail panel beside the main one.
- Panel open: stats refresh every 2 seconds.
- Panel closed: a light background refresh every 15 seconds keeps the data warm so the panel never opens empty.
- No Dock icon; the app lives entirely in the menu bar.
- No admin rights needed for anything — including SMC fan/temperature reads.
Edit the source, then re-run ./install.sh — it rebuilds and replaces the
installed app in one step.
To try a build without touching the installed copy (you'll get a second gauge icon in the menu bar next to the installed one):
swift build -c release && .build/release/MacUsage &Kill that test copy with pkill -f '.build/release/MacUsage' — the
installed app keeps running.
Contributions are welcome — fork, build with ./install.sh, and raise a
PR. The codebase follows one simple pattern, so adding a new stat card is
four small steps:
- Create a reader in
Sources/MacUsage/Readers/, e.g.DiskSpaceReader.swift, with areadCurrentUsage()-style method returning a model struct. - Add the model struct to
Models/StatModels.swift. - In
StatsStore.swift: add a@Publishedproperty and call your reader insiderefreshAllStats(). - In
StatsPanelView.swift: add aStatSectionCardsection rendering it.
Good next candidates: disk usage & I/O, Bluetooth device batteries, power draw, per-core CPU.
If Mac Usage is useful to you, a ⭐ on the repo helps others find it.



