Monitor your Mac's health, security and hardware from the terminal — battery alerts, live dashboard, security audit and dev-tooling inventory.
Project description
Mac Manager
Monitor your Mac's health, security and hardware from the terminal — battery alerts, live dashboard, security audit and dev-tooling inventory.
A Python CLI to monitor and take care of your MacBook (Apple Silicon) right from the terminal — battery, system, disk, network — with a live dashboard, automatic daily logging, and native notifications to preserve battery health.
Designed for Apple Silicon MacBook Air/Pro. It also works on Intel, but some metrics (battery capacity, etc.) may vary.
Installation
Homebrew (recommended, once v0.1.0 is released)
brew install armelingu/tap/mac-manager
The Homebrew tap lives at armelingu/homebrew-tap. The formula is already wired but pinned to a placeholder version — it starts working as soon as the first Mac Manager release lands.
pip / pipx (once published to PyPI)
pipx install mac-manager # isolated, recommended
# or
pip install --user mac-manager
From source (works today)
git clone https://github.com/armelingu/mac-manager.git
cd mac-manager
./install.sh
This will:
- create a local
venvin.venv/ - install
richandpsutil - create the symlink
~/.local/bin/mm - register two
launchdagents:- daily log at 09:00 → writes a snapshot to
logs/battery.csv - battery alerts every 15 min → native macOS notification
- daily log at 09:00 → writes a snapshot to
Make sure ~/.local/bin is in your PATH:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
Commands
For the complete reference for each command (description, options, when to use, examples), see COMMANDS.md.
Hardware and system
| Command | What it does |
|---|---|
mm |
General status (battery + system + disk + network) |
mm battery |
Charge, health, cycles, temperature, power source |
mm health |
CPU, RAM, memory pressure, top 5 processes |
mm disk |
Disk usage + local snapshots + cleanup candidates |
mm clean |
Lists what can be cleaned (deletes nothing) and shows the commands |
mm net |
Local/public IPs, SSID, Wi-Fi signal |
mm doctor |
0-100 score with automatic recommendations |
mm watch |
Live dashboard (Ctrl+C to exit) |
Battery — history
| Command | What it does |
|---|---|
mm log |
Writes a battery snapshot to the CSV |
mm history -n 20 |
Last N recorded measurements |
mm alerts |
Runs the alert check (called by launchd) |
Security
| Command | What it does |
|---|---|
mm security |
Audits FileVault, SIP, Firewall, Gatekeeper, pending updates, LaunchAgents, remote SSH, XProtect and provides a 0-100 score |
Development
| Command | What it does |
|---|---|
mm dev |
Lists installed languages, package managers, devops, editors and CLIs — with version and path |
mm dev --all |
Also shows known tools that are not installed |
mm dev --check |
Lists outdated packages in Homebrew, global npm, pip and Mac App Store |
Smart alerts
To preserve the lithium-ion battery (every cycle counts!), the agent checks every 15 min and fires a notification:
- ≥ 80% charging → "consider unplugging" (every 2h)
- ≤ 20% on battery → "good time to plug in" (every 30min)
- ≤ 10% on battery → critical alert (every 10min)
- health < 80% → 1x per week
History
Every day at 9 AM, a snapshot is written to logs/battery.csv:
timestamp,percent,is_charging,power_source,cycle_count,max_capacity_mah,design_capacity_mah,health_percent,temperature_c
2026-04-19T09:00:01,82,1,AC Power,12,4350,4380,99.3,30.5
In a few months you can plot the real degradation of your Mac.
Structure
mac-manager/
├── mm # entrypoint (bash → venv python)
├── macmanager/
│ ├── cli.py # dispatcher
│ ├── ui.py # UI helpers
│ ├── battery.py # ioreg + pmset
│ ├── system.py # CPU/RAM/processes via psutil
│ ├── disk.py # usage + snapshots + cleanup
│ ├── network.py # Wi-Fi + IPs
│ ├── notify.py # osascript notifications
│ ├── logger.py # CSV history
│ ├── doctor.py # score + tips
│ ├── alerts.py # notification rules
│ ├── security.py # security audit (mm security)
│ ├── dev.py # dev tooling inventory (mm dev)
│ └── watch.py # live dashboard
├── launchd/
│ ├── com.macmanager.battery-log.plist
│ └── com.macmanager.battery-alert.plist
├── logs/
├── install.sh
├── uninstall.sh
└── requirements.txt
Uninstallation
./uninstall.sh
Removes launchd agents, symlink and venv. Preserves the CSVs in logs/.
Status
Mac Manager is currently in alpha: the public CLI surface is stabilizing,
breaking changes can still happen between 0.x releases without a deprecation
window. Once we ship 1.0.0, every breaking change will follow
Semantic Versioning and a deprecation cycle.
Changelog
All notable changes are documented in CHANGELOG.md, following the Keep a Changelog format.
Releasing
Maintainers: see RELEASING.md for the full release runbook (SemVer policy, version bump, tagging and the tag-driven GitHub Actions pipeline that builds artifacts and cuts a GitHub Release automatically — PyPI publication is wired with Trusted Publishing and can be activated by flipping a single flag).
Contributing
Contributions are very welcome — whether it's a bug report, a feature request or a pull request. Please read the contribution guide before opening anything:
- 📖 CONTRIBUTING.md — how to set up a dev environment, coding style, commit conventions and PR workflow.
- 🛡️ SECURITY.md — how to responsibly report a vulnerability.
- 🤝 CODE_OF_CONDUCT.md — what we expect from everyone participating in this project.
The files above are being added incrementally; until each one lands, please open an issue on GitHub for anything you'd like to discuss.
License
Copyright © 2026 Gustavo Armelin.
This project is released under the Apache License 2.0 — a
permissive license that allows commercial use, modification, distribution
and private use, with patent protection. See NOTICE for the
required attribution and the third-party licenses bundled at runtime.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mac_manager-0.1.1.tar.gz.
File metadata
- Download URL: mac_manager-0.1.1.tar.gz
- Upload date:
- Size: 42.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
975da708c2a6a510c85030bb1db0f1d4815129f34f00c93fa77edf15ddf0fd74
|
|
| MD5 |
365abbc661c2fbcf213d5d6a21d3ef2e
|
|
| BLAKE2b-256 |
73c40a1b3a6ad294f5c41850e1cf68d06fa62f577b8f9200e07260dd55a17639
|
Provenance
The following attestation bundles were made for mac_manager-0.1.1.tar.gz:
Publisher:
release.yml on armelingu/mac-manager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mac_manager-0.1.1.tar.gz -
Subject digest:
975da708c2a6a510c85030bb1db0f1d4815129f34f00c93fa77edf15ddf0fd74 - Sigstore transparency entry: 1357180078
- Sigstore integration time:
-
Permalink:
armelingu/mac-manager@2b5eea5bff6b1ab1f1d9d190880cfe408513ee26 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/armelingu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2b5eea5bff6b1ab1f1d9d190880cfe408513ee26 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mac_manager-0.1.1-py3-none-any.whl.
File metadata
- Download URL: mac_manager-0.1.1-py3-none-any.whl
- Upload date:
- Size: 36.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
615150f35bbda07d9f06647a166d069a6d1b9426f476a2ada34b6887bef8ede7
|
|
| MD5 |
76e6deda0d21e0b1c5bad16ace4c210e
|
|
| BLAKE2b-256 |
9aac40b38b38f8b7b4acffacb7c5994ebeef0126774f53a993bcf72383d61b36
|
Provenance
The following attestation bundles were made for mac_manager-0.1.1-py3-none-any.whl:
Publisher:
release.yml on armelingu/mac-manager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mac_manager-0.1.1-py3-none-any.whl -
Subject digest:
615150f35bbda07d9f06647a166d069a6d1b9426f476a2ada34b6887bef8ede7 - Sigstore transparency entry: 1357180098
- Sigstore integration time:
-
Permalink:
armelingu/mac-manager@2b5eea5bff6b1ab1f1d9d190880cfe408513ee26 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/armelingu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2b5eea5bff6b1ab1f1d9d190880cfe408513ee26 -
Trigger Event:
push
-
Statement type: