Show your GitHub Actions status in your Mac menu bar

Push, switch to something else, and know the moment CI fails. A Script meter asks the GitHub CLI for the latest run on your branch and turns the answer into a number: 0 for passing, 1 while it runs, 2 when it fails. The Traffic Light face shows exactly that.

Recipe tested October 29, 2026 with Multimeter 1.1. Source: Script.

Preview: the Traffic Light face and two alternatives, with sample values like the ones this recipe returns.

What you need

  • Multimeter for macOS 13 or later, $19.99 once.
  • The direct download version of Multimeter from this site (the Script source isn’t in the Mac App Store version).
  • The GitHub CLI, signed in: brew install gh, then gh auth login once in Terminal.

Set it up

  1. Try the command in Terminal with your repository and branch. It prints a small JSON object with the number and a word for the menu:
    Command
    gh run list -R OWNER/REPO -b main -L 1 --json status,conclusion -q '.[0] | if .status != "completed" then {value: 1, formatted: "running"} elif .conclusion == "success" then {value: 0, formatted: "passing"} else {value: 2, formatted: .conclusion} end'
  2. Add a meter with the Script source and paste the command.
  3. Set Refresh every to 1 minute, the range to 0 to 2, and alerts to High values: warning at 1, critical at 2.
  4. Pick the Traffic Light face, and turn on Notify me when it goes critical to get a notification when a run fails.

Multimeter settings

In Customize This Meter… (from the meter’s menu):

Settings for this meter
SettingValue
SourceScript
Commandthe gh run list line above
Refresh every1 minute
Range0 to 2
AlertsHigh values: warning 1, critical 2, notify on critical
LabelCI
FaceTraffic Light, Mood or Label & Value

Tested: Run on October 29, 2026 for oven-sh/bun on main: printed {"formatted":"passing","value":0} in about 3 to 5 seconds.

Script meters need the direct download version of Multimeter from this site, which is the one on sale now. How commands run, the PATH they see and the 10 second limit are in the Script meters guide.

Limits

  • The GitHub CLI takes 2 to 5 seconds per call, well inside the 10 second limit. Refresh every minute or slower.
  • Signed-in calls get 5,000 requests an hour; one meter every minute uses 60.

Variations

One workflow only

Add -w deploy.yml (or the workflow’s name) after the branch.

Count failed runs today

Command
gh run list -R OWNER/REPO -L 50 --json conclusion,createdAt -q "[.[] | select(.conclusion == \"failure\" and (.createdAt | startswith(\"$(date -u +%Y-%m-%d)\")))] | length"

Troubleshooting

What the meter says, why, and what to do
SymptomCauseFix
The script didn’t print a numberThe command failed or printed an error message instead.Run the exact command in Terminal. If it works there, check for tools that live outside the meter’s PATH and use their full path (which tool).
The script took longer than 10 secondsA slow network call. Multimeter stops scripts after 10 seconds.Keep the -m timeout on curl, and refresh less often.
Scripts need the version from multimeterapp.comThis copy of Multimeter came from the Mac App Store, which can’t run scripts.Use the direct download version, or run the command from cron or launchd and point a File meter at its output.
Works in Terminal, nothing in the meterThe GitHub CLI isn’t signed in for this user, or lives outside Homebrew’s folder.Run gh auth status. If which gh isn’t in /opt/homebrew/bin or /usr/local/bin, use its full path.

Questions

Does this work in the Mac App Store version?

Script meters need the direct download version from multimeterapp.com, because the App Store sandbox doesn’t let apps run your commands. Web Address, File and Sent Value meters work in every version.

Does it work for GitLab or other CI?

The same idea works with any CI that has a command line or an API. Or have the CI job itself send the result with a multimeter:// link; see the build status how-to.

Related

Put it in your menu bar

$19.99 one-time. No subscription. Needs macOS 13 Ventura or later.