Skip to content
blaineamPublic

About

A featherlight macOS menu bar system monitor

Topics

Resources

Stars

10 stars

Watchers

1 watching

Forks

Latest commit

 

History

324 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Blip

A featherlight macOS menu bar system monitor. CPU, memory, disk, GPU, network, battery — all in a tiny, beautiful package.

macOS Apple Silicon License App Size


💡 Why Blip?

Existing system monitors are either bloated, expensive, or missing key features. Blip takes the best ideas from iStats Menus and Stats Panel, strips away the fluff, and delivers a monitor that's:

  • Tiny — ~2 MB app bundle, ~42 MB memory footprint
  • Fast — async/await throughout, polls every 2 seconds
  • Pretty — clean layout, smooth charts, hover detail panels
  • Focused — system metrics only, no weather or clock widgets
  • Localized — English plus German, Spanish, French, Italian, Japanese, Korean, Brazilian Portuguese, and Simplified Chinese, on Mac, iPhone, iPad and in the Home Screen widgets
  • Free — open source under MIT, notarized releases on GitHub

✨ Features

Category Menu Bar Detail Panel
CPU Usage bar + percentage Per-core bars, user/system/idle split, load averages (1m/5m/15m), P-core and E-core counts, top processes with accurate delta-based CPU and app icons
Memory Usage bar + percentage Total memory, active/wired/compressed/app breakdown, swap usage, memory pressure (factors in swap), top processes with accurate phys_footprint memory and app icons
Disk Usage bar + percentage All mounted volumes with space used/free, real-time read/write speeds, total data read/written since boot, I/O history chart with Y-axis labels, S.M.A.R.T. drive health — SSD life remaining, available spare, drive temperature, lifetime bytes written/read, power-on hours, power cycles, unsafe shutdowns (NVMe health log, internal + NVMe enclosures), disk speed test — uncached sequential write/read + random IOPS benchmark with optional interval testing, runnable on any volume in one click via its gauge button
Network Connectivity dot Upload/download speeds, accurate session totals up/down (64-bit, wrap-corrected), WAN and router ping latency (configurable target), bandwidth history chart with Y-axis labels, all active interfaces (Wi-Fi + Ethernet), IPv4/IPv6, LAN IP, router IP, MAC address, WAN IP reveal, VPN detection (Tailscale, WireGuard), click-to-copy addresses, live Traceroute / MTR with per-hop loss & latency, multi-gig speed test (download/upload throughput against Cloudflare or a self-hosted OpenSpeedTest LAN server) with optional interval testing
Processes — Top processes by CPU and memory with app icons; kill a process right from the list (user-owned processes; routed through the helper when sandboxed)
GPU Usage bar + percentage (optional, off by default) Apple Silicon GPU utilization, renderer name, GPU core count, historical usage chart
Battery — Charge %, health %, cycle count, temperature, time remaining, charging status
Fans — RPM per fan with min/max range bars, CPU and GPU temperatures
Keep Awake Cup icon while on Stop the Mac sleeping for 30 min – 4 h or until turned off; keep the display on or let it sleep; stay awake with the lid closed (one admin prompt per launch, auto-restored when Keep Awake ends, Blip quits, or at 10% battery); jiggle the mouse when idle so apps don't mark you away
System — Mac model, macOS version, uptime, thermal state, Blip's own memory usage

Plus:

  • Historical charts — sparklines for CPU, memory, GPU; dual-line charts for disk I/O and network bandwidth with auto-scaled Y-axis labels
  • Live detail panels — hover any row in the popover to reveal a detailed sub-panel that updates in real-time (like iStats Menus), or switch to inline details to expand them inside the menu on click
  • Pin it open — keep the menu up while you work, drag it off into its own floating window, or pin any detail panel into a live window of its own
  • Two layouts — horizontal (default, wide side-by-side) or stacked (compact vertical bars)
  • Customizable — category colors, monochrome, or custom color picker; separate measurement and value label toggles; optional utilization colorization
  • Launch at login — one toggle in settings
  • Shortcuts support (App Intents) — automate Blip from the Shortcuts app: Get System Metric (37 metrics, chainable numeric results, optional 2-minute average/min/max for charted metrics), Run Drive Speed Test on any mounted volume, Run Network Speed Test (public or self-hosted OpenSpeedTest), Run/Stop Traceroute with an MTR summary, Open Traceroute Map, Keep Mac Awake / Let Mac Sleep, and Get/Set Setting over a curated, validated settings catalog

📱 Blip for iOS / iPadOS

Blip 2.0 brings a native companion app (BlipMobile/) to iPhone and iPad — the honest subset of what iOS exposes to a sandboxed app, plus the things a phone does best:

  • Overview — CPU, memory, storage, battery, thermal, network and device cards, each opening a full detail screen; tap-to-copy on reference values, tap-to-reveal WAN IP, VPN + radio (5G/LTE) awareness, boot-derived uptime, human device names, and honest suggestions when a real signal fires (storage nearly full, throttling, Low Data Mode…)
  • Blip Bench — the same fixed-reference-unit benchmark as the Mac (scores are comparable across every device running Blip), with an animated running view and sustained-phase throttle measurement
  • Speed — public OpenSpeedTest service or your own server, live curve, capped history, share cards
  • Network — ping and traceroute over sandbox-legal ICMP datagram sockets, with offline GeoIP hop annotations (same DB-IP database as the Mac)
  • Storage — disk speed tests on internal storage or any Files-accessible external volume
  • Widgets — bench score, storage, last speed test; every fact stamped with its age
  • Shortcuts — Run Benchmark, Run Speed Test, Get Device Snapshot (Markdown)
  • Snapshot export — one file with everything Blip knows, ready for the share sheet

