{"id":28794229,"url":"https://github.com/jedisct1/pingbar","last_synced_at":"2026-03-17T15:37:04.177Z","repository":{"id":297211456,"uuid":"995878216","full_name":"jedisct1/pingbar","owner":"jedisct1","description":"Lightweight network and DNS monitoring at a glance, right from your Mac menu bar.","archived":false,"fork":false,"pushed_at":"2026-03-14T19:12:10.000Z","size":1737,"stargazers_count":55,"open_issues_count":2,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-15T05:23:30.018Z","etag":null,"topics":["bar","dns","dnscrypt-proxy","lightweight","mac","macos","menu","menubar","native","osx","ping","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jedisct1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-04T06:22:41.000Z","updated_at":"2026-03-15T00:57:14.000Z","dependencies_parsed_at":"2025-06-04T18:04:09.068Z","dependency_job_id":"c56bc3e8-6c52-433a-b816-9e66beadcc80","html_url":"https://github.com/jedisct1/pingbar","commit_stats":null,"previous_names":["jedisct1/pingbar"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/jedisct1/pingbar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedisct1%2Fpingbar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedisct1%2Fpingbar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedisct1%2Fpingbar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedisct1%2Fpingbar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jedisct1","download_url":"https://codeload.github.com/jedisct1/pingbar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedisct1%2Fpingbar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30626818,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T14:16:03.965Z","status":"ssl_error","status_checked_at":"2026-03-17T14:16:03.380Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bar","dns","dnscrypt-proxy","lightweight","mac","macos","menu","menubar","native","osx","ping","swift"],"created_at":"2025-06-18T02:05:20.668Z","updated_at":"2026-03-17T15:37:04.168Z","avatar_url":"https://github.com/jedisct1.png","language":"Swift","readme":"# PingBar\n\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![macOS](https://img.shields.io/badge/macOS-12.0+-green.svg)](https://www.apple.com/macos/)\n[![Swift](https://img.shields.io/badge/Swift-6.1-orange.svg)](https://swift.org)\n\nPingBar is a lightweight, modern, non-intrusive, native macOS menu bar app that continuously monitors network latency, packet loss, and DNS settings.\n\nIt provides real-time ping statistics, packet loss monitoring, network interface information, and **one-click DNS management including dnscrypt-proxy control**, all from your menu bar with minimal system resource usage.\n\n## Screenshots\n\n### Main Menu\n\n![PingBar Main Menu](.media/screenshot.png)\n\nThe main menu shows real-time network status with:\n\n- Current ping time and status\n- Sparkline graph with ping statistics (avg/min/max)\n- Packet loss percentage and collection progress\n- Active network interfaces with IP addresses\n- Current DNS resolver information\n- Quick access to DNS management and preferences\n\n### Preferences Window\n\n![PingBar Preferences](.media/screenshot2.png)\n\nThe preferences window allows you to configure:\n- Ping interval and target host\n- High ping threshold for warnings\n- Passive or active packet loss measurement\n- Packet loss thresholds, window size, and active probe cadence\n- DNS auto-revert behavior for captive portals\n- Launch at login option\n\n## Features\n\n- **Live Network Status**: Pings a configurable host (default: Google) and shows latency and packet loss together in a single menu bar icon.\n- **Packet Loss Monitoring**: Measures loss passively from the regular ping stream or actively with configurable burst probes.\n- **Historical Ping Graph**: Unicode sparkline graph and statistics (avg/min/max) for recent pings.\n- **Network Interface Info**: Displays active local IP addresses with interface names.\n- **DNS Resolver Display**: Shows current DNS resolvers for your default interface.\n- **DNS Management**: Change DNS for your default interface with one click (System Default, Cloudflare, Google, Quad9, 114DNS, dnscrypt-proxy, etc.). **Perfect for controlling dnscrypt-proxy usage from the menu bar.**\n- **Captive Portal Detection**: Detects captive portals and can auto-revert DNS to default, restoring your custom DNS after login.\n- **Preferences Dialog**: Configure ping interval, target host, high ping threshold, packet loss mode, packet loss thresholds, DNS auto-revert, and launch at login.\n- **Auto-Start**: Optionally launch PingBar at login using a LaunchAgent.\n- **Lightweight \u0026 Native**: Built with Swift, AppKit, and SwiftPM. No Python or Electron, no bloat. Minimal memory footprint.\n\n## Installation\n\n### Homebrew (Recommended)\n\nInstall PingBar using Homebrew Cask:\n\n```bash\ngit clone https://github.com/jedisct1/pingbar.git\ncd pingbar\nbrew install --cask ./Casks/pingbar.rb\nopen /Applications/PingBar.app\n```\n\n### Download\n\nDownload the latest release from the [Releases](https://github.com/jedisct1/pingbar/releases) page. Pre-built binaries are available for both Intel and Apple Silicon Macs.\n\n### Build from Source\n\n#### Requirements\n\n- macOS 12.0+ (Monterey) recommended\n- Xcode 14+ or Swift 6.1+\n- Command line tools: `swift`, `codesign` (for signing)\n\n#### Quick Start\n\n```sh\ngit clone https://github.com/jedisct1/pingbar.git\ncd pingbar\nmake bundle\nmake install\n```\n\nSee [INSTALL.md](INSTALL.md) for detailed installation instructions.\n\n### Uninstall\n\n#### Homebrew Installation\n```bash\nbrew uninstall --cask pingbar\n```\n\n#### Manual Installation\nTo completely remove PingBar from your system:\n\n1. **Quit PingBar**: Click the menu bar icon → \"Quit PingBar\"\n2. **Remove the app**: Drag `PingBar.app` to Trash (usually in `/Applications/` or wherever you placed it)\n3. **Remove launch agent** (if enabled):\n   ```sh\n   rm ~/Library/LaunchAgents/com.pingbar.app.plist\n   ```\n4. **Remove preferences** (optional):\n   ```sh\n   defaults delete com.pingbar.app\n   ```\n\nThat's it! PingBar stores minimal data and leaves no background processes running.\n\n#### Development\n\n```sh\n# Clone the repository\ngit clone https://github.com/jedisct1/pingbar.git\ncd pingbar\n\n# Build debug version\nswift build\n\n# Build release version\nswift build -c release\n\n# Run tests\nswift test\n\n# Create app bundle\n./bundle_pingbar_app.sh\n\n```\n\n## Usage\n\n### Getting Started\n\n1. **Launch PingBar**: Double-click `PingBar.app` or run from the command line\n2. **Menu Bar Icon**: Look for the ring icon in your menu bar. The center shows latency; the ring shows packet loss.\n3. **Click the Icon**: View network status, ping statistics, and current settings\n4. **Configure Settings**: Select \"Preferences…\" to customize behavior\n\n### Menu Overview\n\n- **Network Status**: Current ping time and connection status\n- **Ping Graph**: Visual sparkline showing recent ping history with statistics\n- **Packet Loss**: Current packet loss percentage, mode, and collection progress\n- **Network Interfaces**: List of active network interfaces and their IP addresses\n- **DNS Servers**: Current DNS resolvers for your default interface\n- **DNS Management**: Quick access to change DNS settings\n- **Preferences**: Configure all app settings\n\n### DNS Management\n\nPingBar provides one-click DNS switching for your default network interface:\n\n- **System Default**: Use your network's default DNS\n- **Cloudflare (1.1.1.1)**: Fast, privacy-focused DNS\n- **Google (8.8.8.8)**: Reliable public DNS\n- **Quad9 (9.9.9.9)**: Security-focused DNS with malware blocking\n- **114DNS (114.114.114.114)**: Popular DNS service in China\n- **dnscrypt-proxy (127.0.0.1)**: **Local encrypted DNS proxy - easily toggle dnscrypt-proxy on/off from the menu bar**\n\n⚠️ **Note**: DNS changes require administrator privileges. You'll be prompted for your password.\n\n## Configuration\n\nAccess preferences via the menu bar icon → \"Preferences…\"\n\n### Settings\n\n| Setting                 | Description                                              | Default                |\n| ----------------------- | -------------------------------------------------------- | ---------------------- |\n| **Ping Interval**       | How often to ping the target (seconds)                   | 5.0                    |\n| **Target Host**         | URL or IP to ping                                        | https://www.google.com |\n| **High Ping Threshold** | Latency threshold for warning state (ms)                 | 200                    |\n| **Packet Loss Mode**    | Use the main ping stream (`Passive`) or active bursts (`Active`) for loss measurement | Passive |\n| **Active Probe Interval** | How often active packet loss bursts run (seconds)      | 30.0                   |\n| **Active Burst Size**   | Number of HEAD requests per active loss burst            | 5                      |\n| **Packet Loss Window**  | Number of recent results kept for packet loss            | 50                     |\n| **Loss Warning Threshold** | Packet loss percentage for yellow ring               | 3.0                    |\n| **Loss Bad Threshold**  | Packet loss percentage for red ring                      | 10.0                   |\n| **DNS Auto-Revert**     | Revert DNS to system default when network is unreachable | false                  |\n| **Restore Custom DNS**  | Restore custom DNS after captive portal login            | false                  |\n| **Launch at Login**     | Auto-start PingBar when you log in                       | false                  |\n\n### Status Icons\n\nPingBar now uses a combined icon instead of a single four-state dot:\n\n- **Center fill**: latency state\n- **Outer ring**: packet loss state\n\n| Element | State | Meaning |\n| ------- | ----- | ------- |\n| Center fill | Green → Yellow → Orange → Red | Increasing latency severity |\n| Center fill | Purple | Captive portal detected |\n| Center fill | Dark gray | Network unavailable |\n| Outer ring | Green | Packet loss below warning threshold |\n| Outer ring | Yellow | Packet loss above warning threshold |\n| Outer ring | Red | Packet loss above bad threshold |\n| Outer ring | Gray | Still collecting enough packet-loss samples |\n\n### Packet Loss Modes\n\n- **Passive**: Uses only the normal scheduled ping results. This adds no extra traffic.\n- **Active**: Runs additional HEAD request bursts to the same host for faster packet loss sampling.\n\nCaptive portal detections are excluded from packet loss accounting.\n\n### Captive Portal Handling\n\nWhen enabled, PingBar can automatically:\n\n1. **Detect** captive portals (hotel/airport WiFi login pages)\n2. **Revert** your custom DNS to system default to allow portal access\n3. **Restore** your custom DNS after successful login\n\nThis ensures seamless connectivity while preserving your DNS preferences.\n\n### Testing\n\n```sh\n# Run all tests\nswift test\n\n# Run specific test\nswift test --filter TestName\n```\n\n## Troubleshooting\n\n### Common Issues\n\n**PingBar doesn't appear in menu bar**\n- Ensure macOS 12.0+ is installed\n- Check that the app has accessibility permissions if needed\n- Try relaunching the app\n\n**DNS changes don't work**\n- Verify you have administrator privileges\n- Check that `networksetup` command line tool is available\n- Ensure your network interface is active\n\n**App won't launch**\n- Check Console.app for error messages\n- Verify code signing if you built from source\n- Try removing and reinstalling\n\n### Performance Tips\n\n- Use a reliable, fast target host for pinging\n- Set reasonable ping intervals (5-10 seconds recommended)\n- Use `Passive` packet loss mode if you want zero additional background traffic\n- Use `Active` mode only when you need faster or denser packet loss sampling; low intervals and high burst sizes can create substantial traffic\n- Enable launch at login for continuous monitoring\n\n## Security\n\nPingBar follows security best practices:\n\n- **Minimal Permissions**: Only requests necessary system access\n- **No Data Collection**: All data stays local on your device\n- **Open Source**: Code is publicly auditable\n- **Code Signing**: Release builds are signed and notarized\n\n### Privacy\n\nPingBar does not:\n\n- Collect or transmit personal data\n- Track your browsing habits\n- Store sensitive information\n- Connect to external services (except for ping tests)\n\n## System Requirements\n\n- **macOS**: 12.0 (Monterey) or later\n- **Architecture**: Intel x64 or Apple Silicon (Universal Binary)\n- **Memory**: 50MB RAM typical usage\n- **Permissions**: Administrator access for DNS changes (optional)\n\n## License\n\nPingBar is released under the [MIT License](LICENSE).\n\n## Acknowledgments\n\n- Inspired by classic menu bar network tools like MenuMeters and iStat Menus\n- Uses [Apple's AppKit](https://developer.apple.com/documentation/appkit) for native UI\n- Built with [Swift Package Manager](https://swift.org/package-manager/)\n- DNS management via `networksetup` and AppleScript\n- Unicode sparkline graphs for visual ping history\n\n---\n\n**PingBar** — Network and DNS monitoring at a glance, right from your Mac menu bar. 🌐\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjedisct1%2Fpingbar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjedisct1%2Fpingbar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjedisct1%2Fpingbar/lists"}