A menu bar system monitor for macOS. CPU, memory, GPU, network, disk, battery and thermals at 0.046% CPU.
296
stars
134
commits
Swift
primary language
Sep 3, 2026
updated
An ultra lightweight macOS system monitor.
AirStats is a system monitor for the Mac menu bar. It reads CPU, memory, GPU, network, disk, battery, temperature, process and host statistics from the kernel and shows them in three places: the menu bar itself, a panel that drops down when you click the status item, and a desktop widget you can leave on screen.
It is built to be genuinely light. A menu bar monitor runs all day, every day, so AirStats holds a few megabytes and a fraction of a percent of one core rather than the tens of megabytes its peers take. It has no Dock icon, and reads the system through Mach, IOKit, sysctl and CoreWLAN.
Download it from airstats.app, open the dmg and drag the app to Applications. It is signed and notarized, so it opens with no warning.
Or with Homebrew:
brew install --cask byrencheema/tap/airstats
AirStats updates itself with Sparkle. It asks airstats.app once a week whether a newer version exists, and installs one only when you say so. Both of those can be turned off in General settings.
You need the Swift 6 toolchain that ships with Xcode 16.
Scripts/build.sh release
cp -R .build/arm64-apple-macosx/release/AirStats.app /Applications/
open /Applications/AirStats.app
Scripts/build.sh wraps the SwiftPM binary in a .app bundle, copies Sparkle.framework
into Contents/Frameworks, and signs it ad hoc. macOS grants a status item only to a
signed bundle with LSUIElement set. Run the script with no argument for a debug build.
An ad-hoc signature is enough to run a build you made yourself, and not enough to travel:
macOS refuses an ad-hoc bundle that arrived over the internet. Scripts/release.sh is what
produces the download above, signing with a Developer ID certificate and stapling Apple's
notarization ticket to the .dmg.
| Path | What lives there |
|---|---|
Sources/AirStatKit | Collectors, the sampling engine, settings, formatting. No UI. |
Sources/AirStatUI | Menu bar drawing, panel, desktop widget, settings window, charts, design system. |
Sources/AirStats | The executable, app delegate, and the probe and render commands. |
Tests/AirStatKitTests | Contract tests for the collectors, plus settings and formatting. |
Scripts/build.sh | Builds the binary and assembles the .app. |
Scripts/release.sh | Signs, notarizes and packages the .dmg that ships. |
Scripts/appcast.py | Writes a release into the appcast Sparkle reads. |
Scripts/benchmark.py | Samples the menu bar monitors on your Mac over one shared window. |
AirStatKit never imports SwiftUI or AppKit, which is what lets the tests and the probe
run in a windowless process.
CONTRIBUTING.md has the checks to run before a pull request and the house rules.
MIT. See LICENSE.
134 commits
Swift
97.1%
Python
1.8%
Shell
1.1%
A menu bar system monitor for macOS. CPU, memory, GPU, network, disk, battery and thermals at 0.046% CPU.
296
stars
134
commits
Swift
primary language
Sep 3, 2026
updated
An ultra lightweight macOS system monitor.
AirStats is a system monitor for the Mac menu bar. It reads CPU, memory, GPU, network, disk, battery, temperature, process and host statistics from the kernel and shows them in three places: the menu bar itself, a panel that drops down when you click the status item, and a desktop widget you can leave on screen.
It is built to be genuinely light. A menu bar monitor runs all day, every day, so AirStats holds a few megabytes and a fraction of a percent of one core rather than the tens of megabytes its peers take. It has no Dock icon, and reads the system through Mach, IOKit, sysctl and CoreWLAN.
Download it from airstats.app, open the dmg and drag the app to Applications. It is signed and notarized, so it opens with no warning.
Or with Homebrew:
brew install --cask byrencheema/tap/airstats
AirStats updates itself with Sparkle. It asks airstats.app once a week whether a newer version exists, and installs one only when you say so. Both of those can be turned off in General settings.
You need the Swift 6 toolchain that ships with Xcode 16.
Scripts/build.sh release
cp -R .build/arm64-apple-macosx/release/AirStats.app /Applications/
open /Applications/AirStats.app
Scripts/build.sh wraps the SwiftPM binary in a .app bundle, copies Sparkle.framework
into Contents/Frameworks, and signs it ad hoc. macOS grants a status item only to a
signed bundle with LSUIElement set. Run the script with no argument for a debug build.
An ad-hoc signature is enough to run a build you made yourself, and not enough to travel:
macOS refuses an ad-hoc bundle that arrived over the internet. Scripts/release.sh is what
produces the download above, signing with a Developer ID certificate and stapling Apple's
notarization ticket to the .dmg.
| Path | What lives there |
|---|---|
Sources/AirStatKit | Collectors, the sampling engine, settings, formatting. No UI. |
Sources/AirStatUI | Menu bar drawing, panel, desktop widget, settings window, charts, design system. |
Sources/AirStats | The executable, app delegate, and the probe and render commands. |
Tests/AirStatKitTests | Contract tests for the collectors, plus settings and formatting. |
Scripts/build.sh | Builds the binary and assembles the .app. |
Scripts/release.sh | Signs, notarizes and packages the .dmg that ships. |
Scripts/appcast.py | Writes a release into the appcast Sparkle reads. |
Scripts/benchmark.py | Samples the menu bar monitors on your Mac over one shared window. |
AirStatKit never imports SwiftUI or AppKit, which is what lets the tests and the probe
run in a windowless process.
CONTRIBUTING.md has the checks to run before a pull request and the house rules.
MIT. See LICENSE.
134 commits
Swift
97.1%
Python
1.8%
Shell
1.1%