{"id":51178964,"url":"https://github.com/daniel29348679/macpulse","last_synced_at":"2026-07-02T02:03:16.869Z","repository":{"id":356316634,"uuid":"1231737943","full_name":"daniel29348679/MacPulse","owner":"daniel29348679","description":"Native macOS menu bar system monitor — CPU, RAM, network at a glance","archived":false,"fork":false,"pushed_at":"2026-05-07T13:34:49.000Z","size":5566,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-07T15:39:45.900Z","etag":null,"topics":["appkit","cpu-monitor","macos","menu-bar","network-monitor","swift","system-monitor"],"latest_commit_sha":null,"homepage":null,"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/daniel29348679.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":"2026-05-07T08:35:35.000Z","updated_at":"2026-05-07T13:36:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/daniel29348679/MacPulse","commit_stats":null,"previous_names":["daniel29348679/macpulse"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/daniel29348679/MacPulse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel29348679%2FMacPulse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel29348679%2FMacPulse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel29348679%2FMacPulse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel29348679%2FMacPulse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daniel29348679","download_url":"https://codeload.github.com/daniel29348679/MacPulse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel29348679%2FMacPulse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34843147,"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-27T02:00:06.362Z","response_time":126,"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":["appkit","cpu-monitor","macos","menu-bar","network-monitor","swift","system-monitor"],"created_at":"2026-06-27T06:00:34.368Z","updated_at":"2026-06-27T06:00:58.343Z","avatar_url":"https://github.com/daniel29348679.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/icon.png\" width=\"128\" height=\"128\" alt=\"MacPulse\" /\u003e\n\n# MacPulse\n\n**A tiny native macOS menu bar app that gives you a live pulse of your machine.**\n\nCPU · GPU · Memory · Network · Disk · Temperature · Power — at a glance, in one click.\n\nNo Electron. No background daemon. Just a single Swift binary that sits quietly in your menu bar.\n\n\u003cbr /\u003e\n\n\u003cimg src=\"docs/popover.png\" width=\"320\" alt=\"MacPulse popover\" /\u003e\n\n\u003c/div\u003e\n\n---\n\n## Features\n\n| | |\n|---|---|\n| **CPU** | total %, with user / system / idle breakdown + rolling sparkline |\n| **GPU** | device utilization %, renderer / tiler breakdown, and active unified-memory use |\n| **Memory** | % and `used / total` GB, computed the way Activity Monitor does (`active + wired + compressed`) |\n| **Network** | live ↓ / ↑ rates across all physical interfaces — `lo`, `utun`, `awdl`, `bridge` excluded |\n| **Disk** | read / write bytes per second across every `IOBlockStorageDriver` device |\n| **Temperature** | live CPU °C from on-die thermal sensors; falls back to Apple's thermal-pressure level |\n| **Power** | charge wattage when plugged in, draw wattage when on battery — read from `AppleSmartBattery` |\n\nEvery metric can be **toggled independently** in the menu bar and in the popover via a dedicated Settings window.\n\n\u003cbr /\u003e\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cb\u003eOn battery\u003c/b\u003e\u003cbr /\u003e\u003cimg src=\"docs/popover.png\" width=\"280\" /\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cb\u003eCharging\u003c/b\u003e\u003cbr /\u003e\u003cimg src=\"docs/popover-charging.png\" width=\"280\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nThe status bar text adapts to your selection. With the default loadout it reads:\n\n```\n   CPU 12%  GPU 18%  RAM 47%  ↓12W\n   ↓ 1.2M  ↑ 234K\n```\n\nThe bottom row appears only when at least one rate-style metric (Network / Disk) is enabled.\n\n## Settings\n\nA dedicated window for picking which metrics show where, the sample interval, the chart history window, launch-at-login, and in-app updates.\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"docs/settings.png\" width=\"480\" alt=\"MacPulse settings window\" /\u003e\n\u003c/div\u003e\n\n## Requirements\n\n- macOS 13 (Ventura) or newer\n- Swift 5.9+ toolchain (Xcode 15 or the Command Line Tools)\n\n## Install\n\n### Option 1 — Prebuilt `.app` (easiest)\n\nGrab the latest `MacPulse-vX.Y.Z.zip` from the [Releases page](../../releases),\nunzip, and drag `MacPulse.app` into `/Applications`.\n\nThe binary is ad-hoc signed (not notarized), so the first launch needs:\n**right-click `MacPulse.app` → Open → Open**.\n\n### Option 2 — Build from source\n\n```bash\ngit clone https://github.com/daniel29348679/MacPulse.git\ncd MacPulse\n\n# Quick run (debug build)\nswift run -c release\n\n# Or bundle into a real .app with the icon baked in\nscripts/make-icon.sh             # one-off, rebuilds Resources/AppIcon.icns from AppIcon-source.png\nscripts/build-app.sh             # produces ./MacPulse.app\nopen MacPulse.app\n```\n\nThe first build takes ~30s; after that startup is instant.\n\n## How it works\n\n| Metric  | Source                                                            |\n| ------- | ----------------------------------------------------------------- |\n| CPU         | `host_statistics(HOST_CPU_LOAD_INFO)` — diff of user/system/idle ticks between samples |\n| GPU         | IOKit `IOAccelerator.PerformanceStatistics` — device / renderer / tiler utilization and active system memory |\n| Memory      | `host_statistics64(HOST_VM_INFO64)` — `(active + wired + compressed) × page_size`      |\n| Network     | `getifaddrs()` + `if_data` — diff of `ifi_ibytes` / `ifi_obytes` between samples       |\n| Disk        | IOKit `IOBlockStorageDriver.Statistics` — diff of `Bytes (Read)` / `Bytes (Write)`     |\n| Temperature | `IOHIDEventSystemClient` — enumerate `kHIDPage_AppleVendor / TemperatureSensor` services |\n| Power       | IOKit `AppleSmartBattery` registry entry — `Voltage × Amperage`, plus `IsCharging` / `ExternalConnected` for direction |\n\n\u003e **About the temperature reading.** Apple does not expose CPU °C through any public API.\n\u003e We use `IOHIDEventSystemClient` (private but linkable from `IOKit.framework`) to enumerate\n\u003e all HID temperature sensors. On Apple Silicon, names like `PMU tdie0`–`PMU tdie14` are the\n\u003e on-die sensors, and we report the maximum value across them as \"CPU temperature.\" This is\n\u003e the same trick the popular open-source [Stats](https://github.com/exelban/stats) app uses.\n\u003e It works without entitlements but uses unpublished symbols, so a future macOS release\n\u003e *could* break it. When it does, the app falls back to `ProcessInfo.processInfo.thermalState`\n\u003e (Cool / Warm / Hot / Critical), which is the only public API for thermal info.\n\u003e\n\u003e Run `MacPulse.app/Contents/MacOS/MacPulse --dump-sensors` to print every readable sensor.\n\n\u003e **About power.** When charging, MacPulse shows the wattage flowing **into** the battery; when\n\u003e on battery, the wattage flowing **out**. Plugged in but battery full → the section shows `AC`\n\u003e (effective draw on the cells is ≈ 0). Desktop Macs (Mac mini / iMac / Studio) have no battery,\n\u003e so the section reads `—`. Numbers are computed from `Voltage × Amperage` reported by\n\u003e `AppleSmartBattery`; we always display the absolute value because the sign convention for\n\u003e `Amperage` differs across Mac generations.\n\nDefault sampling interval: **1 second**. Change it from the right-click menu or the\nSettings window; allowed values are 0.5 / 1 / 3 / 5 / 10 s, persisted via `UserDefaults`.\n\n## Project layout\n\n```\nMacPulse/\n├── Package.swift\n├── Resources/\n│   ├── AppIcon-source.png           # 1254×1254 master image (source of truth)\n│   └── AppIcon.icns                 # built by scripts/make-icon.sh\n├── scripts/\n│   ├── build-app.sh                 # bundle MacPulse.app for local use\n│   └── make-icon.sh                 # rescale source PNG into the .icns iconset\n├── docs/                            # README screenshots\n└── Sources/MacPulse/\n    ├── main.swift                   # NSApplication entry point + CLI flags\n    ├── AppDelegate.swift\n    ├── Settings.swift               # UserDefaults-backed prefs + Metric enum\n    ├── Screenshots.swift            # offscreen render mode for marketing shots\n    ├── Monitors/\n    │   ├── CPUMonitor.swift\n    │   ├── GPUMonitor.swift         # IOAccelerator PerformanceStatistics via IOKit\n    │   ├── MemoryMonitor.swift\n    │   ├── NetworkMonitor.swift\n    │   ├── DiskMonitor.swift\n    │   ├── TemperatureMonitor.swift\n    │   ├── TemperatureSensors.swift # IOHIDEventSystemClient bridge\n    │   ├── PowerMonitor.swift       # AppleSmartBattery via IOKit\n    │   └── Formatter.swift\n    └── UI/\n        ├── StatusBarController.swift\n        ├── StatsPopoverController.swift\n        ├── SettingsWindowController.swift\n        └── SparklineView.swift\n```\n\n## Roadmap\n\n- [x] Disk I/O monitoring\n- [x] Sparkline charts in the popover\n- [x] Configurable update interval\n- [x] Toggle which metrics show in the menu bar / popover\n- [x] Thermal state indicator\n- [x] On-die °C temperature reading\n- [x] Battery charge / discharge wattage\n- [x] GPU usage\n- [x] App icon\n- [ ] Per-core CPU breakdown\n- [ ] Notarized `.app` bundle in releases\n\nPRs welcome.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel29348679%2Fmacpulse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaniel29348679%2Fmacpulse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel29348679%2Fmacpulse/lists"}