What you need
- Multimeter for macOS 13 or later, $19.99 once.
- Nothing to install.
networkQualityandlaunchdcome with macOS.
Set it up
- Save this as
~/Library/LaunchAgents/local.speedtest.plist:local.speedtest.plist<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>local.speedtest</string> <key>ProgramArguments</key> <array> <string>/bin/zsh</string> <string>-c</string> <string>mkdir -p ~/.multimeter && /usr/bin/networkQuality -u | awk '/Downlink capacity/ {print $3}' > ~/.multimeter/speed.tmp && mv ~/.multimeter/speed.tmp ~/.multimeter/speed.txt</string> </array> <key>StartInterval</key> <integer>3600</integer> <key>RunAtLoad</key> <true/> </dict> </plist> - Start it. It runs right away and then every hour:Terminal (once)
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.speedtest.plist - After about 20 seconds, check the file:
cat ~/.multimeter/speed.txt. - Add a File meter and choose
~/.multimeter/speed.txt(press Shift-Command-Period in the file dialog to see dot folders). Set the range to 0 to your plan’s speed and the unit toMbps.
Multimeter settings
In Customize This Meter… (from the meter’s menu):
| Setting | Value |
|---|---|
| Source | File |
| File | ~/.multimeter/speed.txt |
| Range | 0 to your plan, like 500 |
| Unit | Mbps |
| Alerts | Low values: warning at half your plan, critical at a quarter |
| Label | SPEED |
| Face | Needle Gauge, Arc Gauge or Columns |
Tested: On October 29, 2026: the plist passed plutil -lint, and its command wrote 168.135 to the file. A shorter test inside the 10 second limit (networkQuality -u -M 8) took 9.3 seconds, too close to use in a Script meter.
More on this source, including every format it reads, in the File guide.
Limits
- Each test downloads for several seconds at full speed. Hourly is a sensible pace on a metered connection; every 15 minutes is the most often worth running.
Variations
Upload speed
Drop -u from the command and change the awk pattern to /Uplink capacity/.
Stop it
launchctl bootout gui/$(id -u)/local.speedtestTroubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The file never appears | The job didn’t load. | Run launchctl print gui/$(id -u)/local.speedtest to see its last exit status, and plutil -lint on the plist. |
| The meter is empty | The test failed (offline), so the file is unchanged or empty. | It fills in after the next hourly run with a connection. |
Questions
Does this work in the Mac App Store version?
Yes. File meters work in every version; the test itself runs from launchd, not from Multimeter.
Why not run the test from Multimeter directly?
Script meters stop commands after 10 seconds and a full test takes longer. The file also keeps the last result between tests.