A simple script to configure macOS system preferences to my liking and install my favorite apps, services and frameworks. Completely refactored in 2026 for macOS Tahoe compatibility and to cover my current stack for useful, productive AI, coding and design work.
On a new Mac, run remotely with one command:
curl -fsSL psb.lol/setup.sh | bashOr from a local clone:
sh setup.shThe script will present a menu with configuration options:
- macOS settings - Configure system preferences and app defaults
- Dock layout - Set up Dock apps and settings
- Development tools - Install Homebrew, Oh My Zsh, Node, pnpm, Python, Claude Code and Mole
- Applications - Install a selectable set of GUI apps via Homebrew Cask
- All of the above - Run everything
You can preview the whole flow without changing anything using --simulate:
sh setup.sh --simulateIf an install appears to hang, run with --verbose (or VERBOSE=1) to stream the installer output live instead of behind a spinner.
The menus, spinner and confirmation prompts are powered by gum. On startup the script shows Getting ready... while it downloads a temporary copy of gum (no Homebrew required) and removes it when it finishes, so it leaves nothing behind. If you already have gum installed, it's used as-is and left untouched.
Configures more reasonable preferences for:
- Finder: Show hidden files, use list view, show path/status bar, show file extensions
- Menu bar: Hide WiFi, Battery, Spotlight, Siri, Focus Modes, Sound and Now Playing
- Screenshots: Save as PNG, disable drop shadows
- Keyboard: Enable key repeat (disable press-and-hold), faster repeat rate
- Trackpad: Faster tracking speed
- General: Expand save/print panels, disable app resume, enable auto-updates
As well as a few app preferences:
- Safari: Disable search suggestions to Apple, set blank homepage, disable password autofill
- Chrome: Disable swipe navigation, disable background mode, expand print dialog
- TextEdit: Use plain text mode with UTF-8 encoding
- Activity Monitor: Show all processes, sort by CPU usage
Clears the default Dock apps and adds your preferred apps in a nice order:
- Finder
- Messages
- Chrome, ChatGPT & Claude
- GitHub Desktop, Ghostty, Cursor & Xcode
- Downloads folder
- Trash
Offers a checklist of dev tools to install — the ones you don't have yet are pre-selected, so you can deselect any you want to skip (↑/↓ to move, space to toggle, enter to confirm):
- Homebrew - Package manager for macOS
- Oh My Zsh - Framework for managing Zsh configuration
- Node - JavaScript runtime
- pnpm - Fast, disk space efficient package manager
- Python - General-purpose programming language
- Claude Code - Fast coding
- Mole - SSH tunnel manager
Offers a checklist of GUI apps to install via Homebrew Cask (↑/↓ to move, space to select, enter to confirm):
- Browsers: Google Chrome, Vivaldi, Firefox
- Dev & AI: Ghostty, Visual Studio Code, Cursor, GitHub Desktop, Claude Desktop, superwhisper
- Design & media: Figma, CleanShot X, ImageOptim
- Productivity: 1Password, Paste, Stats, Dropbox, Flux
- Comms & media: Discord, Zoom, Spotify, Sonos
- Maker / 3D: Bambu Studio, OpenSCAD, Raspberry Pi Imager
The scripts are linted with ShellCheck and tested with bats-core:
brew install bats-core shellcheck
shellcheck setup.sh scripts/*.sh
bats tests/Tests live in tests/ and cover the utils.sh helpers (simulate mode, the install spinner, gum capability detection), setup.sh argument parsing, and the cask list. The interactive prompts are powered by gum and read /dev/tty, so they can't be driven headlessly and aren't unit-tested. Both checks run on every push via GitHub Actions (.github/workflows/ci.yml), which pins the same ShellCheck version used locally.
Years ago, the original inspiration for this came from: