Skip to content

Repository files navigation

Mac Usage app icon

Mac Usage

A minimal, extendable macOS menu bar system monitor, inspired by iStat Menus.

CPU · GPU · Memory · Battery · Power · Network · Disk · Temperature · Fans

macOS 13+ Swift 5.9 Zero dependencies No Xcode project License: MIT

The Mac Usage panel: CPU history chart, memory pressure and usage rings, battery level and health rings, network speeds, temperatures, and fan RPM

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.

Highlights

  • 📊 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 by uninstall.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.
Memory hover panel: App/Wired/Compressed/Free breakdown and top processes with app icons
Memory details: breakdown + Activity-Monitor-accurate processes
Battery hover panel: 24-hour level history chart, charge details, health and cycle count
Battery details: 24 h history, charge, health, cycles
Temperature hover panel: a color-coded grid of every SMC sensor, grouped by CPU and battery
Temperature details: all 30+ sensors, heat-mapped
Settings page: launch at login, public IP switch, and draggable card visibility toggles
Settings: reorder cards by dragging, toggle what you see

Install (one command)

curl -fsSL https://raw.githubusercontent.com/ShovonCodes/mac-usage/main/bootstrap.sh | bash

That 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

Requirements

  • macOS 13 (Ventura) or newer
  • Xcode Command Line Tools (xcode-select --install if 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.

Update

Run the install command again. It always fetches the latest code, rebuilds, and replaces the installed app in place. There is no separate updater.

Uninstall

curl -fsSL https://raw.githubusercontent.com/ShovonCodes/mac-usage/main/uninstall.sh | bash

Quits 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.

Privacy

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.

Behavior

  • 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.

Developing

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.

Contributing

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:

  1. Create a reader in Sources/MacUsage/Readers/, e.g. DiskSpaceReader.swift, with a readCurrentUsage()-style method returning a model struct.
  2. Add the model struct to Models/StatModels.swift.
  3. In StatsStore.swift: add a @Published property and call your reader inside refreshFastStats() (pure syscalls) or refreshSlowStats() (anything touching the SMC, a subprocess or the network).
  4. In StatsPanelView.swift: add a StatSectionCard section 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.

License

MIT

About

Minimal macOS menu bar system monitor - CPU, memory, battery, network, temps and fans in one panel. Swift/SwiftUI, zero dependencies.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages