Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MacPulse icon

MacPulse Task Manager

The Task Manager macOS Never Gave You
I grew up on Windows. Ctrl+Alt+Del was muscle memory.
When I switched to Mac, the first thing I missed was a real Task Manager.
Activity Monitor felt like reading a spreadsheet when your house is on fire.
So I built MacPulse - the system monitor I always wanted on macOS.

Latest Release License Platform Universal Binary Zero Dependencies Swift

How It Works •  Features •  Install •  Extended Telemetry •  Releases •  Build •  Architecture •  Contributing


Per-core CPU utilization across 36 logical processors with live frequency, temperature, and package power readings

Grouped process list with real-time CPU, memory, and disk I/O per application

Fullscreen CPU graph - double-click any Performance chart to expandDetached sidebar - double-click empty sidebar area to float it


⚙ How It Works

MacPulse is a native Swift/SwiftUI application. No Electron, no web views, no Python wrappers. It reads system telemetry directly from macOS kernel interfaces and publishes one atomic UI frame per refresh cycle.

CPU and Memory Sampling

CPU counters come from the Mach host_processor_info kernel trap, which returns per-logical-processor tick counts (user, system, idle, nice) for every core. MacPulse diffs consecutive samples to compute real-time utilization per logical processor - no top, no ps, no shell spawning. Memory stats use host_statistics64 with HOST_VM_INFO64 for wired, active, inactive, compressed, and free page counts.

Optional Telemetry Providers

MacPulse works out of the box with zero dependencies. For extended telemetry (CPU frequency, package power in watts, die temperature), install these optional providers:

Provider What it unlocks Install
Intel Power Gadget CPU frequency (GHz), package power (W), die temperature (C) Download .dmg from Intel. MacPulse looks for PowerLog in /Applications/Intel Power Gadget/, /Library/Intel/Power Gadget/, and /usr/local/bin/.
smartmontools Full NVMe/SATA SMART attributes: available spare, percentage used, life remaining, power-on hours, media errors, data written brew install smartmontools - MacPulse uses smartctl when available.
NVIDIA drivers GPU utilization, VRAM, clocks, temperature, power draw, fan speed MacPulse reads nvidia-smi from /usr/local/bin/, /opt/homebrew/bin/, or /usr/bin/ when present.

All three are strictly optional. If a provider is not installed, MacPulse skips it silently and shows only what the native macOS APIs expose.

Disk I/O and SMART Health

Storage throughput is sampled from IOKit IOBlockStorageDriver counters attached to whole-disk IOMedia registry objects. Each physical device resolves to one parent statistics table, avoiding double-counting from APFS container synthesis. diskutil inventories physical devices; the device list refreshes only on plug/unplug events, not every sample cycle.

SMART diagnostics are on-demand only - no background polling. When you click "SMART health report," MacPulse reads the macOS-provided SMARTStatus from IOKit first. If smartctl is installed (see table above), it additionally parses NVMe/SATA health attributes: overall status, available spare, percentage used, life remaining, temperature, power-on hours, media errors, and data read/written totals.

MacPulse never invents a SMART percentage. If the drive or its USB/Thunderbolt bridge doesn't expose a metric, that field is absent - not zero, not "Healthy," not estimated.

Disk 0 performance graphs with SMART health panel - WD_BLACK SN770 1TB, 96% life remaining, 36 C, score 100/100

Network and GPU

Network throughput uses getifaddrs per-interface byte counters - no netstat, no shell commands. GPU utilization reads IOKit IOAccelerator / AGXAccelerator performance dictionaries when the driver exposes them (Apple Silicon and most AMD GPUs report natively without additional tools).

Process Classification

Every process is classified as Apple system, third-party background, or installed application using a multi-signal pipeline:

  1. Name catalog - a curated list of ~200 known Apple executables for processes where protected metadata is unavailable
  2. Code signature - verified Apple or third-party signing identity
  3. Bundle identity - CFBundleIdentifier resolved from the owning .app bundle
  4. Team ID - Apple Developer Team identifier from the code signature
  5. Executable path - filesystem location (/System/, /Library/, /Applications/, user space)
  6. Application ownership - helper executables resolved to the outermost .app bundle (Chrome renderers → Google Chrome, Docker helpers → Docker Desktop)

Each classification carries a confidence percentage and lists the evidence that produced it. A name-catalog match alone scores lower than a name + signature + bundle match. This pipeline powers the view filters (see below).

Process inspector - parent-child PID tree and related application components with classification confidence scores

Startup Item Control

Startup apps are scanned from ~/Library/LaunchAgents, /Library/LaunchAgents, /Library/LaunchDaemons, and (optionally) /System/Library/Launch*. Each plist is parsed for its label, program, and RunAtLoad state. The owning application is resolved from bundle containment, executable path matching, or bundle-identifier family evidence.

Enable/disable uses launchctl disable/enable gui/<uid>/<label> (or system/<label> for daemons). If the direct call fails, MacPulse falls back to osascript with administrator privileges. After every change, the actual launchctl print-disabled output is re-read to verify the operation succeeded - if the state didn't change, the error is surfaced instead of silently swallowed.

Startup apps - 37 items with application name, type, run-at-login state, and enable/disable toggle

Startup item inspector - double-click any item

Creative Cloud startup inspector - configuration, ownership evidence, running processes, and process tree


⚡ Features

Processes

Windows-style process groups: Apps, Background processes, macOS processes. CPU is normalized to total machine capacity (0-100%), not the confusing per-core percentage macOS uses (where 800% means 8 cores busy). Expand any app to see its child processes.

  • Column sorting - click any column header to sort ascending/descending by: CPU, Memory, GPU, Disk, Disk Read, Disk Write, Name, PID, Threads, Priority, Start Time, Status, User, Architecture, Publisher
  • View filters - filter processes by origin classification:
    • All processes
    • Installed software (excludes Apple system components)
    • Third-party background only (helpers, agents, menu-bar utilities, launch items)
    • My Processes (current user only)
    • Apple Only (Apple-signed apps and OS components)
    • Unknown (processes with no determinable origin)
  • Configurable columns - right-click any column header to show/hide: CPU, Memory, Disk, Disk read/write, GPU, PID, Priority, Architecture, Start time, Publisher, Threads
  • Process actions - End task, Force terminate, Suspend, Resume
  • Search - filter by name, publisher, or PID
Column chooser and view filters

Right-click any column header to choose visible columns

View filter dropdown - Installed software excludes Apple, Background shows helpers and agents

Process group expansion

Spotify expanded - 7 child processes with individual memory breakdown

Process Inspector

Double-click any process to open a six-tab inspector:

Tab What It Shows
Overview CPU, memory, threads, open file count
Process Tree Actual parent-child PID relationships and probable related components
Identity Software origin, classification confidence, bundle ID, executable path, code signature evidence
Open Files Every file descriptor held by the process
Control Suspend / Resume / Terminate / Force Terminate, priority adjustment (Background → Very High), process tree termination
Identity and Control tabs

Identity tab - software origin classification with confidence score and executable path

Control tab - priority levels from Background to Very High and administrator relaunch

App History

Cumulative CPU time, disk read, disk write, and memory per application since session start. Helper processes are grouped under their parent app. Click any column header to sort ascending/descending.

App History - ChatGPT 57min CPU, Chrome 36min, sorted by cumulative usage

Users, Details, Services

Tab Description
Users Every user account with process count, aggregate CPU, memory, threads
Details Flat process list with every available column (matches Windows Details tab)
Services All running launchd services - Apple system and third-party - with PID

Users tab - active user sessions Details tab - flat process list Services tab - running launchd services

Menu Bar Companion

Persistent menu-bar icon with live CPU percentage. Click for a popover with CPU/memory graphs and the top 5 processes. Can be disabled from Settings.

Menu bar popover - CPU 27.8%, Memory 45.7%, top 5 processes

Settings

Chart types (area/line), CPU graph mode (overall/logical processors), visible history length (up to 600 samples), grid/axis toggles, refresh interval (0.5-5s), and telemetry provider diagnostics.

Settings - chart configuration with live preview


📥 Install

Download the DMG

  1. Go to Releases
  2. Download MacPulse-8.0.3-macOS-universal.dmg
  3. Open the DMG, drag MacPulse to Applications
  4. Launch from Applications