Same repo, same xcodegen project: build the BlipMobile scheme. Ships on the App Store as Blip Stats for iOS.

📦 Install

Mac App Store

Blip is available free on the Mac App Store as Blip Stats — the same app as the direct download and Homebrew builds.

Download on the Mac App Store

The App Store build is sandboxed, so some advanced features (fan speeds, temperatures, GPU utilization, disk I/O, top processes) need the free Blip Helper companion app. The direct download and Homebrew builds read them on their own.

Homebrew (Recommended for Direct Download)

brew install --cask blaineam/tap/blip
brew install --cask blaineam/tap/blip-helper   # only for the App Store build

Download DMG

Grab the latest notarized Blip.dmg (or BlipHelper.dmg for the companion helper). Open it, drag to Applications, done.

Build from Source

# Prerequisites
brew install xcodegen

# Clone and build
git clone https://github.com/blaineam/blip.git
cd blip
xcodegen generate
xcodebuild -scheme Blip -configuration Release -arch arm64

The app lands in .build/DerivedData/Build/Products/Release/Blip.app.

Run the Tests

xcodegen generate                    # the .xcodeproj is generated, not committed
xcodebuild test -scheme Blip -destination 'platform=macOS,arch=arm64'

# The same Mac tests compiled as the App Store variant (exercises the #if APPSTORE paths):
xcodebuild test -scheme Blip -destination 'platform=macOS,arch=arm64' \
  'SWIFT_ACTIVE_COMPILATION_CONDITIONS=DEBUG APPSTORE' -derivedDataPath /tmp/blip-appstore-dd

# iOS app + widgets (also runs the cross-platform tests in BlipTests/CrossPlatform):
xcodebuild test -scheme BlipMobile -destination 'platform=iOS Simulator,name=iPhone 17 Pro'

# Coverage ratchet (fails below the gated minimum):
./Scripts/coverage-check.sh

# Localization + website consistency (string catalogs, Info.plist dev region, docs/ i18n):
node --test Scripts/checks.test.mjs

# UI tests (XCUITest). iOS/iPadOS — the same bundle on both idioms:
# (Soren runs these on dedicated "Blip UI …" simulators — see soren.config.mjs.)
xcodebuild test -scheme BlipMobileUITests -destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=27.0'
xcodebuild test -scheme BlipMobileUITests -destination 'platform=iOS Simulator,name=iPad Pro 13-inch (M5),OS=27.0'
# macOS — against the Debug-only BlipUITestHost ("Blip UITest", its own bundle id). The runner
# must be signed (ad-hoc is fine) and may need Developer Tools access (`DevToolsSecurity -enable`)
# — a runner that "hung before establishing connection" is waiting on that authorization:
xcodebuild test -scheme BlipUITests -destination 'platform=macOS' CODE_SIGN_IDENTITY=-

Everything above is wired into Soren (soren.config.mjs): unit, appstore-unit, mobile, ui-macos, ui-ios, ui-ipad, appstore, helper, coverage, l10n, web-syntax and web. All tests are hermetic — network tests use in-process loopback servers, privileged paths (password prompt, pmset, the helper) use fakes. The UI tests launch the app with the DEBUG-only -UITestMode argument (Shared/UITestMode.swift): isolated defaults seeded with the screenshot fixtures, stubbed bench / speed-test / ping / traceroute runners, no network, animations off. Release builds compile it out.

Build DMG Locally

chmod +x Scripts/build-dmg.sh
./Scripts/build-dmg.sh              # full build + notarize
./Scripts/build-dmg.sh --skip-notarize  # unsigned local build

❤️ Support future development

Blip is free — no ads, no tracking, no subscription. If it earns a place on your Mac, you can help fund what comes next.

Sponsor on GitHub · Buy me a coffee on Ko-fi

All the ways to support →

🔧 How It Works

+-----------------------------------------------------------+
|                   Menu Bar (NSStatusItem)                  |
|   [CPU]  [MEM]  [HD]  *                                   |
+----------------------------+------------------------------+
                             | click
                  +----------v-----------+
                  |  Popover             |  hover  +--------+
                  |   CPU     45%     >  | ------> | Detail |
                  |   Memory  67%     >  |         | Panel  |
                  |   Disk    34%     >  |         +--------+
                  |   Network  v^     >  |         | Cores  |
                  |   GPU     12%     >  |         | Loads  |
                  |   Battery 89%     >  |         | Procs  |
                  |                      |         | Charts |
                  |  MacBook Pro (M4)    |         +--------+
                  |  Up 3d 2h | Nominal  |
                  |  Blip v1.4.7         |
                  +----------------------+

