# Mac setup design — 2026-09-15 Design for turning the stock MacBook Pro (16" 2021 M1 Pro, macOS 26.2 Tahoe) into a quiet, Linux-feeling, Ableton-first machine, managed over SSH from steel141. Inventory baseline: `../reference/inventory-2026-09-15.md`. ## Goals (priority order) 1. Ableton Live 12 runs clean: no sleep/App Nap/notifications mid-session, project files never touched by cloud sync, backed up to tank. 2. Feels like Linux to a bash user: GNU userland unprefixed, `ip a` works, kitty, bash 5, fast key repeat, no press-and-hold accents, window snapping. 3. Stock macOS noise off: Dock stripped, Spotlight web/Siri suggestions off, Photos analysis / Game Center / Handoff / iPhone Mirroring / Screen Time off. 4. Homelab reachable: tank over SMB, ssh aliases, Gitea, Tailscale. ## Non-goals - Disabling SIP, Gatekeeper, or FileVault. All stay on. - Removing anything under `/System/Applications` (sealed volume). Hide from Dock only. - Swapping Cmd<->Ctrl globally. Live's shortcuts are Cmd-native on Mac. - yabai (needs partial SIP disable). Tiling is AeroSpace if wanted later; Rectangle now. - Running samples/projects off the SMB share. Local disk only; SMB is a source to copy from. - Time Machine (over SMB it's fragile and backs up the whole disk; rsync of the folders that matter is simpler and Linux-familiar). ## Decisions taken in this design (defaults — override in DECISIONS.md) | Fork | Choice | Why | |---|---|---| | Login shell | Homebrew bash 5, set via `chsh` after adding to `/etc/shells` | Seth's steel141 shell is bash; macOS ships bash 3.2. zsh stays installed. | | Cmd/Ctrl | Untouched | Live + every Mac tutorial assume Cmd. kitty handles Ctrl+Shift+C/V itself. | | Window snapping | Rectangle (Homebrew cask) | Zero-config snapping. Upgrade path: AeroSpace if tiling turns out to matter. | | Backup | launchd user agent -> `rsync -a --delete` of `~/Music/Ableton` and `~/Documents` to `pve173:/tank/backups/mac/` nightly over SSH | Transparent, one file, restorable with plain rsync. Needs a Mac->pve173 SSH key. | | Hostname | **PARAMETER — not yet chosen** | Seth names machines (`bebop`, `yoga`, `steel141`). `setup.sh` takes it as `HOSTNAME=`. | | iCloud | Account stays (Find My, Keychain). iCloud Drive "Desktop & Documents" sync OFF | Sync mid-save corrupts/evicts DAW project files. GUI-only toggle -> manual checklist. | | Spotlight | Indexing stays ON; Siri Suggestions + web results OFF | Finder search still useful; Live's browser has its own index. | ## Components All live in `~/bin/mac/`. Pushed to `git.sethpc.xyz/Seth/mac`. Applied by `ssh mac` from steel141 (seth is the console user, so `defaults write` + `killall Dock/Finder/SystemUIServer` take effect from an SSH session). ### `Brewfile` Single manifest, applied with `brew bundle --file=Brewfile`. Contents: - Formulae: `bash coreutils findutils gnu-sed grep gawk gnu-tar iproute2mac tmux htop ripgrep fd jq wget rsync git tree` - Casks: `kitty rectangle tailscale` - NOT in Brewfile: Ableton Live (licensed download from ableton.com, manual). ### `scripts/setup.sh` Idempotent bash, `set -euo pipefail`, run on the Mac as seth. Sections, in order: 1. **preflight** — refuse if not arm64 macOS 26.x; require `HOSTNAME` env var; `xcode-select --install` if CLT missing (blocks on a GUI prompt the first time — documented). 2. **backup** — for each `defaults` domain about to be written, `defaults export ~/.mac-setup-backup/-.plist` (skip if domain absent). Also `pmset -g custom` and `launchctl print gui/$UID` to the same dir. This dir is rsync'd back to `~/bin/mac/.backup/` by the runner on steel141. 3. **brew** — install Homebrew if missing; `brew bundle`; write shellenv + gnubin PATH block into `~/.bash_profile` (guarded by marker comments so re-runs don't duplicate). 4. **shell** — add `/opt/homebrew/bin/bash` to `/etc/shells` if absent; `chsh -s` if current shell differs. 5. **hostname** — `scutil --set ComputerName/LocalHostName/HostName $HOSTNAME`. 6. **defaults (Linux feel)** — key repeat `KeyRepeat=2 InitialKeyRepeat=15`; `ApplePressAndHoldEnabled=false`; natural scrolling off; Finder: path bar, status bar, all extensions, `~` as new-window target, list view, no `.DS_Store` on network/USB volumes; no window animations (`NSAutomaticWindowAnimationsEnabled=false`); hot corners cleared. 7. **defaults (debloat)** — Dock: autohide, no recents, `persistent-apps` rewritten to Finder/kitty/Live/System Settings (Live entry only if `/Applications/Ableton Live 12*.app` exists); Spotlight Siri suggestions off; Game Center + Handoff (`NSUserActivityTrackingEnabled`) + Screen Time related agents disabled with `launchctl disable gui/$UID/