NetSpeedMonitor is a minimal menu bar app for macOS 26 and later. It reads per-interface byte counters with sysctl and displays current upload and download rates.
- Start at login.
- Choose an update interval from 1 to 60 seconds with a multi-stop slider.
- Open Activity Monitor directly from the menu.
- Automatically follow the effective network interface when a VPN connects or disconnects.
- Inspect all active interfaces or pin the display to a specific interface.
- Check for, download, verify, and install GitHub releases in the app.
- Choose whether update checks include GitHub pre-releases. The default channel only checks official releases.
- View the current version, project link, and author from About.
- Choose upload/download visibility and byte- or bit-based units.
- View bounded session history, peak rates, and transferred totals.
- Reduce polling frequency automatically in Low Power Mode and reset stale samples after wake.
- Download
NetSpeedMonitor.zipfrom the latest GitHub release. - Unzip it and move
NetSpeedMonitor.appto/Applications. - Open the app. If macOS blocks the ad-hoc signed build, run:
sudo xattr -rd com.apple.quarantine /Applications/NetSpeedMonitor.appTo upgrade, choose Check Update from the NetSpeedMonitor menu. If the in-app updater cannot run, quit NetSpeedMonitor and replace the existing app in /Applications manually.
Automatic installation is supported when the app is located directly in /Applications or ~/Applications.
Official update archives are signed with an Ed25519 private key. The matching public key is pinned in the application and in scripts/verify-release.swift; the updater rejects releases without a valid NetSpeedMonitor.sig. To verify an official archive independently:
xcrun swift scripts/verify-release.swift v1.21 NetSpeedMonitor.zip NetSpeedMonitor.sigThe release private key is stored outside the repository and in the RELEASE_SIGNING_PRIVATE_KEY_BASE64 GitHub Actions secret. GitHub secrets are write-only: their plaintext cannot be downloaded later. Maintainers must keep a separate encrypted backup. To rotate the key, first ship a release signed by the old key that trusts both old and new public keys, then sign later releases with the new key.
For local signing, keep the Base64-encoded 32-byte private key at ~/.config/NetSpeedMonitor/release-signing-private-key.base64 with mode 0600. Back this file up in a trusted password manager or encrypted removable storage; never commit or upload it as a repository artifact.
Automatic mode asks the macOS Network framework which interface carries traffic to a public IPv4 endpoint. This follows full-tunnel and route-based VPN changes without polling. Split-tunnel VPNs can route different destinations over different interfaces, so no single interface can represent every flow.
Per-process traffic monitoring is intentionally not included because continuously running nettop has significantly higher CPU overhead.
