{"id":50752706,"url":"https://github.com/altuzar/pulse-app","last_synced_at":"2026-06-11T02:30:27.975Z","repository":{"id":355263690,"uuid":"1227405601","full_name":"altuzar/pulse-app","owner":"altuzar","description":"Pulse – a tiny native macOS menu bar network monitor (SwiftUI, MIT)","archived":false,"fork":false,"pushed_at":"2026-05-02T17:01:00.000Z","size":42849,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-02T19:05:31.961Z","etag":null,"topics":["macos","network","speedtest"],"latest_commit_sha":null,"homepage":"https://altuzar.github.io/pulse-app/","language":"Makefile","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/altuzar.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2026-05-02T16:31:26.000Z","updated_at":"2026-05-02T17:01:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/altuzar/pulse-app","commit_stats":null,"previous_names":["altuzar/pulse-app"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/altuzar/pulse-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altuzar%2Fpulse-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altuzar%2Fpulse-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altuzar%2Fpulse-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altuzar%2Fpulse-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/altuzar","download_url":"https://codeload.github.com/altuzar/pulse-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/altuzar%2Fpulse-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34180147,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["macos","network","speedtest"],"created_at":"2026-06-11T02:30:27.133Z","updated_at":"2026-06-11T02:30:27.961Z","avatar_url":"https://github.com/altuzar.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pulse\n\n\u003e Your internet, in real time. A native macOS network monitor that lives in your menu bar.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/icon-256.png\" width=\"128\" alt=\"Pulse app icon\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/screenshot-window.png\" alt=\"Pulse main window\" /\u003e\n\u003c/p\u003e\n\n## What it does\n\nPulse continuously checks your connection (every 30s – 5m, your call) and gives you the truth about your internet — **right now** and **over time**:\n\n- **Online / offline** with a live pulsing indicator\n- **Latency, jitter, packet loss** to two hosts in parallel (default `1.1.1.1` and `8.8.8.8`)\n- **Download / upload throughput** via macOS's built-in `networkQuality`\n- **Outage log** — every drop is timestamped, durations tracked, with auto-traceroute captured at the moment things break\n- **Network info** — public IP, local IP, gateway, interface, captive-portal detection\n- **Menu bar status** — glanceable pulse icon + ms readout\n- **Notifications** — outage start/restored, latency-spike alerts (configurable threshold)\n- **Battery-aware** — cadence backs off automatically on battery\n- **Shortcuts integration** — `Run Speed Test`, `Get Latest Ping`, `Check If Online`\n- **CSV export** — proof-for-ISP report with every sample, outage and speed test\n\n## Why I built it\n\nMost Mac monitors are either pretty dashboards with no outage history (Stats, Bandwidth+), enterprise Windows-ports with hostile UI (PingPlotter), or aging Speedtest-by-Ookla which hasn't been updated in years. Pulse picks the best ideas from each, drops the bloat, and looks like something you actually want in your menu bar.\n\n## Install\n\n### Build from source\n\nRequirements: macOS 13+ and Xcode (the Command Line Tools alone are missing the SwiftPM ManifestAPI).\n\n```bash\ngit clone \u003cthis repo\u003e\ncd pulse\n./build.sh\nopen Pulse.app\n# Optional:\ncp -R Pulse.app /Applications/\n```\n\nThe build script:\n1. Picks Xcode's toolchain via `DEVELOPER_DIR` (without changing global `xcode-select`)\n2. Compiles the `Pulse` and `IconGen` Swift Package targets\n3. Generates `AppIcon.icns` from a SwiftUI `ImageRenderer` view\n4. Bundles `Pulse.app` and ad-hoc codesigns it\n\nFirst launch may show macOS's \"downloaded from internet\" warning since the binary is ad-hoc signed — right-click → Open, then it remembers.\n\n### Tip: launch at login\n\nIn Pulse's Settings sheet, toggle **Launch at login**. (Uses `SMAppService.mainApp`, no helper required.)\n\n## Project layout\n\n```\n.\n├── Package.swift                # Two SwiftPM targets: Pulse + IconGen\n├── build.sh                     # Build + bundle + .icns pipeline\n├── Sources/\n│   ├── Pulse/\n│   │   ├── PulseApp.swift          # @main, WindowGroup, MenuBarExtra\n│   │   ├── ContentView.swift       # Main window\n│   │   ├── MenuBarView.swift       # Menu bar dropdown\n│   │   ├── SettingsView.swift      # Settings sheet\n│   │   ├── TracerouteView.swift    # Traceroute viewer\n│   │   ├── Theme.swift             # Brand: palette, gradients, PulseDot, MetricChip…\n│   │   ├── NetworkMonitor.swift    # Ping cycle, speed test, outage tracking\n│   │   ├── Models.swift            # PingSample / SpeedSample / OutageEvent / Settings\n│   │   ├── Persistence.swift       # JSON in ~/Library/Application Support/Pulse/\n│   │   ├── NetworkInfoProvider.swift  # Public IP, local IP, gateway, captive portal\n│   │   ├── PowerMonitor.swift      # IOPowerSources (battery vs AC)\n│   │   ├── Notifications.swift     # UNUserNotificationCenter\n│   │   ├── LoginItem.swift         # SMAppService\n│   │   ├── Traceroute.swift        # /usr/sbin/traceroute wrapper\n│   │   └── AppIntents.swift        # Shortcuts: Get Ping / Check Online / Run Speed Test\n│   └── IconGen/\n│       └── main.swift              # SwiftUI view → PNGs (16…1024) → iconutil → .icns\n└── docs/                          # GitHub Pages site\n    ├── index.html\n    ├── styles.css\n    ├── script.js\n    └── assets/\n```\n\n## Settings reference\n\n| Setting | Default | What it does |\n|---|---|---|\n| Primary host | `1.1.1.1` | First ping target each cycle |\n| Secondary host | `8.8.8.8` | Second target — distinguishes \"your link\" from \"that one server\" |\n| Pings per sample | 3 | Used to compute jitter and packet loss |\n| Refresh | 1 min | Cycle cadence: 30s / 1m / 2m / 5m |\n| Speed test cadence | 10 min | `networkQuality` runs intentionally infrequently — it saturates the link for ~15s |\n| Reduce frequency on battery | on | Multiplies refresh interval (default 3×) when on battery |\n| Notify on outage / restored | on | macOS notification at the moment of state change |\n| Latency-spike alert | off | Notify when ping \u003e N ms (with 5-minute cooldown) |\n| Auto-traceroute on outage | on | Captures `/usr/sbin/traceroute -n` at outage onset, attaches to outage record |\n| Show ping in menu bar | on | Toggle the numeric readout next to the menu bar icon |\n| Launch at login | off | Registers via `SMAppService.mainApp` |\n\n## Where data lives\n\n```\n~/Library/Application Support/Pulse/\n├── settings.json\n├── history.json    # ping samples\n├── speed.json      # speed test samples\n└── outages.json    # outage events with traceroute attachments\n```\n\n7 days of rolling history are kept by default. Use **Settings → Show in Finder** to open this folder, or **Clear all history** to wipe it.\n\n## Shortcuts integration\n\nThree actions are exposed via App Intents:\n\n- **Get Latest Ping** → returns ping in milliseconds\n- **Check If Online** → returns Boolean\n- **Run Speed Test** → triggers a fresh test, returns Mbps when done\n\nUseful as Hot Keys, Stream Deck triggers, or scriptable status checks.\n\n## CSV export\n\nThe toolbar **Export** button drops a CSV with three sections:\n1. Per-host ping samples — timestamp, attempts, received, loss%, latency, jitter, min, max\n2. Outages — start, end, duration, network fingerprint\n3. Speed tests — timestamp, down Mbps, up Mbps, dl/ul responsiveness (RPM)\n\nThis is what you send to your ISP when they say \"looks fine on our end.\"\n\n## Tech\n\n- **SwiftUI** (macOS 13+)\n- **Swift Charts** for the latency / throughput visualisations\n- **Swift Package Manager** — no Xcode project file needed\n- **`SMAppService`** for login-item registration\n- **`AppIntents`** for Shortcuts\n- **No third-party dependencies**\n\nPulse is **\\~1.1 MB** of binary (most of the bundle is the icon set).\n\n## Roadmap\n\nThings that didn't ship yet but would be nice:\n\n- [ ] Lock Screen widget (macOS 14+)\n- [ ] SSID / BSSID logging once Location permission is granted (per-Wi-Fi outage correlation)\n- [ ] Continuous MTR-style traceroute view\n- [ ] iCloud sync of history across Macs\n- [ ] DNS health (resolution time over time, 1.1.1.1 vs 8.8.8.8 vs ISP)\n- [ ] VPN on/off comparison (interface tagging on samples)\n- [ ] ISP outage feed correlation (Downdetector / Cloudflare Radar)\n\n## License\n\nMIT — see `LICENSE`.\n\n## Acknowledgments\n\nBrand designed inline. App icon drawn procedurally with SwiftUI's `ImageRenderer` (no Sketch / Figma round-trip).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faltuzar%2Fpulse-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faltuzar%2Fpulse-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faltuzar%2Fpulse-app/lists"}