Mac Setup Guide
A Developer's Playbook
A comprehensive, fork-friendly guide to setting up a new Mac for development. Includes PARA folder structure, dotfiles architecture, automated installers, and step-by-step phases. Customize for your workflow.
Getting Started
How to Fork & Customize This Guide
This is a community guide — fork it, modify it, and make it your own:
- Clone or fork the repository containing these files
- Update the hero section with your name and machine details
- Customize the Brewfile to include your preferred tools and apps
- Modify the PARA structure to match your project organization
- Adjust macOS defaults in the
.macosscript to your preferences - Share your version — your customizations might help others!
Key Customization Points
Brewfile— Add/remove CLI tools and apps for your workflowdotfiles/.zshrc— Add aliases and functions you use daily.macos— Pick defaults that match your preferencesdotfiles/— Add configs for your editor, terminal, etc.- Section 10 — Customize for your development environment (web, Python, Rust, etc.)
Community Editions
This guide structure supports many workflows:
- Web development (Node, npm, webpack)
- Python data science (conda, jupyter)
- Systems engineering (Go, Rust, containers)
- Music production (DAWs, plugins, audio)
- DevOps & infrastructure (Docker, K8s, cloud)
Tip: Keep your customized version in Git so you can replicate your setup on any new Mac.
Architecture
PARA Folder Structure
Everything lives under ~/Desktop/workshop/ using the PARA method.
~/Desktop/workshop/ ├── 01_projects/ # Active, time-bound work ├── 02_areas/ # Ongoing responsibilities ├── 03_resources/ # Reference material & configs │ ├── dotfiles/ # Symlinked config files │ ├── mac-setup/ # Setup scripts (personal + public) │ └── ... └── 04_archive/ # Completed / inactive
Dotfiles
Canonical configs stored in 03_resources/dotfiles/ and symlinked to $HOME via link.sh.
.zshrc— shell config + studiomode.gitconfig— aliases, defaults, pager.gitignore_global— system-wide ignores.editorconfig— cross-editor formattingstarship.toml— prompt theme.wezterm.lua— terminal config
Script Stack
Modular scripts that run in sequence or standalone.
mac-setup.sh— 12-step installerlink.sh— symlink dotfiles.macos— 90+ system defaultsverify.sh— post-setup checks
Data Flow
Migration Pipeline
Dotfile Symlink Flow
link.sh creates symlinks from your home directory back to the repo:
~/.zshrc → ~/Desktop/workshop/03_resources/dotfiles/.zshrc ~/.gitconfig → ~/Desktop/workshop/03_resources/dotfiles/.gitconfig ~/.gitignore_global → ~/Desktop/workshop/03_resources/dotfiles/.gitignore_global ~/.editorconfig → ~/Desktop/workshop/03_resources/dotfiles/.editorconfig ~/.config/starship.toml → .../dotfiles/starship.toml
Backup Strategy
Time Machine
Full system backup to external drive. Automatic hourly when connected.
- Verify backup currency before any migration
- Keep at least 2 recent backups
Git Repos
All code and configs pushed to GitHub. Dotfiles in a private repo, setup scripts in a public one.
- Run
pre-migrate.shto audit repo health - Verify all repos have clean working trees
Pre-Migration Export
Run on the Old Machine
The pre-migrate.sh script exports everything you'll need. Run it before wiping or shelving the old machine.
chmod +x backup.sh && ./backup.sh
It performs 9 steps:
| Step | Action | Output |
|---|---|---|
| 1 | Homebrew snapshot | Brewfile.old |
| 2 | SSH keys + config | ssh-keys/ |
| 3 | GPG keys (if any) | gpg-keys/ |
| 4 | Git repo health audit | Dirty repos flagged |
| 5 | App preferences | Raycast, VS Code, terminals |
| 7 | macOS settings snapshot | Key defaults exported |
| 8 | Backup status | Time Machine verification |
| 9 | Summary + bundle | ~/Desktop/migration-export/ |
Phase 1 · Foundation
Steps 1–4 of mac-setup.sh
# 1. Install Xcode Command Line Tools
xcode-select --install
# 2. Install Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 3. Create PARA folder structure
mkdir -p ~/Desktop/workshop/{01_projects,02_areas,03_resources,04_archive}
# 4. Install Brewfile packages
brew bundle --file=./Brewfile
Brewfile Categories
| Group | Packages |
|---|---|
| Shell & navigation | starship, zoxide, fzf |
| Dev tooling | git, git-lfs, gh, mise |
| Modern CLI | bat, eza, ripgrep, fd, jq, tree, tldr, htop |
| GNU utils | coreutils, gnu-sed |
| File & media | wget, imagemagick, rename, pigz, p7zip, moreutils |
| Automation | mas, fswatch |
Phase 2 · Dev Environment
Steps 5–6: Dotfiles & Runtimes
# 5. Symlink dotfiles cd ~/Desktop/workshop/03_resources/dotfiles && chmod +x link.sh && ./link.sh # 6. Install runtimes via Mise mise use --global node@20 mise use --global python@3.12
link.sh handles all symlinks to your dotfiles, keeping your configs in version control and easy to maintain.
Git Configuration
The symlinked .gitconfig includes:
push.autoSetupRemote = true— no more--set-upstreampull.rebase = true— clean linear historycore.pager = bat— syntax-highlighted diffscore.excludesFile = ~/.gitignore_global— system-wide ignores- 20+ aliases:
git st,git lg,git sync, etc.
Global Gitignore
.gitignore_global covers OS files, editor artifacts, secrets, and project-specific temp files:
.DS_Store .env, .env.local node_modules/, __pycache__/ .idea/, .vscode/settings.json *.tmp, *.bak # Project-specific temp files credentials/, secrets/ *.pem, *.key
EditorConfig
.editorconfig ensures consistent formatting across all editors:
| File Type | Indent | Special |
|---|---|---|
| Default (*) | 2 spaces | UTF-8, LF, trim whitespace |
| Python (.py) | 4 spaces | — |
| Shell (.sh) | 4 spaces | — |
| Makefile | Tabs | Required by make |
| Markdown (.md) | 2 spaces | Preserve trailing whitespace |
Phase 3 · Applications
Steps 7–9: macOS Defaults, SSH, Apps
# 7. Apply macOS defaults (90+ settings) chmod +x .macos && ./.macos # 8. Generate SSH key ssh-keygen -t ed25519 -C "you@example.com" eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_ed25519 gh ssh-key add ~/.ssh/id_ed25519.pub # 9. Install GUI apps (manual) # VS Code, Raycast, WezTerm, CleanShot X, Figma, etc.
Manual App Setup
- Raycast — import settings from backup
- VS Code — Settings Sync via GitHub account
- CleanShot X — Setapp or license, configure screenshot folder
Phase 4 · Personalize
Steps 10–12: Automation & Verification
# 10. Set up folder actions (interactive) ./folder-actions.sh setup # 11. Complete setup verification chmod +x verify.sh && ./verify.sh # 12. Run verification chmod +x verify.sh && ./verify.sh
macOS Defaults
90+ System Settings via .macos
Based on Mathias Bynens' dotfiles and webpro's collection, curated for music production and development. Organized into 16 categories:
Input & Keyboard
- Fast key repeat (KeyRepeat: 2)
- Short initial delay (15)
- Disable auto-correct
- Disable smart quotes & dashes
- Full keyboard access in dialogs
Finder
- Show all extensions
- Show hidden files
- Show path bar & status bar
- List view default
- Search current folder
- Disable .DS_Store on network/USB
Dock & Mission Control
- Auto-hide Dock
- Minimize to application
- Don't rearrange Spaces
- Fast hide/show animation
- Hot corners configured
Screenshots
- Save to
~/Screenshots - PNG format
- Disable floating thumbnail
- No shadow on window captures
Security & Privacy
- Firewall enabled
- FileVault check
- Require password after sleep
- Lock screen message with contact
Terminal Customization
Shell Environment
Customize your shell with a .zshrc, aliases, and functions:
# Essential aliases for development alias ll='ls -lah' alias gs='git status' alias gc='git commit' alias gp='git push' alias np='npm' alias py='python3' alias reload='exec zsh'
Prompt & Theme
Install Oh My Zsh or Starship for a modern prompt experience. Both are included in the Brewfile.
- Oh My Zsh — Framework with plugins (git, node, npm, etc.)
- Starship — Fast, minimal, language-aware prompt
- Nerd Fonts — Install for icon support (already in Brewfile)
Key Bindings & Plugins
| Tool | Purpose |
|---|---|
| fzf | Fuzzy file search in shell |
| zoxide | Smart directory jumping |
| ripgrep (rg) | Fast text search |
| bat | cat with syntax highlighting |
| exa | Modern ls replacement |
Automation & Workflows
Keyboard Shortcuts
macOS Keyboard Shortcuts can automate common tasks. Set these up in System Settings > Keyboard > Shortcuts:
- Open Terminal in current Finder directory
- Quick screenshot to file
- Toggle dark mode
- Launch favorite apps with custom shortcuts
Scripting & Automation
Create shell scripts in ~/bin for repeated tasks:
# Example: backup-projects.sh #!/bin/bash tar -czf ~/backups/projects-$(date +%Y%m%d).tar.gz ~/Projects/ echo "Backup complete"
Launchd for Scheduled Tasks
Use launchd to run scripts on a schedule:
- Daily syncs or backups
- Periodic cleanup tasks
- Scheduled deployments
- Reference:
~/Library/LaunchAgents
Keyboard Shortcuts
Shell Aliases & Git Shortcuts
| Command | Action |
|---|---|
git st | Short status |
git lg | Pretty graph log (20 entries) |
git sync | Pull rebase + push |
git cb <name> | Create and checkout branch |
git df | Diff working tree |
git ds | Diff staged changes |
git whoami | Show git identity |
git cleanup | Delete merged branches |
studiomode on | Activate studio mode |
studiomode off | Deactivate studio mode |
fzf Keybindings
| Shortcut | Action |
|---|---|
Ctrl+R | Fuzzy search command history |
Ctrl+T | Fuzzy search files |
Alt+C | Fuzzy search and cd into directory |
Troubleshooting
Common Issues
| Problem | Solution |
|---|---|
| macOS defaults not taking effect | Log out and log back in. Some require killall Finder / killall Dock |
| Homebrew permissions error | sudo chown -R $(whoami) /opt/homebrew |
| Symlink shows as regular file | Delete the file, then re-run link.sh |
| fzf keybindings not working | /opt/homebrew/opt/fzf/install |
| Folder actions not starting | Check fswatch is installed: brew install fswatch |
| Mise runtime not found | Ensure eval "$(mise activate zsh)" is in .zshrc |
Verification
Post-Setup Verification
Run verify.sh after completing the setup to check everything is working. It tests 10 categories:
chmod +x verify.sh && ./verify.sh
Check Categories
- CLI tools from Brewfile (20+ tools)
- Symlinks (.zshrc, .gitconfig, etc.)
- Git configuration (name, email, excludes)
- Shell tool initialization (fzf, Mise)
- SSH keys and config
- PARA folder structure
- macOS defaults (spot checks)
- Audio production settings
- Summary with pass/fail/warn counts
Expected Results
On a clean setup you should see:
- All CLI tools installed
- All symlinks valid
- Git configured correctly
- SSH key present
- Folders created
- Some macOS defaults may need logout
Quick Health Check
# One-liner to check the essentials command -v brew && command -v git && command -v starship && \ test -L ~/.zshrc && test -L ~/.gitconfig && \ echo "✓ Core setup OK" || echo "✗ Something's missing"