macOS 14+ · menu bar · open source

Which tab is eating
your battery.

macOS tells you “Ghostty — 41%”, which is useless with eight tabs open. BatteryScope tells you it was the battery tab, running claude, and shows you the moment your Mac froze because of it.

Signed and notarized by Apple. Drag to Applications and open — no warning, no xattr dance.

The list you actually wanted

Every other tool stops at the app name. This one keeps going until it reaches something you can act on.

🌐Arc75%
🎵Spotify20%
batteryclaude3.2%
wagerpalsrudder-native1.3%

A terminal tab is a real object in the process tree — your terminal forks one shell per tab — so it can be named without the accessibility API and without screen recording permission. The label is the folder the tab is sitting in, which is where your terminal gets its own title.

What it knows

Names the tab, not the terminal

Everything spawned inside a tab counts toward it, however deep — rudder → claude → swift-frontend is one row.

Names the app, not the helper

Browser Helper (Renderer) answers nothing. Walking up to the process just below launchd recovers Arc.

Groups coding agents

An orchestrator running eight agents is one row holding 11 GB, not eight identical claude rows.

Catches the freeze

Memory pressure, swap thrash, CPU saturation, thermal throttling and disk saturation, sampled every five seconds.

Knows it was wedged

If the sampler itself couldn’t get scheduled, that gap is the evidence — and it’s told apart from sleep by the monotonic clock.

Five-minute history

The day in slices. Click any one to see what was running during those five minutes.

In the menu bar

Click the icon for the whole picture. Real output, real machine.

The BatteryScope panel: a power list naming terminal tabs, a five-minute activity chart, system pressure gauges, and a list of stalls with what was holding the machine.

Install

Two minutes, no password.

Download and drag

Get the DMG, drag BatteryScope to Applications, and open it. It appears in your menu bar — no Dock icon.

Keep it sampling

To collect in the background and start at login: git clone https://github.com/viraatdas/battery && cd battery && ./Scripts/install-agent.sh

Optional: true per-app energy

Ranking by measured energy rather than CPU needs powermetrics, which is root-only: sudo ./Scripts/install-daemon.sh

Why the second step needs a clone. The background sampler is a LaunchAgent in your own login session, installed by a script you can read first. Nothing runs as root unless you choose the third step, and everything except per-app energy attribution works without it.