Thanks for considering a contribution. Keep it small, keep it tested.
Open an issue with:
- macOS version (e.g.
Sonoma 14.5) - Apple Silicon or Intel
- Steps to reproduce
- Expected vs. actual behaviour
- Any output from
log show --process NetworkUsageMonitor --last 1m
- Fork, branch from
main(the default branch). swift buildandswift testmust both pass — the suite runs headlessly, no signing or extension required.- If you touch the firewall glue under
FilterExtension/, also confirmxcodegen generate+ thexcodebuildapp/extension build compiles (CI does this on every push). - Format-wise: keep the existing terse comment style; explain why, not what.
- Open a PR with a one-paragraph description plus a screenshot if the change is visible.
This project is source-available under the PolyForm Noncommercial License 1.0.0, and the maintainer also offers paid commercial licenses. By submitting a contribution (a PR or patch you authored), you confirm that:
- it is your own original work, or you otherwise have the right to submit it, and
- you license it to the project under the PolyForm Noncommercial terms and grant the maintainer (Siddharth Sangwan) a perpetual, irrevocable, worldwide right to relicense your contribution — including under commercial terms — as part of the project.
This "inbound = outbound, plus a commercial-relicensing grant" is what keeps the dual-license model workable. If you can't agree to it, please don't submit code — bug reports and ideas are always welcome regardless.
- Privacy first. The app must never make outbound network connections. Any feature that would need one is out of scope.
- Stay out of the sandbox. We need
nettopandNSWorkspace; the App Sandbox blocks both. Don't add features that would force us to sandbox. - No telemetry, no auto-update phone-home. Sparkle / similar updaters are fine because the user opts in; analytics aren't.
- Idle CPU should stay below 1%. If a feature needs more, gate it behind something user-triggered.
- Swift API design guidelines.
- Comments explain why, not what. The code already shows what.
- Prefer
privateuntil something needs wider visibility. - New persistent files go under
~/Library/Application Support/NetworkUsageMonitor/.
Maintainers: see DISTRIBUTION.md for the release workflow (signing, notarization, Homebrew Cask submission).