- PingCheck
- Requirements
- Download/Install
- Notarize
- Compile From Source
- Configure
- Screenshots
- How It Works
- License is MIT
- Authors
PingCheck is a native macOS menu bar application that monitors network connectivity by
periodically pinging configured IP addresses or hostnames.
I mostly use it for keeping an eye on my VPN connection - If connection is working, it displays a green ✅ otherwise red ❌ is displayed on the macOS top menu bar. Please look at Screenshots for an example.
Apple's VPN icon only shows whether the VPN tunnel is connected, but not whether traffic is actually flowing through it. With PingCheck I can glance at the menu bar and immediately tell if my VPN is truly working, without having to click around to check manually.
Originally it was a rumps based Python script but it was difficult to share with anyone. Then this Swift port was developed with Claude AI Sonnet 4.5.
Hope you find this app useful as well! Bug reports suggestions are always welcome.
macOS 13.0 (Ventura) or later
Download the latest
PingCheck-mac-<version>.dmgfrom the Releases page. It contains the Universal binary for Intel and Apple Silicon Macs. The DMG is signed and notarized by Apple.Open the DMG file. Click on
PingCheck-mac-version.dmgoropen PingCheck-mac-version.dmgfrom Terminal.
Drag
PingCheck.appto your/ApplicationsfolderLaunch PingCheck from Applications or Spotlight
Eject the DMG
The app is signed and notarized using notarize-mac-app.sh. The script handles the full release pipeline: archiving, signing, creating the DMG, notarizing with Apple, stapling the ticket, and verifying the result.
Notarization means Apple has scanned the app for malware and confirmed it is signed by an identified developer. As a result, macOS will not pop up a security warning when you launch it for the first time.
Example:
➤ notarize-mac-app.sh
notarize-mac-app.sh 1.0.4
==> 1. Archiving PingCheck 1.0.4...
==> 2. Extracting app from archive...
==> 3. Signing app with Developer ID...
build/export/PingCheck.app: replacing existing signature
==> 4. Creating DMG...
Searching for mounted interstitial disk image using /dev/disk50s...
waited 1 seconds for .DS_STORE to be created.
==> 5. Signing DMG...
==> 6. Notarizing...
Conducting pre-submission checks for PingCheck-mac-1.0.4.dmg and initiating connection to the Apple notary service...
Submission ID received
id: aadd9d14-6a0b-415a-a75c-f55affb47f0e
Upload progress: 100.00% (342 KB of 342 KB)
Successfully uploaded file
id: aadd9d14-6a0b-415a-a75c-f55affb47f0e
path: /Users/muquit/gitdev/PingCheck/PingCheck-mac-1.0.4.dmg
Waiting for processing to complete.
Current status: Accepted........
Processing complete
id: aadd9d14-6a0b-415a-a75c-f55affb47f0e
status: Accepted
==> 7. Stapling...
==> 8. Verifying...
PingCheck-mac-1.0.4.dmg: accepted
source=Notarized Developer ID
==> Done: PingCheck-mac-1.0.4.dmg
Xcode 15.0 or later
macOS 13.0 SDK or later
Clone this repository:
git clone https://github.com/muquit/pingcheck.git cd pingcheck
Open the directory or
PingCheck.xcodeprojin XcodeModify, Build and run
xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release buildThe built binary will be located in your Xcode DerivedData directory at:
~/Library/Developer/Xcode/DerivedData/PingCheck-<hash>/Build/Products/Release/PingCheck.app
The exact path will be shown in the build output, or you can find it with:
find ~/Library/Developer/Xcode/DerivedData -name "PingCheck.app" -path "*/Release/*"By Default, the label is VPN. To configure:
- Click on the VPN icon and from dropdown, click on the Settings... The dialog looks like below:
- Enter one or more pingable IP addresses or hostnames in your VPN network. If you enter hostnames, make
sure the hostnames can be resolved. ICMP ping is used
to check network connectivity. Make sure that the hosts respond to ping.
Click on Save. The configuration is saved at
~/.config/ping_check.json
$ cat ~/.config/ping_check.json
{
"check_interval" : 30,
"label" : "VPN",
"ping_addresses" : [
"192.168.31.1",
"10.100.30.1"
]
}- To start automatically after login, click the check box Launch at login
By default, only one instance of PingCheck is started which uses the config
file ~/.config/ping_check.json. To start multiple instances, create a
JSON file for each instance, e.g. ~/.config/ping_check_internet.json to monitor
Internet connectivity as follows:
$ cat ~/.config/ping_check_internet.json
{
"check_interval" : 30,
"label" : "Internet",
"ping_addresses" : [
"google.com",
"yahoo.com",
"8.8.8.8",
"1.1.1.1",
"9.9.9.9"
]
}Then start a Terminal and type:
open -n -a PingCheck.app --args --config ~/.config/ping_check_internet.json
Create aliases for convenience.
✅- At least one configured host has responded toping❌- None of the configured hosts have responded toping
The label displays your custom label text (default is: "VPN")
PingCheck performs the following:
- Every
check_intervalseconds, it pings each configured address using the system's/sbin/pingcommand
`/sbin/ping -c 1 -W 1 <host>`
- Connectivity is considered OK if any of the addresses is reachable
- The menu bar icon and Host Status submenu update to reflect current status
- Individual host status is displayed in the submenu for detailed monitoring
MIT License - see LICENSE.txt file for details
Created with assistance from Claude AI Sonnet 4.5 by porting a rumps based Python script of mine.
TOC/glossary expansion by https://github.com/muquit/markdown-toc-go v1.0.5 on Jul-16-2026



