maintaining-macos-defaults

$npx mdskill add obra/homedir-manager/maintaining-macos-defaults

Reconcile macOS GUI settings into version control using tracked preferences

  • Captures and tracks macOS GUI-changed settings for version control
  • Uses homedir-manager's defaults verb with CFPreferences system
  • Filters signal from noise using watched domains and deny patterns
  • Produces drift reports and updates desired state via TSV files

SKILL.md

.github/skills/maintaining-macos-defaultsView on GitHub ↗
---
name: maintaining-macos-defaults
description: Use on demand to reconcile a Mac's GUI-changed settings into version control — when the user says "reconcile my mac defaults", "capture my macOS settings", or after they've changed System Settings and want the keepers tracked. Drives homedir-manager's `defaults` verb (capture/drift/apply) against a versioned desired-state file.
---

# Maintaining macOS defaults

Lets the user drive their Mac through the GUI like a normal person, then fold the settings worth
keeping into a version-controlled file. The judgment — signal vs. noise — is your job; the tool
just reads, diffs, and writes the macOS preferences (CFPreferences) system.

## The data (in the user's dotfiles content repo, deployed to `~/.config/macos-defaults/`)

- `desired.tsv` — the tracked settings: `domain⇥key⇥type⇥value`, sorted. Scalars only
  (bool/int/float/string). This is both what gets applied and the baseline drift diffs against.
- `watched-domains` — one domain per line; the domains `drift` scans for new settings.
- `noise-deny` — glob patterns (matched against key names) that `drift` and whole-domain
  `capture` ignore (window frames, recents, counters, timestamps).

## The on-demand loop

When the user asks to reconcile (after they've changed settings in the GUI):

1. **See what changed:**
   ```sh
   homedir-manager defaults drift ~/.config/macos-defaults/desired.tsv \
     --watched ~/.config/macos-defaults/watched-domains \
     --noise   ~/.config/macos-defaults/noise-deny
   ```
   - `DRIFT  <domain> <key> current=… desired=…` — a tracked setting whose live value changed.
   - `NEW    <domain> <key> current=…` — a setting they changed that isn't tracked yet.

2. **Triage each line.** Keep deliberate preferences; drop noise. A setting is **signal** if a
   person would knowingly choose it (`com.apple.dock autohide`, `…finder ShowPathbar`). It's
   **noise** if it's machine state: window positions, recent-item lists, counters, timestamps,
   last-opened paths, UUIDs. When unsure, lean toward *not* tracking it — and if a noise pattern
   would have caught it, add that pattern to `noise-deny` instead of rejecting it one-off.

3. **Fold keepers into `desired.tsv`** with correct types read live:
   ```sh
   homedir-manager defaults capture com.apple.dock autohide >> ~/.config/macos-defaults/desired.tsv
   ```
   Then keep the file sorted (`sort -o`). For a `DRIFT` (changed tracked value), update the
   existing line instead of appending a duplicate.

4. **Commit** the content repo. Other machines pick it up on `git pull`.

## Applying on another Mac

`apply` writes the tracked settings into the live preferences and restarts Dock/Finder/SystemUIServer:
```sh
homedir-manager defaults apply ~/.config/macos-defaults/desired.tsv
```
Only run this when the user wants that machine to match the tracked state — it changes their live
settings. Some settings need a logout to fully take effect.

## Limits

- Scalars only. Dictionary/array/date/data values are flagged (`SKIP …` on stderr), not written.
- Covers the CFPreferences surface — most of "driving your Mac," but not settings that live in
  sandboxed containers, opaque databases, or need `scutil`/`systemsetup`.
- macOS only.

More from obra/homedir-manager