🗂 Project Structure

Blip/
├── Blip/
│   ├── Sources/
│   │   ├── App/BlipApp.swift            # Entry point, NSStatusItem, popover
│   │   ├── Models/
│   │   │   ├── SystemStats.swift        # All data models
│   │   │   └── HistoryBuffer.swift      # Ring buffer for charts
│   │   ├── Services/
│   │   │   ├── SystemMonitor.swift      # Async coordinator
│   │   │   ├── CPUMonitor.swift         # host_processor_info
│   │   │   ├── MemoryMonitor.swift      # host_statistics64
│   │   │   ├── DiskMonitor.swift        # Volume stats + IOKit I/O
│   │   │   ├── GPUMonitor.swift         # IOAccelerator + Metal
│   │   │   ├── NetworkMonitor.swift     # NWPathMonitor + getifaddrs
│   │   │   ├── BatteryMonitor.swift     # IOPSCopyPowerSourcesInfo
│   │   │   ├── FanMonitor.swift         # SMC fan keys
│   │   │   ├── ProcessMonitor.swift     # proc_pidinfo + proc_pid_rusage
│   │   │   └── SMCKit.swift             # IOKit SMC interface
│   │   ├── Intents/                     # App Intents (Shortcuts): metrics,
│   │   │                                #   speed tests, traceroute, settings
│   │   └── Views/
│   │       ├── StatusItemView.swift     # Menu bar layout (stacked/horizontal)
│   │       ├── PopoverView.swift        # Main overview + detail routing
│   │       ├── SettingsView.swift       # Preferences window
│   │       ├── Panels/                  # Detail panels per category
│   │       └── Components/              # Charts, bars, process rows
│   └── Resources/
│       ├── Assets.xcassets
│       ├── Info.plist
│       └── Blip.entitlements
├── BlipTests/                           # Hermetic Mac unit tests
│   ├── CrossPlatform/                   #   also compiled into BlipMobileTests
│   └── Support/                         #   MMDB fixture builder, loopback HTTP server
├── BlipMobileTests/                     # iOS unit tests (simulator)
├── Scripts/
│   ├── build-dmg.sh                     # Local build + package
│   ├── coverage-check.sh                # App-logic coverage ratchet (xccov)
│   ├── check-l10n.mjs                   # String catalog / Info.plist gate
│   ├── check-site-i18n.mjs              # docs/ i18n + manifest gate
│   └── generate-assets.swift            # App icon generator
├── .github/workflows/
│   ├── ci.yml                           # PR build + QA checks
│   └── release.yml                      # Tag → build → notarize → release
├── docs/                                # GitHub Pages site
├── project.yml                          # XcodeGen project definition
├── CHANGELOG.md
└── LICENSE                              # MIT

🤝 Contributing

  1. Fork and clone the repo
  2. brew install xcodegen && xcodegen generate
  3. Open Blip.xcodeproj in Xcode or build from the command line
  4. Make your changes, test on Apple Silicon hardware
  5. Open a PR

Guidelines

  • Keep it tiny — no external dependencies
  • Match the existing code style (SwiftUI, async/await, value types)
  • Test on actual hardware — simulators can't read SMC or IOKit sensors
  • Open an issue first for large changes

🖥 Requirements

  • macOS 14.0 (Sonoma) or later
  • Apple Silicon (M1, M2, M3, M4, or newer)
  • Xcode 16+ and XcodeGen (for building from source)

❓ FAQ

Does Blip work on Intel Macs?
No. Blip targets Apple Silicon exclusively. It uses ARM64-specific page sizes and Apple Silicon IOKit interfaces for GPU and thermal monitoring.
Why does it need to run unsandboxed?
Blip reads hardware sensors (SMC for fans, IOKit for GPU/disk I/O, process list for top apps) which require unsandboxed access. The app is fully open source — you can audit every line, and every release is notarized by Apple.
How much memory does Blip use?
Typically around 42 MB physical footprint. Blip shows its own memory usage in the popover footer so you can always verify.
Why does the menu bar readout look blurry on one of my displays?
When two displays run at different pixel densities (a Retina MacBook next to a standard-DPI external, say), macOS renders a status item once — at the scale of the display whose menu bar is currently active — and mirrors a scaled copy to the other display. Every menu bar app with a custom view behaves this way; it isn't something Blip can override. The workaround is to run both displays at the same backing scale: give the external a HiDPI ("Retina") scaled resolution in System Settings → Displays, or with a tool like BetterDisplay.
Is Blip really free?
Yes. The direct download, the Homebrew cask and the Mac App Store build are all free and identical — there is no paid tier and nothing to unlock. If you'd like to support development, use the links in the Support future development section above.

🤝 Contributors

Blip is better because people send patches — thank you!

Contributors

Made with contrib.rocks; updates automatically as PRs land.

📄 License

MIT — free as in beer and free as in freedom. See LICENSE for details.


Built by Blaine Miller. If Blip saves you from installing a 200 MB monitoring suite, consider starring the repo.

About

A featherlight macOS menu bar system monitor

Topics

Resources

Stars

10 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages