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.

macOS 14+·Last updated 2026
00

Getting Started

How to Fork & Customize This Guide

This is a community guide — fork it, modify it, and make it your own:

  1. Clone or fork the repository containing these files
  2. Update the hero section with your name and machine details
  3. Customize the Brewfile to include your preferred tools and apps
  4. Modify the PARA structure to match your project organization
  5. Adjust macOS defaults in the .macos script to your preferences
  6. Share your version — your customizations might help others!

Key Customization Points

  • Brewfile — Add/remove CLI tools and apps for your workflow
  • dotfiles/.zshrc — Add aliases and functions you use daily
  • .macos — Pick defaults that match your preferences
  • dotfiles/ — 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.

01

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 formatting
  • starship.toml — prompt theme
  • .wezterm.lua — terminal config

Script Stack

Modular scripts that run in sequence or standalone.

  • mac-setup.sh — 12-step installer
  • link.sh — symlink dotfiles
  • .macos — 90+ system defaults
  • verify.sh — post-setup checks
02

Data Flow

Migration Pipeline

Old Mac
pre-migrate.sh
Export Bundle
New Mac
mac-setup.sh
verify.sh

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
03

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.sh to audit repo health
  • Verify all repos have clean working trees

04

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:

StepActionOutput
1Homebrew snapshotBrewfile.old
2SSH keys + configssh-keys/
3GPG keys (if any)gpg-keys/
4Git repo health auditDirty repos flagged
5App preferencesRaycast, VS Code, terminals
7macOS settings snapshotKey defaults exported
8Backup statusTime Machine verification
9Summary + bundle~/Desktop/migration-export/
05

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

GroupPackages
Shell & navigationstarship, zoxide, fzf
Dev toolinggit, git-lfs, gh, mise
Modern CLIbat, eza, ripgrep, fd, jq, tree, tldr, htop
GNU utilscoreutils, gnu-sed
File & mediawget, imagemagick, rename, pigz, p7zip, moreutils
Automationmas, fswatch
06

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-upstream
  • pull.rebase = true — clean linear history
  • core.pager = bat — syntax-highlighted diffs
  • core.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 TypeIndentSpecial
Default (*)2 spacesUTF-8, LF, trim whitespace
Python (.py)4 spaces
Shell (.sh)4 spaces
MakefileTabsRequired by make
Markdown (.md)2 spacesPreserve trailing whitespace
07

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
08

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

09

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
10

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

ToolPurpose
fzfFuzzy file search in shell
zoxideSmart directory jumping
ripgrep (rg)Fast text search
batcat with syntax highlighting
exaModern ls replacement
11

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

12

Keyboard Shortcuts

Shell Aliases & Git Shortcuts

CommandAction
git stShort status
git lgPretty graph log (20 entries)
git syncPull rebase + push
git cb <name>Create and checkout branch
git dfDiff working tree
git dsDiff staged changes
git whoamiShow git identity
git cleanupDelete merged branches
studiomode onActivate studio mode
studiomode offDeactivate studio mode

fzf Keybindings

ShortcutAction
Ctrl+RFuzzy search command history
Ctrl+TFuzzy search files
Alt+CFuzzy search and cd into directory
13

Troubleshooting

Common Issues

ProblemSolution
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
14

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

  1. CLI tools from Brewfile (20+ tools)
  2. Symlinks (.zshrc, .gitconfig, etc.)
  3. Git configuration (name, email, excludes)
  4. Shell tool initialization (fzf, Mise)
  5. SSH keys and config
  6. PARA folder structure
  7. macOS defaults (spot checks)
  8. Audio production settings
  9. 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"

A community guide for Mac setup · 2026