MacPulse DMG installer - drag to Applications

First launch: macOS may show "can't be opened because Apple cannot check it for malicious software." Right-click the app → Open → Open. This only happens once with ad-hoc signed builds.

Requirements: macOS 12 Monterey or later. Universal binary (Apple Silicon + Intel).

Optional: Extended Telemetry

For CPU wattage, frequency, and temperature readings on Intel Macs, install Intel Power Gadget. For full SMART disk health attributes (life remaining, power-on hours, media errors), install smartmontools: brew install smartmontools. Both are detected automatically on next launch.


📦 Releases

v8.0.3 - current

Asset Description
MacPulse-8.0.3-macOS-universal.dmg Drag-to-Applications disk image, universal binary (arm64 + x86_64), ad-hoc signed
MacPulse-8.0.3-macOS-universal.zip Compressed .app bundle for manual placement or CI integration

🔧 Build from Source

git clone https://github.com/vluncasu/MacPulse-Task-Manager.git
cd MacPulse-Task-Manager

make release    # universal binary (arm64 + x86_64) -> dist/MacPulse.app
make dmg        # drag-to-Applications installer -> dist/MacPulse-8.0.3-macOS-universal.dmg
make test       # run XCTest suite

Requirements: macOS 12+, Xcode 13.4.1+ (full installation, not just Command Line Tools).

Or double-click: BUILD_MACOS.command / BUILD_DMG.command / OPEN_IN_XCODE.command.


📑 Architecture

Language Swift 5.6+ / SwiftUI / AppKit
Target macOS 12 Monterey+
Binary Universal (arm64 + x86_64)
Dependencies Zero external - only Apple system frameworks
CPU sampling Mach host_processor_info per-logical-processor tick diffs
Memory Mach host_statistics64 with HOST_VM_INFO64
Disk I/O IOKit IOBlockStorageDriver counters on whole-disk IOMedia objects
Network getifaddrs per-interface byte counters
GPU IOKit IOAccelerator / AGXAccelerator performance dictionaries
Disk inventory diskutil physical device enumeration (refreshed on plug/unplug only)
SMART IOKit SMARTStatus + optional smartctl enrichment for NVMe/SATA
Process identity Code signature + bundle ID + Team ID + name catalog + path heuristics
Optional providers Intel Power Gadget (CPU freq/power/temp), nvidia-smi (NVIDIA GPU)

Single-process SwiftUI application. No kernel extensions, no helper daemons, no background services beyond the optional menu-bar companion.

Project structure
MacPulse/
  App/                  Application entry point, AppDelegate, window lifecycle
  Models/               Data models - ProcessRecord, SystemSnapshot, PowerSnapshot, AppSettings
  Services/             Telemetry engine - SystemSampler, SystemMonitor, HardwareInspector, StartupMonitor
  Views/                SwiftUI views - ProcessesView, PerformanceView, ProcessInspectorView, SettingsView
  Views/Components/     Reusable UI - ChartView, ProcessIconView, SectionCard, sidebar components
  Resources/            Asset catalogs, entitlements, Info.plist
scripts/                Build automation - build-release.sh, create-dmg.sh, github-push.sh
screenshots/            Application screenshots for documentation
Distribution/Public/    Community edition configuration and App Store entitlements

🤝 Contributing

Contributions are welcome. Whether it's a bug fix, a new feature, or a documentation improvement - every pull request gets reviewed.

Found a bug? Open an issue with your macOS version and steps to reproduce. Crash logs from ~/Library/Logs/DiagnosticReports/ are always helpful.

Want to contribute code? Fork the repo, create a feature branch, and submit a PR. The codebase builds with a single make release - no package managers, no dependency setup.

Have an idea? Start a discussion or open a feature request issue. We track everything in GitHub Issues.

If MacPulse is useful to you, consider giving the project a ⭐ - it helps others discover it.


📜 License

Available under the MIT License. Use it, fork it, build on it.


Built with Swift and SwiftUI by TerabitLab
Star this projectReport a bugFork it

About

Native macOS system monitor. Per-core CPU graphs, SMART disk health, process classification, startup management. Reads Mach kernel APIs and IOKit directly — zero dependencies.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages