macOS maintenance CLI — updates, cleanup, and system maintenance
Project description
macmaint
A macOS maintenance CLI that keeps your system clean and up-to-date with a single command.
Run macmaint to update Homebrew packages, the Mac App Store, uv-managed tools, clear caches,
trim log files, vacuum Mail.app, flush DNS, and show you which apps you haven't opened in months.
Everything is idempotent and safe to run as a daily cron job. Use --dry-run to preview every
action before it executes.
Install
uv tool install macmaint
Or with pipx:
pipx install macmaint
Prerequisites
| Requirement | Notes |
|---|---|
| macOS 13 Ventura or later | macOS-only by design |
| Python 3.13+ | Installed automatically by uv/pipx |
| Homebrew | Optional — needed for update and cleanup brew tasks |
| mas | Optional — brew install mas for App Store updates |
| uv | Optional — for uv tool upgrade --all in update |
| bun | Optional — for bun update -g (global JS CLIs installed via bun) in update |
| npm | Optional — for npm update -g (global JS CLIs like @openai/codex) in update and npm cache cleanup in cleanup |
| Docker | Optional — cleanup prunes this if available |
Quick start
# Check which tools are wired up on your machine
macmaint doctor
# Preview all maintenance tasks without executing anything
macmaint --dry-run
# Run everything
macmaint
Subcommands
| Command | What it does |
|---|---|
macmaint update |
Homebrew update/upgrade/cleanup + Mac App Store upgrades + uv tool upgrade --all + bun update -g + npm update -g |
macmaint cleanup |
Empty trash, clear user caches, purge pip/npm/uv caches, remove Xcode DerivedData, prune Docker, delete old logs |
macmaint maintenance |
Flush DNS cache, vacuum Mail.app envelope index, repair user permissions, rebuild Spotlight index, free APFS purgeable space |
macmaint apps |
Show all installed apps sorted by last used date (GUI apps, Homebrew formulae, Steam games) |
macmaint doctor |
Check which optional tools are available and what macmaint can do |
Common flags
# Preview mode — show what would run, no changes
macmaint --dry-run
macmaint cleanup --dry-run
# Skip specific tasks
macmaint update --no-brew # skip Homebrew
macmaint update --no-mas # skip App Store
macmaint update --no-uv-tools # skip uv tool upgrade --all
macmaint update --no-bun # skip bun update -g
macmaint update --no-npm-globals # skip npm update -g
macmaint cleanup --no-caches # skip user caches
macmaint cleanup --no-docker # skip Docker prune
# App usage filtering
macmaint apps --days 90 # highlight apps unused for 90+ days
macmaint apps --unused # show only unused apps
macmaint apps --size # include disk footprint column
Configuration
Create ~/.config/macmaint/config.toml to override defaults. All keys are optional.
[cleanup]
# Which cache directories under ~/Library/Caches/ to clear.
# Defaults to a curated safe list (Safari, Chrome, VSCode, JetBrains IDEs, etc.)
cache-allowlist = [
"com.apple.Safari",
"com.google.Chrome",
"com.apple.WebKit.WebContent",
"pip",
"com.spotify.client",
"com.microsoft.VSCode",
"com.jetbrains.intellij",
"PyCharm",
"CLion",
"Rider",
"WebStorm",
"DataGrip",
]
# Remove log files older than this many days from ~/Library/Logs/
# Default: 7
log-retention-days = 7
[apps]
# Glob patterns for Steam library volumes to scan in addition to ~/Library.
# Default: ["/Volumes/*"]
steam-volumes = ["/Volumes/*"]
Caveats
-
Mac App Store (
mas upgrade) requires sudo. macmaint runssudo mas upgrade; you will be prompted for your password. This is a mas limitation. -
macmaint appsuses the Screen Time database (knowledgeC.db) for last-used dates. This database is protected by macOS privacy controls. For accurate results, grant Full Disk Access to the terminal app running macmaint (System Settings → Privacy & Security → Full Disk Access). Without access, macmaint falls back to Spotlight metadata, which is less accurate. -
macmaint apps --sizeis slow for large app libraries. It runsduon each app bundle plus associated Library directories. Expect 30–120 seconds for 100+ apps. -
macOS-only. macmaint uses macOS-specific tools (
mdls,tmutil,dscacheutil,diskutil,sqlite3) and will not run on Linux or Windows.
License
MIT — see LICENSE.
Project details
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 macmaint-2026.4.7.tar.gz.
File metadata
- Download URL: macmaint-2026.4.7.tar.gz
- Upload date:
- Size: 40.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e441d8c453b14840551f7917f9d335e3ad97dd5f8af162c1f973a70a82799f3
|
|
| MD5 |
30db563eab02e52722668519f0c8e83c
|
|
| BLAKE2b-256 |
2106c677d0952a580fc2b0cde91e8ee523bc84aef5f757b3b4fb072c3aab98de
|
File details
Details for the file macmaint-2026.4.7-py3-none-any.whl.
File metadata
- Download URL: macmaint-2026.4.7-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4dcc6f6cb2ee1424a17bafdbdcf5e41cc0091df55def7155448331d4776e8b23
|
|
| MD5 |
6e4243bc3c1fff1c7688f8e71a465e4b
|
|
| BLAKE2b-256 |
ff6bb3f885e32f56a81b3afca935475248d91830150b8ef108b8d6963eaa0bbb
|