My Comprehensive macOS Development Setup

Recently, I bought a new M1 MacBook Pro after using Intel MacBooks for the last 10 years. Within the first few days of using it, I was immediately hooked. It is, by far, the best computer I’ve owned in my professional and personal life. I wanted to set this up completely from scratch, without using the migration assistant or importing from a backup. This felt like a good time to codify some of the settings and applications I use and recommend to other folks. So, here’s a look at my comprehensive macOS development setup.

During setup, I sign in with my iCloud account to sync contacts, messages, and calendar events. I enable touch ID and disable Siri.

First Steps

Immediately, I copy a few key files from my previous computer.

  • .zshrc, .zprofile, .zshenv, .history
  • ~/.aws/
  • ~/.vimrc
  • ~/.gitconfig

Note: It’s nice to skip all of the git config --global setup here, but otherwise you may need to specify things like user.name, user.email, pull.ff, and alias (among others).

  • ~/.ssh/ (I shouldn’t do this, but it’s easier than updating my SSH keys everywhere. I cycle these after I’ve finished setting up, but this is one less step during this process.)
  • ~/bin/ (a collection of scripts I’ve written, also included in my $PATH)

Next, I download a few key applications from the internet:

Some of the above may be available in Homebrew Cask, but I don’t mind downloading them by hand.

Homebrew

brew install \
  wget \
  exa \
  nodenv \
  direnv \
  fasd \
  fzf \
  shellcheck \
  tldr \
  jq \
  fd \
  neovim \
  ripgrep \
  tmux \
  up \
  yarn \
  telnet \
  git-extras

Note: Some of these have prompts at the end for additional installation instructions. One in particular is fzf:

  • add set rtp+=/opt/homebrew/opt/fzf to .vimrc
  • run /opt/homebrew/opt/fzf/install to install keybindings, autocomplete, and history search

macOS settings

Keyboard

  • Set to fastest “Key Repeat”
  • Set to shortest “Delay Until Repeat”
  • Use Modified Keys -> Remap “Caps Lock” to “Control”
  • Add new Colemak input source, can switch between with Control + Option + Space
  • Disable Use smart quotes and dashes
  • Disable curly quotes, use " and '
  • Use F1, F2, etc. keys as standard function keys
  • Disable Capitalize word automatically
  • Disable Add period with double-space

Trackpad

  • Tap to click

Accessibility

  • Zoom > Enable Use scroll gesture with modifier keys to zoom
  • Pointer Control > Trackpad Options > Enable Dragging > Three Finger Drag

Dock

  • Turn hiding on
  • Set size to ~20%

System settings

(thank you @mathiasbynens!)

# Finder: allow quitting via ⌘ + Q; doing so will also hide desktop icons
defaults write com.apple.finder QuitMenuItem -bool true

# Finder: show hidden files by default
defaults write com.apple.finder AppleShowAllFiles -bool true

# Finder: show all filename extensions
defaults write NSGlobalDomain AppleShowAllExtensions -bool true

# Finder: show status bar
defaults write com.apple.finder ShowStatusBar -bool true

# Finder: show path bar
defaults write com.apple.finder ShowPathbar -bool true

# Disable the warning when changing a file extension
defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false

# Avoid creating .DS_Store files on network or USB volumes
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true

# Show the ~/Library folder
chflags nohidden ~/Library && xattr -d com.apple.FinderInfo ~/Library

# Show the /Volumes folder
sudo chflags nohidden /Volumes

# Disable press-and-hold for keys in favor of key repeat
defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false

killall Finder;

Additional Application Setup

VS Code

I recommend checking in configuration settings to your project repository. This reduces global setup needed. Some recommended extensions:

  • Vim
  • GitHub Copilot
  • Prettier
  • ESLint
  • Live Share
  • GraphQL
  • Prisma
  • DotENV
  • GitLens
  • ShellCheck
  • Todo Tree
  • Bookmarks
  • change-case
  • Markdown All in One
  • Settings

    • Text Editor > Files > Auto Save -> onWindowChange
    • Text Editor > Tab Size -> 2
    • Text Editor > Bracket Pair Colorization: Independent Color Pool Per Bracket Type -> enable
    • Text Editor > Default Formatter -> Prettier
    • Text Editor > Guides: Bracket Pairs -> true
    • Goto Location: Multiple Definitions -> goto
    • Text Editor > Formatting > Format On Save -> Enable
    • JavaScript > Preferences: Import Module Specifier -> non-relative
    • TypeScript > Preferences: Import Module Specifier -> non-relative

iTerm2

Profiles

  • General > Reuse previous sessions’s directory
  • Colors > Solarized Dark
  • Text > Font -> Source Code Pro for Powerline
  • Terminal > Scrollback lines -> Unlimited scrollback
  • Keys > Left Option key -> Esc+
  • Keys > Right Option key -> Esc+

Window > Save Window Arragement

  • Note: I arrange my windows and tabs for my main project and CD into the appropriate directories before saving.

Appearance

  • Dimming > Dimming amount -> 20

iTerm2 Window Arragement

Wrapping Up macOS Development Setup

Ultimately, I really enjoy starting fresh with new computers rather than importing from backups. I tend to go through this process every year or two when I upgrade macOS versions since I typically perform fresh installs. However, I often forget to import certain settings, and I hope this can be a reference for others in the future.