What data is captured

WiFi Monitor measures network performance. Captures contain connectivity measurements, not personal data.

Data Purpose Sensitivity
Latency samples (ICMP, UDP, TCP, HTTP, QUIC) Round-trip time and loss measurement Low
Throughput results Download/upload speed over time Low
DNS resolution timing Name resolution performance Low
Traceroute hops Network path and per-hop latency Medium
WiFi signal (RSSI, noise, channel) Correlate signal quality with performance Low
Gateway IP Local network identification Medium
SSID / BSSID WiFi network identification Medium
Location label User-provided tag (e.g. "SFO→JFK") Medium
Network label User-provided tag (e.g. "United WiFi") Medium
VPN status Whether VPN tunnel is active Low

No data ties to a specific user identity. No browsing history, credentials, device identifiers, or personal information is collected.

Privacy controls

You control what network-identifying information is included when uploading captures. Local capture files are never modified.

Upload privacy modes

Mode SSID / BSSID Network / Location Gateway IP Traceroute Hops
include Sent as-is Sent as-is Sent as-is Sent as-is
hash SHA-256 truncated SHA-256 truncated SHA-256 truncated Per-hop IP hashed
omit Removed entirely Removed entirely Removed entirely IPs replaced with *.*.*.*

Set via --privacy {include,hash,omit} on the CLI, or in Settings (⌘,) under "Network Information" in the macOS app. Your choice persists across sessions.

Privacy transforms are applied in memory before upload. Your local CSV files always contain the original data so your own analysis isn't affected.

Upload security

Captures are uploaded through a Cloudflare Worker proxy that enforces multiple controls.

Server-side controls

Client-side protections

Download validation

When pulling shared captures (via --pull), files are validated before writing to disk:

App security

macOS app

The macOS app is signed with a Developer ID certificate and notarized by Apple. macOS Gatekeeper verifies the signature before allowing the app to run.

Updates are delivered via Sparkle with EdDSA signature verification. Automatic update checks are disabled by default — updates are only checked when you choose "Check for Updates" from the menu.

The app runs with macOS hardened runtime protections. Two entitlements are required for the embedded Python interpreter:

Both are standard for any macOS app that embeds or spawns a Python interpreter.

The Python capture process is launched with explicit argument arrays (no shell interpolation). User-provided strings (location, network labels) are passed as direct process arguments, preventing shell injection.

iOS app

The iOS app is a native Swift reimplementation — no Python subprocess, no embedded interpreter. It runs in iOS's standard app sandbox.

Windows app

The Windows app is built with Tauri 2.0 (Rust backend + HTML/JS frontend). The Python capture process runs as a subprocess, same as macOS.

Data storage

Local

Remote

Dependencies

The macOS and Windows apps bundle Python with pinned dependencies to prevent supply-chain risks from unpinned PyPI downloads:

The iOS app has zero third-party dependencies — all probes are implemented using only Apple system frameworks (Foundation, Network, CoreWLAN).

Questions

For security questions or to report a concern, visit the About & Contact page. For general questions or feedback, reach out via the same page.