As someone who builds software for a living & as a hobby - I go through lots of computers. I also like to occasionally wipe my machines and reinstall from a clean state. Therefore I spend a lot of time setting up new Apple computers. This blog is intended to be a living document of steps I take when setting up a new Mac. I use macOS for both personal and professional work, and this setup guide reflects both use cases. Hopefully you will learn some helpful macOS customizations along the way.
Table of contents
Open Table of contents
Browser: Brave
As of March 2023, my daily driver is Brave.
Set up Brave Sync
- Settings → Sync → Manage you synced devices
Stock Apps to Delete
Lets be honest - nobody uses these apps, right?
- GarageBand
- iMovie
- Keynote
- Pages
Apps to Install
- 1Password
- Notion
- Spotify
- Preferences
- Startup and window behaviour → Open Spotify Automatically after you log into the computer:
No
- Display → See what your friends are playing:
false
- Startup and window behaviour → Open Spotify Automatically after you log into the computer:
- Preferences
- Copilot
- VSCode
- GitHub Desktop
- Brave
- Settings → Sync → Start using sync:
true
- Settings → Sync → Start using sync:
Utilities to Install
- Sensible Side Buttons
- Menu Bar Settings
- Enabled:
true
- Hide Menu Bar Icon:
true
- Enabled:
- System Settings → General → Login Items → Open at Login: Add
/Applications/SensibleSideButtons.app
- Menu Bar Settings
- exelban/stats
- Disk:
false
- Battery:
false
- RAM → Update interval:
3 sec
- RAM → Update interval for top processes:
3 sec
- Disk:
- Magnet
- Preferences → Disable all keyboard shortcuts except
Left
&Right
- Preferences → Disable all keyboard shortcuts except
- Mos
- Preferences → Miscellaneous → Launch on Login:
true
- Preferences → Miscellaneous → Hide Status Bar Icon:
true
- Preferences → Miscellaneous → Launch on Login:
Terminal
- Create Development Folder: mkdir
~/Dev
- Install Command Line Developer Tools:
xcode-select --install
- Disable Apple’s Shell Session history (Explanation)
-
Create zshenv file:
touch ~/.zshenv
SHELL_SESSIONS_DISABLE=1
-
Terminal Theme
- lysyi3m/macos-terminal-themes
curl -o /tmp/idleToes.terminal "https://raw.githubusercontent.com/lysyi3m/macos-terminal-themes/master/themes/idleToes.terminal" && open /tmp/idleToes.terminal
Terminal Preferences
- Profiles → Text
- Text → Background → Color & Affects → Opacity:
95%
- Text → Font → Change → Size:
13
- Text → Cursor:
Vertical Bar
- Text → Background → Color & Affects → Opacity:
- Profiles → Keyboard → Use Option as Meta key:
true
- Profiles → Window
- Path:
true
- Acvite process name:
false
- Dimensions:
false
- Path:
- Profiles: Click
Default
to save - Edit Menu → Marks → Automatically Mark Prompt Lines:
false
Terminal Utilities
-
Install Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
-
Hush the login messages:
touch ~/.hushlogin
-
Install httpie:
brew install httpie
-
Install Node.js:
brew install node@18
-
Install htop:
brew install htop
-
Install fortune:
brew install fortune
-
Install pokemonsay:
brew tap possatti/possatti && brew install pokemonsay
.zshrc
Create a .zshrc
with touch ~/.zshrc
and add the following:
# Colors
export CLICOLOR=1
# Prompt
export PS1="%n@%m %1~ %# "
# Aliases
alias ll="ls -Flht"
alias ls="ls -F"
alias la="ls -Flhta"
alias activate="source env/bin/activate"
alias vactivate="source venv/bin/activate"
# Node.js
export PATH="/opt/homebrew/opt/node@18/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/node@18/lib"
export CPPFLAGS="-I/opt/homebrew/opt/node@18/include"
# Set PATH, MANPATH, etc., for Homebrew.
eval "$(/opt/homebrew/bin/brew shellenv)"
# Case insensitive tab completion
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]} l:|=* r:|=*'
# Automatic CD
setopt AUTO_CD
# ZSH History
export HISTSIZE=20000
export SAVEHIST=10000
setopt sharehistory # share history across multiple zsh sessions
# History search completion
autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end
# Load the ZSH config changes
autoload -Uz compinit && compinit
# Prompt, git branch on right
function parse_git_branch() {
git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\\1]/p'
}
setopt PROMPT_SUBST
COLOR_DEFAULT=$'%f'
COLOR_ORANGE=$'%F{214}'
COLOR_GRAY=$'%F{243}'
export PROMPT='${COLOR_ORANGE}%1~ ➤${COLOR_DEFAULT} '
export RPROMPT='${COLOR_GRAY}$(parse_git_branch)${COLOR_DEFAULT}'
# Fun greeting from a random pokemon
fortune -s 50% computers 50% all | pokemonsay
# Docker fix for apple silicon
export DOCKER_DEFAULT_PLATFORM="linux/amd64"
source /Users/ryan/.docker/init-zsh.sh || true # Added by Docker Desktop
After all these modifications - your terminal should look something like this:
VSCode Config
Installed Extensions
- One Dark Pro (One Dark Pro Mix)
- Shebang Snippets
- YAML
User Settings
{
"workbench.startupEditor": "none",
"editor.minimap.enabled": false,
"editor.fontSize": 14,
"workbench.colorTheme": "One Dark Pro Mix",
"editor.scrollBeyondLastLine": false,
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"security.workspace.trust.untrustedFiles": "open",
"cSpell.ignoreWords": [
"Siri"
],
"files.exclude": {
"**/__pycache__": true
},
"[json]": {
"editor.defaultFormatter": "vscode.json-language-features"
},
"redhat.telemetry.enabled": false,
"[python]": {
"editor.formatOnType": true
}
}
System Settings
- Appearance
- Appearance → Appearance:
Auto
- Appearance → Appearance:
- Control Center
- Control Center Modules → Bluetooth:
Show in Menu Bar
- Other Modules → Battery → Show Percentage:
true
- Menu Bar Only → Spotlight:
Don't Show in Menu Bar
- Control Center Modules → Bluetooth:
- Siri & Spotlight
- Listen for Hey Siri: Off
- Siri voice:
Australian Voice 2
- Siri voice:
- Spotlight Privacy: Add
~/Dev
- Listen for Hey Siri: Off
- Desktop and Dock:
- Show recent applications in Dock:
false
- Position on screen:
Left
- Show recent applications in Dock:
- Displays
- Automatically adjust brightness:
false
- Advanced → Slightly dim the display on battery:
false
- Automatically adjust brightness:
- Wallpaper
- Colors → Auto-Rotate
- Change picture:
Every 15 mins
- Screen Saver:
Drift
- Lock Screen
- Turn display off on power adapter when inactive:
For 1 hour
- Turn display off on power adapter when inactive:
- Touch ID & Password
- Apple Watch → Ryan’s Apple Watch:
true
- Apple Watch → Ryan’s Apple Watch:
- Keyboard:
- Key repeat rate:
7/8
- Delay until repeat:
5/6
- Key repeat rate:
Finder
- View → Show Path Bar
- Preferences → General → New Finder windows show:
ryan
Finder List View by Default
- Go → Go To Folder:
/
- View → Show View Options (⌘ - J)
- Always open in list view:
true
- Browser in list view:
true
- Sort by:
Name
- Always open in list view:
- Run in Terminal:
sudo find / -name ".DS_Store" -exec rm {} \;
Finder + Desktop
- Click on desktop
- View → Show View Options (⌘ - J)
- Sort by:
Name
- Sort by:
Finder Sidebar:
- Favorites
- AirDrop
- Applications
- ryan
- Dev
- Desktop
- Downloads
- iCloud
- iCloud Drive
- Locations
- Network
Notification Center
- Remove all the widgets except weather and calendar
Messages
- Settings → iMessage → Enable Messages in iCloud:
true
Dock
- Downloads Stack → Right Click → View content as:
Grid
- Add small spacers:
defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="small-spacer-tile";}'; killall Dock
TextEdit
- Preferences → Format:
Plain Text
- By default, open a new blank document (instead of asking which file to open):
defaults write com.apple.TextEdit NSShowAppCentricOpenPanelInsteadOfUntitledFile -bool false