A small, quiet network usage monitor for the macOS menu bar.
Live rate, any time range, per-app usage — and how much of your data plan is gone.
Website · Install · Features · Screenshots · Configuration · CLI · Uninstall · Changelog
-
The website runs the real panel UI in the browser on made-up traffic (site/).
-
Download a release or use the Homebrew tap.
-
netmeter-core contains sampling, persisted state, formatting, and statistics.
-
The desktop crate connects the menu-bar app, per-app sampling, and CLI.
-
Signing notes explain the current macOS distribution setup.
The core and desktop shell are separate, so the measurement/reporting code can be read independently of the UI. Installation, screenshots, and measurement behavior are documented below.
Stats and iStat Menus already show network traffic. Two things are different here:
- It is built around a data cap. Set your plan's size and reset day, and the panel is about how much of it is gone and when it renews — with notifications as you cross the thresholds you picked.
- It needs no privileges. No Accessibility permission, no root, no kernel
extension, no network filter. It reads the same per-interface counters Activity
Monitor does, and
nettopfor per-app numbers.
| Live rate | Download and upload in the panel, updated every second |
| Any time range | 1H / 6H / 12H / 24H / 7D / 30D / Today / Cycle, an explicit From–To picker, or drag across the graph to zoom |
| Per app | The busiest processes since launch, or per-interface totals for the selected range |
| Data cap | Progress against your plan, a reset day, and threshold notifications |
| Menu bar | A quiet activity glyph, or the live rate, or the cycle total — your choice |
| Looks how you like | Light or dark, or follow the system, with a panel opacity slider |
| Starts with you | Optional launch at login, so the totals have no gaps |
| Private | A SQLite file on your machine. No accounts, nothing uploaded |
Homebrew:
brew tap omerdikyol/netmeter
brew trust omerdikyol/netmeter # Homebrew 7 asks for third-party taps to be trusted
brew install --cask netmeterOr download NetMeter-macos-universal.dmg from
Releases, open it, and drag
NetMeter into Applications. There is a .zip too, if you prefer.
Releases are signed with a Developer ID certificate and notarized by Apple, so the app opens normally — no Gatekeeper workaround. Builds up to and including 0.1.0 were unsigned: if you have one of those, right-click it and choose Open. SIGNING.md covers how the signing works.
From source:
git clone https://github.com/omerdikyol/netmeter
cd netmeter
cargo build --release
packaging/macos/bundle.sh
open dist/NetMeter.appRequirements: macOS 13 or newer, Apple silicon or Intel. Building needs Rust 1.80+.
NetMeter sits in the menu bar as a small activity glyph so it stays out of the way. Left-click it for the panel; right-click for a short menu with Settings and Quit.
The panel is four things: the live rate, the graph with its range control, today's and this cycle's totals, and the usage list. The gear in the footer opens settings.
Menu bar managers such as Ice or Bartender hide new items by default — they are moved off-screen until you reveal them. If NetMeter is running but you cannot see it, open that manager and move NetMeter to the always-visible section.
| Choosing a time range | Settings |
|---|---|
![]() |
![]() |
Everything is settable in the panel, but it is just a TOML file, created on first
run. netmeter config prints the paths and the current contents.
[general]
sample_interval_ms = 1000
launch_at_login = false
menu_bar = "icon" # icon | rate | total
unit = "auto" # auto | binary | decimal
[appearance]
theme = "system" # system | light | dark
opacity = 0.72
[plan]
enabled = true
cap_bytes = 50000000000
cycle = "monthly" # weekly | monthly
reset_day = 15
warn_at = [0.8, 1.0]History is a SQLite file beside it, pruned to 90 days. Note that NetMeter only samples while it is running, so the totals cover that time — the panel says since when.
The same engine, without the tray:
netmeter status # per-interface counters right now
netmeter report --range today # usage today
netmeter report --range cycle # usage this billing cycle
netmeter report --from 2026-09-01 --to 2026-10-01
netmeter report --iface en6 --json # one interface, machine readable
netmeter sample --interval 1 # live rate in the terminalreport and sample are read-only: they never touch the stored history.
- No bundled browser. The tray is native (
tray-icon+tao); the panel is drawn by the system webview, so nothing like Chromium ships with the app. - Counters, not guesses. Per-interface bytes come from
sysinfo(getifaddrson macOS). Interface counters restart on reboot or link flap, so a value that goes backwards is treated as a reset — NetMeter never reports a negative or inflated delta. - Per-app usage is
nettopsampled every few seconds and diffed, so those numbers count only what happened while NetMeter was running. - Small. One binary plus the system webview. No background service, no helper, no login item unless you ask for one.
brew uninstall --cask netmeter # add --zap to remove your history tooOr just drag NetMeter.app to the Trash. Configuration and history live in
~/Library/Application Support/dev.omerdikyol.netmeter.
The panel renders through wry, which needs a GTK event loop on Linux that this
app does not set up yet, and Windows has never been exercised. Rather than claim
three platforms and ship one, this release says macOS and means it.
crates/netmeter-core — sampling, storage, statistics, configuration — is
platform-neutral and would be the base for other front ends.
The panel can be shown without clicking the tray icon, which is handy while working on the UI:
NETMETER_PREVIEW_PANEL=1 cargo run # open the panel on launch
NETMETER_PREVIEW_PANEL=1 NETMETER_PREVIEW_DELAY_MS=4000 cargo run
# ...a few seconds later
NETMETER_PREVIEW_SHEET=1 cargo run # with the range picker open
NETMETER_PREVIEW_SETTINGS=1 cargo run # on the settings screen
NETMETER_KEEP_OPEN=1 cargo run # never dismiss on focus loss
NETMETER_DEMO=1 cargo run # draw invented data, not yoursNETMETER_DEMO is what the screenshots in this README were taken with: it makes
the panel ignore the real state and draw a fixed, made-up dataset, and squares
its corners at full opacity so a capture contains nothing but panel pixels.
crates/netmeter-core sampling, storage, stats, config (no UI; unit tested)
crates/netmeter tray app, panel host, per-app sampler, CLI
ui/index.html the panel itself (HTML/CSS/JS, no build step)
packaging/macos Info.plist, bundle, signing and icon scripts
packaging/homebrew the cask; copy it to the homebrew-netmeter tap on release
Contributions are welcome. cargo test and
cargo clippy --all-targets -- -D warnings should both be clean before a pull
request.
- Sampling, storage and reporting core, with a CLI
- Menu bar app and the panel
- Per-interface and per-app views, any time range
- Data cap, reset cycle and threshold notifications
- Universal packaging, Homebrew cask and a generated icon
- Signed and notarized releases
- Linux and Windows front ends
Dual-licensed under either of MIT or Apache-2.0, at your option.
The bundled JetBrains Mono font (used only when the menu bar shows a number) is
under the SIL Open Font License 1.1 — see assets/fonts/OFL.txt.


