macOS Setup - Update-Watcher on macOS
Update-Watcher runs on macOS for monitoring Homebrew packages and native macOS software updates. The macOS setup is simpler than Linux since most checkers do not require elevated permissions or a dedicated system user.
Configuration Location
On macOS, the configuration file is stored in the user config directory:
~/.config/update-watcher/config.yamlCreate the directory if it does not exist:
mkdir -p ~/.config/update-watcherThe setup wizard (update-watcher setup) creates this directory and file automatically.
Available Checkers on macOS
Two checkers are specific to macOS:
macOS Software Updates
The macos checker uses the native softwareupdate command to detect available system updates, including macOS version upgrades, security patches, and Safari updates.
update-watcher watch macosFor security-only filtering:
update-watcher watch macos --security-onlyNo sudo is required. The softwareupdate --list command runs without elevated permissions.
Homebrew
The homebrew checker detects outdated Homebrew formulae and casks:
update-watcher watch homebrewTo skip cask (GUI application) updates and only report formulae:
update-watcher watch homebrew --no-casksNo sudo is required. Homebrew runs entirely under the current user.
When to Use Which
| Scenario | Recommended Checkers |
|---|---|
| macOS workstation with Homebrew | macos + homebrew |
| macOS server (no Homebrew) | macos only |
| Homebrew-only monitoring | homebrew only |
| CI runner with Homebrew | homebrew (macOS checker may be noisy on CI) |
Other Checkers
The following checkers also work on macOS without modification:
- docker – If Docker Desktop is installed.
- wordpress – If WordPress sites are accessible on the local filesystem.
- webproject – If web projects with npm, yarn, pnpm, or Composer are present.
- distro – Not applicable on macOS (only checks Linux distributions).
- openclaw – Works on macOS.
Example Configuration
A typical macOS configuration:
hostname: "macbook-pro"
watchers:
- type: macos
- type: homebrew
- type: docker
notifiers:
- type: slack
options:
webhook_url: "${SLACK_WEBHOOK_URL}"
settings:
send_policy: "only-on-updates"Scheduling
Using install-cron
The simplest way to schedule daily checks on macOS:
update-watcher install-cron --time 09:00This creates an entry in the user’s crontab. Verify with:
crontab -lUsing launchd
macOS uses launchd as its native scheduling system. While cron works on macOS, a launchd plist is the “macOS-native” approach and handles sleep/wake correctly (running missed jobs when the machine wakes up).
Create a plist file at ~/Library/LaunchAgents/com.update-watcher.daily.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.update-watcher.daily</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/update-watcher</string>
<string>run</string>
<string>--quiet</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/tmp/update-watcher.log</string>
<key>StandardErrorPath</key>
<string>/tmp/update-watcher.err</string>
</dict>
</plist>Load the plist:
launchctl load ~/Library/LaunchAgents/com.update-watcher.daily.plistVerify it is loaded:
launchctl list | grep update-watcherTo unload:
launchctl unload ~/Library/LaunchAgents/com.update-watcher.daily.plistCron vs launchd
launchd is the better choice since it catches up on missed runs. For always-on Mac Minis or CI runners, cron works well.| Feature | cron | launchd |
|---|---|---|
| Setup | One command (install-cron) | Manual plist creation |
| Missed jobs | Not re-run after sleep | Re-runs missed jobs on wake |
| macOS native | Legacy but functional | Recommended by Apple |
| Removal | uninstall-cron | Manual launchctl unload |
Permissions
Most macOS checkers require no special permissions:
softwareupdate --listruns as the current user.brew outdatedruns as the current user.- Docker Desktop manages its own socket permissions.
No sudoers configuration is needed for a standard macOS setup.
Related
- Linux Server Setup – Production-ready Linux server setup.
- Cron Scheduling – Detailed cron scheduling guide.
- Homebrew Checker – Full documentation for the Homebrew checker.
- macOS Checker – Full documentation for the macOS software update checker.