Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Table Of Contents

PingCheck

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.

Requirements

macOS 13.0 (Ventura) or later

Download/Install

  • Download the latest PingCheck-mac-<version>.dmg from 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.dmg or open PingCheck-mac-version.dmg from Terminal.

alt Install

  • Drag PingCheck.app to your /Applications folder

  • Launch PingCheck from Applications or Spotlight

  • Eject the DMG

Notarize

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

Compile From Source

  • Xcode 15.0 or later

  • macOS 13.0 SDK or later

  • Clone this repository:

    git clone https://github.com/muquit/pingcheck.git
    cd pingcheck

Xcode

  • Open the directory or PingCheck.xcodeproj in Xcode

  • Modify, Build and run

To build from command line:

xcodebuild -project PingCheck.xcodeproj -scheme PingCheck -configuration Release build

The 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/*"

Configure

Enter IP Addresses

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:

alt Settings

  • 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

Running multiple instances

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.

Screenshots

  • - At least one configured host has responded to ping
  • - None of the configured hosts have responded to ping

The label displays your custom label text (default is: "VPN")

Menu Bar

alt mac_menu_bar

Settings Dialog

alt Settings

About Dialog

alt About

How It Works

PingCheck performs the following:

  • Every check_interval seconds, it pings each configured address using the system's /sbin/ping command
`/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

License is MIT

MIT License - see LICENSE.txt file for details

Authors

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

About

A native macOS menu bar app that shows connection status by periodically pinging configured IP addresses or hostnames

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages