A minimal, extendable macOS menu bar system monitor, inspired by iStat Menus.
CPU · GPU · Memory · Battery · Power · Network · Disk · 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 usage and CPU temperature in the corner. Hover reads from the widest view down to the narrowest: an 8-hour busy trend, the 1/5/15-minute load averages stated against your core count, uptime, every logical core as its own bar (grouped into performance and efficiency clusters on Apple Silicon), the usage breakdown, and the five hungriest processes. The load average is there because a percentage saturates: 100% busy with eight threads and 100% busy with sixty queued behind them look identical, and only the load average tells them apart.
- 🎮 GPU: utilization history on the same two-minute window as the CPU card, so the two processors can be compared at a glance, plus GPU memory in use. Hover: an 8-hour utilization trend, a busy ring, core count, and how much memory the driver has in use and reserved.
- 🧠 Memory: pressure and usage rings, iStat-style. Hover: a 24-hour pressure trend with its peak, plus 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.
- ⚡ Power: how many watts the machine is actually pulling, on the same two-minute chart as the CPU and GPU cards, with the day's average beside it so you can tell an unusual moment from a normal one. Hover: an 8-hour draw trend, each SMC power rail on its own row (system total, battery, adapter), and the day's energy in watt-hours.
- 🌐 Network: live upload/download with a two-minute activity sparkline. Hover: a five-minute chart with per-direction peaks, Wi-Fi name, local and public IPs.
- 💽 Disk: how full the boot volume is, with live read and write rates. Hover: used/free/total and a throughput chart. Mounted disk images are excluded, so opening a .dmg does not read as disk activity.
- 🌡️ 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. Hover also shows a 24-hour CPU temperature trend.
- 🕓 24-hour history: CPU, GPU, memory, network, power and
temperature are
recorded once a minute and kept for a day, so the trends survive
quitting and relaunching. Stored in
~/Library/Application Support/MacUsage, removed byuninstall.sh. - 🌀 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 and the panel explains why. Every threshold is editable, and alerts can also arrive as notifications, the only channel that still reaches you in fullscreen where the menu bar is hidden. A warning clears only once the reading recovers past its threshold by a margin, so a value parked on the line does not flicker.
- 📟 Menu bar readouts: a live CPU graph, memory percentage and network rates sit next to the icon, so the common checks need no click at all. GPU busy, watts drawn and CPU temperature are available too, off by default since they matter to some people constantly and most people never. Each one can be switched off to give the width back, or the whole strip can be, leaving just the icon.
- ⚙️ 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, just 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). The "Fetch public IP" switch in Settings turns it off entirely. No analytics, no update pings, nothing else.
- The menu bar shows the icon plus whichever readouts you leave on.
- Hovering a card expands a detail panel beside the main one.
- Panel open: stats refresh every 2 seconds.
- Panel closed: the CPU, memory and network readouts keep refreshing every 2 seconds, since they are on screen. Everything behind them (sensors, fan speeds, process lists) drops to 15 seconds. Switch the menu bar readouts off and that first group drops to 15 seconds too.
- Those three readouts are three kernel calls per refresh, no subprocesses, which is why they can stay live this cheaply. The GPU, power and temperature readouts come from the sensors instead, so putting one of them in the menu bar moves that group to 5 seconds while the panel is shut: fast enough not to look frozen next to the CPU graph, slow enough to leave the SMC alone.
- 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 insiderefreshFastStats()(pure syscalls) orrefreshSlowStats()(anything touching the SMC, a subprocess or the network). - In
StatsPanelView.swift: add aStatSectionCardsection rendering it.
Good next candidates: Bluetooth device batteries, per-process network or disk attribution.
If Mac Usage is useful to you, a ⭐ on the repo helps others find it.



