A lean, repeatable baseline for a fresh Mac. Homebrew owns apps and CLIs; mise owns Node.js and Bun; uv owns project Python environments.
git clone https://github.com/paul-phan/dev-setup.git
cd dev-setup
./setup.shThe script backs up existing dotfiles before linking this repository. GitHub authentication and missing Git identity values are requested interactively.
Apply the opinionated Finder, Dock, keyboard, and trackpad defaults only when wanted:
./setup.sh --macos- Terminal: cmux, Starship, Atuin, zoxide, fzf
- System monitoring: Stats
- Editor: Cursor
- Browsing and utilities: Chrome, Raycast
- Containers: Docker Desktop
- AI CLIs: Claude Code latest channel, Codex
- Runtimes: mise with Node.js LTS and Bun latest; uv for Python projects
- Core CLI: Git, GitHub CLI, ripgrep, fd, bat, eza, jq, yq, btop, HTTPie
- Git: delta, lazygit, main as the default branch, rebase-on-pull
- Shell: native Zsh completion, Carapace, autosuggestions, syntax highlighting
Warp, Arc, VS Code, VSCodium, Oh My Zsh, NVM, FNM, GPG signing, and duplicate CLI replacements are deliberately excluded. Install one only when the baseline is measurably missing something.
Never put credentials in tracked dotfiles.
~/.zshrc.local: tokens, private environment variables, machine-only functions~/.gitconfig.local: name, email, and SSH signing configuration
Both files are created with mode 600. The tracked configs source/include them.
If setup finds ~/.ssh/id_ed25519.pub, it enables local SSH commit signing. Add that public key to GitHub as a signing key if it is not already registered:
gh ssh-key add ~/.ssh/id_ed25519.pub --type signing --title "$(scutil --get ComputerName)"updateThat upgrades Homebrew packages and mise-managed runtimes. Re-running ./setup.sh is safe.
./setup.sh --check
shellcheck setup.sh