A curated list of the apps, CLI tools, & mac settings I use to get up and running fast on a new Mac.
- Install Chrome manually, via Safari.
- Make sure Git is installed — run
git --version. If prompted to install developer tools, install them. - Clone this repo:
git clone https://github.com/jujoco/Mac-for-Software-Development.git cd Mac-for-Software-Development - Install Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - Run the six
brew installcommands under CLI Applications and Desktop Applications below. ./scripts/link-dotfiles.sh— the only script here. Copies the zsh config to~/.config/zsh, then symlinks~/.zshrc/~/.zshenv/~/.zprofileto it. Open a new terminal window afterward.- Node + npm globals — see Global npm Packages below.
- Python for Neovim — see Python (Neovim) below.
- Auth & remaining manual setup — see One-Time Manual Setup below.
iterm2 # terminal
claude # Claude Desktop
docker # Docker Desktop
obsidian # notes
rectangle # window manager
karabiner-elements # key remapping
visual-studio-code # code editor
handy # voice dictation
bruno # API testing
notunes # disable Music buttonbrew install --cask iterm2 claude docker obsidian rectangle karabiner-elements visual-studio-code handy bruno notunesChrome is installed manually (Safari), not listed here.
Follow-up needed:
- Rectangle → grant Accessibility on first launch
- Karabiner-Elements → grant Input Monitoring + Accessibility on first launch
- Docker Desktop → launch once, accept terms, approve the privileged helper
- VS Code → Cmd+Shift+P: "Shell Command: Install 'code' command in PATH"
Text Cursor Key-Repeat Tester: best butter smooth setting
enter in terminal & restart computer
defaults write -g KeyRepeat -int 1
defaults write -g InitialKeyRepeat -int 12Settings > Keyboard > Keyboard Shortcuts... > App Shortcuts >
- All Applications
- disable Minimize
- Google Chrome, VSCode, iTerm, etc.
- disable Hide
Note: after every homebrew install, carefully follow the logged instructions
bat # better cat
fd # better find
ffmpeg # audio/video converter
jq # JSON processor
lazydocker # docker TUI
lazygit # git TUI
neovim # text editor
ripgrep # better grep
rust # rust toolchain
tree # directory tree
uv # python manager
wget # http/ftp fetchbrew install bat fd ffmpeg jq lazydocker lazygit neovim ripgrep rust tree uv wgetcoreutils # GNU core utils
htop # process viewer
jless # JSON pager
pandoc # doc converter
xh # http clientbrew install coreutils htop jless pandoc xhpostgresql@17 # databasebrew install postgresql@17gh # github cli -> gh auth login after
git-lfs # large files -> git lfs install afterbrew install gh git-lfsfnm # node version manager
fzf # fuzzy finder
zoxide # better cd
atuin # better history
powerlevel10k # zsh prompt theme
zsh-syntax-highlighting # syntax highlightingbrew install fnm fzf zoxide atuin powerlevel10k zsh-syntax-highlightingPin Node to 24.16.0 and pnpm to 10.34.5 via fnm:
fnm install 24.16.0 && fnm default 24.16.0
npm install -g @playwright/cli @vscode/vsce corepack neovim vercel pnpm@10.34.5@playwright/cli- browser automation and testing CLI@vscode/vsce- VS Code extension publishing toolcorepack- Node package manager shimneovim- Node.js client for Neovimvercel- Vercel CLIpnpm- fast, disk-efficient package manager
Neovim's Python provider needs a python3 with pynvim importable — this keeps it in a
dedicated uv-managed venv, isolated from any project venvs:
uv python install 3.12
uv venv ~/.venvs/neovim --python 3.12
uv pip install --python ~/.venvs/neovim/bin/python pynvimThen set this in your nvim config:
vim.g.python3_host_prog = "~/.venvs/neovim/bin/python"gh auth login
git lfs install
p10k configure # only if ~/.p10k.zsh doesn't already exist- Sign in to Claude Desktop / Claude Code
- Grant the app permissions listed under Desktop Applications above
- Recreate
~/.env(secrets) manually through a secure channel — not tracked in this repo
This repo also bundles the dotfiles and app configs I carry between machines:
zsh/.zshenv• Loaded for every zsh invocation; sources secrets and sets locale, themes, and thebatman pager.zsh/.zprofile• Login-shell setup run once per window; initializes Homebrew, fzf, andPATHfor child shells to inherit.zsh/.zshrc• Interactive shell config (Powerlevel10k, completions, history, fzf, atuin, zoxide, fnm).zsh/aliases.zsh• Shell aliaseskarabiner/karabiner.json• Karabiner Elements key-remapping rules.RectangleConfig.json• Rectangle window-management settings (import from Rectangle → Settings).
Not tracked: ~/.env (secrets) and ~/.p10k.zsh (Powerlevel10k config, from p10k configure).
scripts/link-dotfiles.sh• The only script in this repo. Copieszsh/to~/.config/zsh, then symlinks~/.zshrc,~/.zshenv, and~/.zprofileto it. Safe to re-run — backs up whatever's currently at each target path first.