Show your internet speed in your Mac menu bar

macOS has a speed test built in: networkQuality. A full test takes 15 to 20 seconds and moves a fair amount of data, so it shouldn’t run every minute and doesn’t fit in a Script meter’s 10 seconds anyway. Instead, macOS runs it once an hour in the background and writes the result to a file; a File meter shows it the moment it lands.

This measures your connection’s capacity. For how fast data is moving right now, use the built-in Network source.

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

Preview: the Needle Gauge 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.
  • Nothing to install. networkQuality and launchd come with macOS.

Set it up

  1. 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 &amp;&amp; /usr/bin/networkQuality -u | awk '/Downlink capacity/ {print $3}' &gt; ~/.multimeter/speed.tmp &amp;&amp; mv ~/.multimeter/speed.tmp ~/.multimeter/speed.txt</string>
      </array>
      <key>StartInterval</key>
      <integer>3600</integer>
      <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
  2. Start it. It runs right away and then every hour:
    Terminal (once)
    launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.speedtest.plist
  3. After about 20 seconds, check the file: cat ~/.multimeter/speed.txt.
  4. 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 to Mbps.

Multimeter settings

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

Settings for this meter
SettingValue
SourceFile
File~/.multimeter/speed.txt
Range0 to your plan, like 500
UnitMbps
AlertsLow values: warning at half your plan, critical at a quarter
LabelSPEED
FaceNeedle 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

Terminal
launchctl bootout gui/$(id -u)/local.speedtest

Troubleshooting

What the meter says, why, and what to do
SymptomCauseFix
The file never appearsThe 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 emptyThe 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.

Related

Put it in your menu bar

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