Show your team’s live score in your Mac menu bar

Working through a game you can’t watch? This meter finds today’s game for your team and shows “DAL 98-91 LAL Q4 2:31” in the menu bar. The number behind it is your lead, so the Mood face smiles while you’re winning.

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

Preview: the Mood 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).
  • jq for picking numbers out of JSON. It comes with macOS 15 and later; on macOS 13 or 14 run brew install jq.
  • Your team’s abbreviation as ESPN writes it (DAL, LAL, KC, NYY).

Set it up

  1. Try it with your team in place of DAL:
    Command
    curl -s -m 8 https://site.api.espn.com/apis/site/v2/sports/basketball/nba/scoreboard | jq --arg t DAL '[.events[] | select(.competitions[0].competitors | any(.team.abbreviation == $t))][0] | if . == null then {value: 0, formatted: "no game"} else .competitions[0] as $c | ($c.competitors | map(select(.team.abbreviation == $t))[0]) as $us | ($c.competitors | map(select(.team.abbreviation != $t))[0]) as $them | {value: (($us.score | tonumber) - ($them.score | tonumber)), formatted: ($us.team.abbreviation + " " + $us.score + "-" + $them.score + " " + $them.team.abbreviation + " " + .status.type.shortDetail)} end'
  2. Add a Script meter with it. Refresh every 30 seconds during the game.
  3. Set the range to -20 to 20 and alerts on Low values: warning at -1, critical at -10. Pick the Mood face or Label & Value.

Multimeter settings

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

Settings for this meter
SettingValue
SourceScript
Commandthe curl … | jq line above
Refresh every30 seconds
Range-20 to 20
AlertsLow values: warning -1, critical -10
FaceLabel & Value (shows the score text), Mood or Gradient Track

Tested: Run on October 29, 2026: printed {"value": 0, "formatted": "CLE 0-0 ATL 10/29 - 8:00 PM EDT"} before tip-off and no game for a team without a game that day.

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

  • This reads ESPN’s public scoreboard data, which isn’t an official, documented API: it has been stable for years, but it can change without notice.

Variations

Other leagues

Change the path: football/nfl, baseball/mlb, hockey/nhl, basketball/wnba, football/college-football, soccer/eng.1 (Premier League), soccer/usa.1 (MLS).

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.
Always “no game”The abbreviation doesn’t match ESPN’s.Print them all: curl -s URL | jq -r '.events[].competitions[0].competitors[].team.abbreviation'.

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.

Related

Put it in your menu bar

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