Skip to content

NetCheck - Network Availability Monitor ​

A macOS menu bar utility for real-time network connectivity monitoring.

Quick Start ​

Prebuilt Universal .app Bundles ​

Download NetCheck-<version>.zip (ai.thefocus.netcheck) or NetCheckGeo-<version>.zip (ai.thefocus.netcheck-geo) from GitHub Releases, move to /Applications, and clear Gatekeeper quarantine once:

bash
xattr -dr com.apple.quarantine /Applications/NetCheckGeo.app
open /Applications/NetCheckGeo.app

Run or Build from Source ​

bash
# Run lightweight NetCheck directly
chmod +x netcheck.swift
./netcheck.swift
./netcheck.swift --once
./netcheck.swift --dump-menu

# Or build both universal NetCheck.app and NetCheckGeo.app
./build.sh

Features ​

  • 🌐 Real-time monitoring - Pings 1.1.1.1 every second
  • πŸ“Š Success rate tracking - Rolling 60-second window
  • ⏱️ Latency statistics - Current, average, min/max
  • πŸ”” Smart notifications - Alerts for connection state changes
  • πŸ“œ Visual history - See recent ping results at a glance
  • 🎯 Menu bar display - Shows current state and success rate
IconStateDescription
🟒Online95%+ success rate
🟑Degraded50-95% success rate
πŸ”΄Offline<50% success rate
⏳StartingInitial connection

NetCheck Geo: Connection Atlas ​

The location-enabled app includes a dark coverage dashboard, a trip sidebar, success and latency cards, a signal history strip, satellite view, and a fit-route control. Its menu bar panel shows live connectivity and latency.

Build the Geo app (macOS 12 or later, Bundle ID ai.thefocus.netcheck-geo):

bash
./build.sh
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --show-map

New logs are saved locally in ~/Library/Application Support/NetCheck/trips/, outside Documents/iCloud Drive. Existing ~/Documents/netcheck_trips/ files and the older single CSV log are copied in the background; originals are retained. Use Show in Finder to access the local CSV files.

Monitored Wi-Fi networks ​

NetCheck Geo only shows its menu-bar item and records pings while the Mac is connected to a Wi-Fi network in the monitored list. On any other network the item is hidden and tracking pauses. The default monitored SSID is starlink.

Manage the list from Monitored Wi-Fi β†’ Networks… in the menu, edit ~/Library/Application Support/NetCheck/networks.json, or use the CLI:

bash
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --list-networks
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --add-network "My Hotspot"
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --remove-network "Office-WiFi"
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --monitor-all off
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --always-show on
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --dump-menu
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --version
./NetCheckGeo.app/Contents/MacOS/NetCheckGeo --quit

The CLI works even while the menu-bar item is hidden. --monitor-all on is an escape hatch for tracking every Wi-Fi network. If you only need the menu to configure things while off the monitored networks, use --always-show on: the icon stays visible in a paused state without recording pings; turn it off with --always-show off. Each CSV row includes the current SSID so recordings can be separated by network.

If macOS cannot read the SSID (usually because Location access has not been granted), the item stays visible in a paused state so the menu remains reachable.

Trip parsing and logging run off the UI thread. Parsed files are cached until their size or modification time changes, and routes share overlays by connection state. Routes use recorded GPS positions, with breaks between trips and location gaps longer than two minutes. Apple map imagery still needs a network connection; trip data remains local.

Run the regression checks, optionally benchmarking an existing archive:

bash
bash tests/run.sh
bash tests/run.sh "$HOME/Documents/netcheck_trips"

Requirements ​

  • macOS 10.15+ (Catalina or later)
  • Swift 5.0+
  • No external dependencies

How It Works ​

NetCheck uses the system ping command to test connectivity to Cloudflare's DNS server (1.1.1.1) every second. It maintains a rolling window of the last 60 samples to calculate:

  • Success Rate: Percentage of successful pings
  • Latency: Response time in milliseconds
  • Connection State: Based on success rate thresholds

When you click the menu bar icon, you'll see:

  • Current connection status
  • Target being monitored (1.1.1.1)
  • Success rate with sample counts
  • Latency statistics (current, average, min, max)
  • Visual history of recent pings
  • Last update time

Part of the Single File Menu Apps project.

Released under the MIT License.