Personal dotfiles and developer-environment setup for replicating my macOS local PC on a fresh machine.
Covers shell (fish), terminal multiplexer (tmux), editor (Zed), Claude Code, git, Node (nvm), Python (uv), Homebrew packages, and macOS defaults.
Each folder has its own README.md cheatsheet — open the link for tool-specific commands and tips.
config/
├── tmux/ → ~/.tmux.conf prefix Ctrl+Space, panes, sessions
├── fish/ → ~/.config/fish/... shell config, nvm autoload, killport
├── claude/ → ~/.claude/settings.json Claude Code global settings
├── git/ → ~/.gitconfig + ~/.config/git/ignore
├── zed/ → ~/.config/zed/settings.json
├── node/ default-version node major pinned for nvm
├── python/ default-version python version pinned for uv
├── brew/ Brewfile `brew bundle` package list
├── macos/ defaults.sh dev-friendly system defaults
└── install.sh bootstrap (symlinks everything)
| Folder | Cheatsheet |
|---|---|
| tmux | tmux/README.md — attach/detach, panes, copy mode |
| fish | fish/README.md — keys, syntax, abbreviations, PATH |
| git | git/README.md — aliases, common recipes, defaults explained |
| claude | claude/README.md — settings + slash commands |
| zed | zed/README.md — keys, vim mode, tasks |
| brew | brew/README.md — bundle, dump, day-to-day |
| node | node/README.md — nvm setup + nvm.fish plugin |
| python | python/README.md — uv workflow, venvs, pipx, system python |
| macos | macos/README.md — what defaults.sh does, how to revert |
- tmux —
Ctrl+Spaceprefix, mouse on, 256 colours,|/_splits,Alt+←/→to cycle windows. - fish — adds
~/.local/bintoPATH, setsCLAUDE_CODE_EFFORT_LEVEL=max, auto-initszoxide/direnv/fzfwhen present, integratesnvm(see Node below), plus akillport <port>helper. - claude — global Claude Code settings: enabled plugins (
code-review,interface-design),editorMode: normal,verbose: true,skipDangerousModePermissionPrompt: true. - git — opinionated defaults (
pull.rebase,push.autoSetupRemote,init.defaultBranch=main,fetch.prune,rerere.enabled,diff.algorithm=histogram,merge.conflictStyle=zdiff3) plus aliases (st,co,br,lg,last,undo,amend,pushf,wip,cleanup). Global ignore covers macOS junk,node_modules,.venv,target/,.env, editor artefacts. - zed — fish as terminal shell, AI disabled, left-docked project panel, One Dark theme.
- node —
default-versionfile (currently24) — used as thenvm install <version>target. - python —
default-versionfile (currently3.13) foruv. Workflow isuvfor projects/venvs,pipxfor global CLIs, brew Python only as a system fallback. - brew —
Brewfilewith daily-driver tools:fish,tmux,gh,lazygit,fzf,ripgrep,fd,bat,eza,zoxide,direnv,tldr,python@3.13,uv,pipx,rustup,hf,mactop,stripe-cli,docker-desktop. - macos —
defaults.shtoggles Finder hidden files, fast key repeat, autocorrect off, Dock auto-hide, no.DS_Storeon network volumes.
git clone https://github.com/<your-user>/config.git ~/Developer/config
cd ~/Developer/config
# 1. symlink dotfiles
./install.sh
# 2. install packages
brew bundle --file=brew/Brewfile
# 3. apply macOS defaults
bash macos/defaults.shThen set up Node (see below) and open a new shell.
Cherry-pick from install.sh. Each link line maps repo path → home path.
The repo doesn't vendor nvm — install it once on a fresh machine, then fish/conf.d/nvm.fish activates the default node automatically.
# 1. install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# 2. install + alias the version pinned in this repo
NODE_VERSION=$(cat ~/Developer/config/node/default-version)
bash -c "source ~/.nvm/nvm.sh && nvm install $NODE_VERSION && nvm alias default $NODE_VERSION"
# 3. (optional, recommended for fish) install fisher + nvm.fish for native fish support
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish \
| fish -c 'source && fisher install jorgebucaran/fisher jorgebucaran/nvm.fish'Without the nvm.fish plugin, fish/conf.d/nvm.fish still falls back to putting the default node's bin/ on PATH, so node/npm work — you just can't switch versions inside fish without bash.
- macOS (paths assume
$HOMEon darwin) - Homebrew —
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - Claude Code (installed separately) for the
claude/settings to take effect
To make fish the default shell after brew bundle:
echo /opt/homebrew/bin/fish | sudo tee -a /etc/shells
chsh -s /opt/homebrew/bin/fishRefresh the Brewfile from the current machine:
brew bundle dump --file=brew/Brewfile --force