MenuBar Load Runner

Native macOS · Menu bar · Swift + AppKit

Something small is running in your menu bar.

A dog, a horse, a soot sprite, Totoro. It trots when the machine is calm and breaks into a sprint when the system is under load — a live, ambient read on CPU, memory, GPU, network, disk, fan, or battery, tucked into the status bar you already stare at.

Load becomes tempo

Drag the system load. The animation speed is remapped live through the preset's min→max range — exactly how the app maps a 0–1 load fraction to a speed multiplier.

System load22%
Animation speed0.94×
idle · trotting

↑ real preset ranges from gifs/presets.json · self-throttles under Low Power / thermal / memory pressure

Seven ways to feel the machine

Load sources
CPU
Usage across all cores, EMA-smoothed. The default rhythm.
Memory
Used fraction (idle RAM discounted) combined with live swap activity.
GPU
Device utilization, read straight from IOAccelerator.
Network
Inbound + outbound throughput, averaged; loopback excluded.
Disk
Read + write bytes/sec across every block device.
Fan
Fan RPM as a share of its max — a lagging read on cooling effort.
Battery
Discharge current — a fast drain sprints, AC idles it. The menu shows charge level.

Unbounded rates (network / disk / swap) auto-scale to a btop-style adaptive ceiling. Every reader is unprivileged — the app only ever reads load, never adds to it.

Want the number too? It’s right there.

Label + live dashboard

The animation gives you the feel; an optional second menu-bar slot gives you the figure. Set --label value and it prints the active source’s live reading — CPU 47%, NET ↓3.4 ↑0.1 — refreshed on the same tick as the icon. Set --label <text> for a fixed tag (handy for telling two instances apart). It’s a real status item in the native menu-bar font — never text baked onto the tiny icon.

…and the dropdown is a live dashboard: a 60-second sparkline, per-source readouts, and load averages — Other Sources switches what drives it.

flip the modes — the slot appears beside the icon

Off by default (claims no space); switchable live from the Menu Bar Label submenu or at launch via --label / MENUBAR_LOAD_RUNNER_LABEL.

The cast

12 built-in presets
Chihiro walking silhouette
Chihiro, walkingchihiro
side-profile walk cycle0.50–2.50×
Running horse silhouette
Horse · defaulthorse-white
Pinterest silhouette0.45–2.30×
Totoro
Totorototoro
from Giphy0.50–2.60×
Running dog silhouette
Dogdog-white
the original runner0.50–2.50×

…plus Dog (Black), Horse (Black), Chihiro white/black, Totoro white/black, and a wide Totoro group (white/black) — 12 in all. Drop in any .gif to make your own.

It can keep the Mac awake — on your terms

Keep Awake

Flip Keep Awake in the menu and the app spawns caffeinate -i -w <pid> — idle sleep is held off while long work runs, but the display can still nap. The -w <pid> binds it to the app, so it's reaped the instant the app quits or crashes; no orphaned sleep lock.

  • Auto-disengages on critically low battery (≤20%, on battery) or serious/critical thermal — then re-engages the moment the condition clears.
  • The indicator tracks the actual caffeinate state, not your intent — so it dims the instant a condition suspends it, even with the toggle still on.
  • A thin line rides the bottom edge of the icon — pick Dusty Teal (default) or Sand from the Keep Awake Color submenu. Each is a fixed hue (two tones, tuned per menu-bar appearance), never your system accent.
off · caffeinate not running
line color:
try a condition →
toggle it — the track line is the “ground it runs on”

Idle-sleep only (the screen may still sleep), unprivileged, OS-reaped. Lid-close, Low Power Mode, and memory pressure are deliberately not disengage triggers.

One file. No Xcode.

Quickstart
zsh — menubar-load-runner
# install — clone, compile, symlink onto PATH (no Xcode project, no Homebrew)
curl -fsSL https://raw.githubusercontent.com/binlecode/menubar-load-runner/main/install.sh | bash

# then run from anywhere — default preset, or pick a companion + load source
menubar-load-runner totoro --load-source gpu

# start at login — per-user LaunchAgent, no root, no .app bundle
./scripts/install-login-item.sh chihiro

# clean uninstall — removes only what the installer created
~/.local/share/menubar-load-runner/uninstall.sh

A single Swift source file

The whole app is one .swift file compiled by a zsh launcher with swiftc -O. No Xcode project, no SwiftPM package, no build system to learn.

Vsync-aligned game loop

A CADisplayLink advances frames against real elapsed time and the screen's refresh rate — smooth at any speed, and it pauses itself entirely when the item is occluded.

Barely there

Frames are swapped as a layer's CGImage contents — no per-frame redraw or layout — so a visible, animating icon costs about ~0.5% of one CPU core in ~20 MB, and drops to 0% CPU when hidden. It also caps its own speed under Low Power / thermal / memory pressure, so it never adds to the load it measures.

Data-driven presets

Keyword, menu title, and speed range all live in presets.json (width comes from the GIF's own aspect ratio). Add a preset by editing data — zero Swift changes.

Checks for its own updates

On launch it reads your checkout's origin release tags — the only network call the app ever makes. A newer tag shows an Update available menu item; applying it is a deliberate two-click action (git pull --ff-only), never automatic.

One line in, one line out

Install with a single curl … | bash — it clones, compiles, and symlinks onto your PATH; uninstall.sh reverses exactly what it created. Open source (MIT), no signing or Homebrew.