Software · Personal · 2026

NetMeter

A home connection and a phone hotspot don't bill the same way, and macOS shows you neither. NetMeter sits in the menu bar and counts what each network has used against its own monthly limit, resetting on that network's own billing day, then shows which apps spent it. Everything stays on the Mac: the app makes no network connections of its own.

Overview, light
Overview, light
History
History
Overview
Overview
The Problem

A home connection and a phone hotspot don't bill the same way, and macOS shows you neither.

My Role

Design, development and release, end to end.

The Approach

Exact Totals, Estimated Attribution

The Outcome

~1%: Of one CPU core

Scope, Constraints & Reality

One limit per network, not one number

Billing cycles differ per connection: a home line that resets on the 1st and a hotspot that resets on the 9th. A single global counter would have been wrong for anyone with both.

No sandbox, no App Store

Per-app traffic comes from /usr/bin/nettop, which a sandboxed app can't run. That rules out the Mac App Store, so NetMeter ships as a direct download.

Wi-Fi names need Location access

macOS only reveals the network name to apps with Location permission. Without it the app still counts everything but can't tell networks apart, so the welcome flow has to explain the ask.

Unsigned until there's a Developer ID

Releases are ad-hoc signed and not notarized, so first launch needs a Control-click Open. The README says so before the download link, not after.

Design Decisions

1

Exact Totals, Estimated Attribution

Network totals come straight from interface byte counters every 2 seconds, so they are exact. The per-app view is a nettop snapshot every 5 seconds, reconciled to those totals. Which app a closing connection's last seconds belong to is estimated, and the documentation says so plainly instead of implying precision it doesn't have.

2

Internet And Local Are Different Numbers

An ISP meters internet download only. Traffic that stays on the Mac, such as Docker talking to rclone, or on the home network is counted separately. Switch the view between Internet, Local and All, so the number you compare against your plan is the number your ISP actually bills.

3

The Menu Bar Item Is The Product

Most people will never open the main window; they glance at the menu bar all day. So that one item is the most configurable part of the app: icon, text or both, full, compact or tiny numbers, optional two-line stacking, and any order of items.

Impact

~1%
Of one CPU core

Light enough to leave running all day. The per-app snapshot costs about 30 ms of CPU every 5 seconds.

2 s
Counter refresh

Network totals refresh from the interface counters every 2 seconds and are exact. The per-app breakdown is reconciled to those totals.

0
Network connections of its own

Usage history lives in one local file on the Mac, about 13 months of it. Export to CSV, or erase it from Settings.

Screens6
Click to expand · ← → to navigate