A tiny macOS menu bar app that watches your public IPv4 address.
ipchecker periodically checks your public IP and compares it with an address you trust. When they differ, it highlights the mismatch and sends a macOS notification.
- Native menu bar experience with no Dock icon
- Optional live upload/download rates beside the icon (
en*interfaces, 1s refresh, KB/s → MB/s → GB/s) - Three fallback sources for reliable public IPv4 checks
- Expected-IP comparison and mismatch notifications
- 1, 5, 15, 30, or 60-minute check intervals
- Optional monthly CSV log of daily public IP addresses
- Session-only mute without hiding the warning state
- Built-in update check with verified download and Finder handoff
Download ipchecker.zip from the latest GitHub Release, unzip, and move ipchecker.app to Applications. The zip is ad-hoc signed; the first launch may need right-click → Open.
To build locally, you need macOS 13+, stable Rust, and Xcode Command Line Tools:
./scripts/build_and_run.shThe signed local app is created at target/release/bundle/ipchecker.app.
Open the menu bar icon to:
- copy the current public IP
- enter or paste an expected IPv4 address
- use the current IP as the expected address
- change the check interval or check immediately
- show or hide live upload/download rates
- record daily public IP addresses and choose the log output folder
- include or exclude VPN addresses from future log entries
- mute notifications for the current session
- check for updates, download and verify the latest app, then reveal it in Finder for manual replacement
Configuration is stored at:
~/Library/Application Support/ipchecker/config.toml
The network-speed, network-latency, and status-icon menu toggles are saved there as show_network_speed, show_network_latency, and show_status_icon (all default true). At least one of the three must remain enabled so the menu bar entry stays accessible. Hiding the status icon also disables all public-IP check notifications, including mismatch and fetch-failure notifications.
Latency defaults to ICMP ping to 1.1.1.1, sampled continuously every five seconds. The Latency Mode submenu also offers TCP connect to 1.1.1.1:443 and shows the selected method and target. The choice is saved as latency_mode = "icmp" or "tcp"; switching modes clears the previous average and starts a new probe immediately. TCP is also sampled every five seconds; network speed still refreshes every second. Both modes follow system routing.
Daily IP logging is off by default. When enabled, choose an output folder and ipchecker creates ipchecker-daily-global-ip-log-YYYY-MM.csv. Enabling the log, or changing its output folder while enabled, triggers an immediate public IP check. Each date has one row; multiple addresses observed on the same day are separated with ;. Record VPN Addresses defaults to on. Turn it off to skip observations if an active VPN tunnel carries IPv4 routes before or after the IP request, or if either VPN check fails. Brief VPN connections entirely between these checks may go undetected. Existing CSV entries are never changed.
cargo fmt --check
cargo test --locked --all-targets
cargo clippy --locked --all-targets -- -D warningsBundle without launching: bash scripts/bundle-local.sh. Extra run modes (--verify, --logs, --telemetry, --debug) are documented in ./scripts/build_and_run.sh.
Release channels and promotion steps: RELEASING.md.
- Public-IP sources are queried in order:
api.ipify.org,ifconfig.me/ip, thenicanhazip.com. - Notification permission may be requested on first use and can be changed in System Settings.
- GitHub Releases include an ad-hoc signed
ipchecker.appzip. macOS may require right-click → Open the first time. - In-app updates are downloaded and checksum-verified, but replacement remains manual because releases are not Developer ID signed or notarized.
- Local builds also use ad-hoc signing.