Every config here is symlinked into $HOME, so editing a dotfile in place
edits this repo. Commit and push when you're done.
xcode-select --install
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
git clone git@github.com:baljinnyamday/mac-dotfiles.git ~/mac-dotfiles
cd ~/mac-dotfiles
./install.sh --brew --tools # symlink configs, brew bundle, then claude / uv / cursor-agent
./macos.sh # key repeat, dock, finder defaultsThen fill in ~/.gitconfig.local (name, email, signing key) and put any
machine-specific env, such as a work package index or tokens, in
~/.zshrc.local. Neither file is tracked.
| Path | Linked to | Notes |
|---|---|---|
zsh/ |
~/.zshrc, ~/.zshenv |
starship, zoxide, fzf, direnv, nvm, pnpm, bun, uv. Starts in ~0.1s: nvm loads on first use, completions rescan hourly (rm ~/.zcompdump && reload to force) |
git/ |
~/.gitconfig, ~/.config/git/ignore |
delta pager, zdiff3, identity from ~/.gitconfig.local |
aerospace/ |
~/.aerospace.toml |
i3-style tiling, see keys below |
ghostty/ |
~/.config/ghostty/config |
Catppuccin Mocha, JetBrainsMono Nerd Font, drop-down quick terminal. cmux reads it too |
cmux/ |
~/.config/cmux/cmux.json |
Warp-style vertical tabs on top of Ghostty, ctrl+tab cycles the sidebar, cmd+hjkl moves between splits |
warp/ |
~/.warp/settings.toml |
vertical tabs, JetBrainsMono Nerd Font, Warp hot-reloads edits |
starship/ |
~/.config/starship.toml |
gruvbox powerline prompt |
tmux/ |
~/.tmux.conf |
no plugins, Catppuccin status bar on top, popups for lazygit/claude/sessions |
lazygit/ |
~/Library/Application Support/lazygit/config.yml |
delta diffs, Cursor as editor, claude + gh custom commands |
nvim/ |
~/.config/nvim |
|
bin/ |
~/.local/bin/ |
every file gets linked, so a new script only needs ./install.sh. claude-in <folder> (new cmux tab, or a Ghostty window outside cmux), link-agent-docs [dir], tmux-sessionizer [dir], plus the longer commands listed in zsh/ALIASES.md (cc* pipeline, ship, wrm, fzf pickers) |
Brewfile |
refresh with brew bundle dump --force --describe |
|
macos.sh |
defaults write settings |
alt is the modifier.
| Key | Action |
|---|---|
| alt-enter | open cmux |
| alt-shift-enter | new Ghostty window |
| alt-h / j / k / l | focus window (wraps around) |
| alt-shift-h / j / k / l | move window |
| ctrl-alt-h / j / k / l | focus monitor |
| ctrl-alt-shift-h / l | move window to monitor |
| alt-1 … 9, alt-0 | workspace 1 … 9, 0 |
| alt-shift-1 … 0 | move window to workspace |
| alt-tab | previous workspace |
| alt-shift-tab | move workspace to next monitor |
| alt-n / c / s / t / o / w / e | Notion / Claude / Slack / Teams / Outlook / cmux / Cursor workspace, launches the app |
| alt-shift-n / c / s / t / o / w / e | move window to that app's workspace |
| alt-b | open Chrome |
| alt-f | fullscreen |
| alt-shift-space | toggle floating |
| alt-slash, alt-comma | tiles / accordion layout |
| alt-minus, alt-equal | shrink / grow |
| alt-r | resize mode: h/j/k/l, = balances, esc |
| alt-shift-q | close window |
| alt-shift-r | reload config |
| alt-shift-; | service mode: r flatten, f float, backspace close others, alt-shift-hjkl join |
cmux (vertical tabs, reads the Ghostty config)
| Key | Action |
|---|---|
| cmd-1 … 9 | jump to sidebar tab |
| ctrl-tab / ctrl-shift-tab | next / previous sidebar tab |
| cmd-n | new sidebar tab (workspace) |
| cmd-t | new tab inside the workspace |
| cmd-b | show / hide sidebar |
| cmd-shift-r | rename workspace |
| cmd-d / cmd-shift-d | split right / down |
| cmd-h / j / k / l | move between splits (only when the workspace is split, so cmd-h hide / cmd-k clear still work) |
| cmd-shift-enter | zoom split |
| cmd-shift-u | jump to the agent waiting for you |
| ctrl-cmd-shift-d | diff viewer |
| cmd-shift-w | close workspace |
Ghostty (horizontal native tabs; under AeroSpace each tab leaves an empty gap, AeroSpace#68, so prefer cmux or new windows)
| Key | Action |
|---|---|
| cmd-1 … 8, cmd-9 | jump to tab, last tab |
| ctrl-tab / ctrl-shift-tab | next / previous tab |
| cmd-shift-left / right | move tab |
| cmd-shift-r | rename tab |
| cmd-d / cmd-shift-d | split right / down |
| cmd-alt-arrows | move between splits |
| cmd-shift-enter | zoom split |
| ctrl-` (anywhere) | drop-down quick terminal |
tmux (prefix is ctrl-b). For SSH and the plain-Ghostty fallback; inside cmux use workspaces and splits instead, see zsh/ALIASES.md
| Key | Action |
|---|---|
| prefix f | fzf session picker (ts outside cmux and tmux) |
| prefix w / s | tree of windows / sessions with preview |
| prefix g / C / t | popup lazygit / claude / scratch shell |
| prefix | / - | split right / down in current folder |
| prefix h j k l, H J K L | move / resize panes (repeatable) |
| prefix tab, shift-tab | last window, last session |
| prefix < / > | move window left / right |
| prefix v | copy mode: v select, ctrl-v block, y copy |
| prefix X | kill session |
| prefix r | reload config |
lazygit extras (press ? for everything)
| Where | Key | Action |
|---|---|---|
| files | ctrl-g | claude drafts the commit message, you edit it |
| branches | ctrl-v | claude reviews branch vs main |
| commits | ctrl-x | claude explains the commit |
| branches | S | push and open PR |
| branches | ctrl-n | check out an open PR |
| branches | D | delete branches merged into main |
| diff | | | cycle delta / side-by-side |