My macOS dev setup as code. One command turns a fresh Mac into it: shell, editor, terminal, apps, language runtimes, and a guarded Claude Code.
A git repo that lives at ~/.dotfiles and gets symlinked into $HOME, ~/.config, and ~/.claude. The configs you edit in place are the ones in the repo, so every change is a diff.
It's macOS only, and built around how I work: Neovim in tmux inside WezTerm, zsh in vi mode, and Claude Code as a daily tool.
Setting up a new Mac by hand takes a day and never comes out the same twice. Configs drift between machines, and the tweak you made six months ago is gone, along with the reason you made it.
This repo fixes that:
- Reproducible machines. A new or wiped Mac is one install away from the same setup.
- Configs with history. Every tweak is a commit, so
git logtells you when and why something changed, andgit revertundoes it. - One place to change things. Edit it once, pull on the other machine, done.
It's not a framework. There are no modules to toggle and no abstraction over what the tools already do. It's one person's setup, kept tidy.
Every choice in here is mine: Catppuccin everywhere, vi keys everywhere, asdf for runtimes, WezTerm over iTerm, Neovim over anything else. Some of them won't suit you, and that's fine.
It's MIT licensed. Fork it, rip out what you don't want, and make it yours. I'm not taking PRs that change the taste, but issues for real bugs are welcome.
Before you run it on your own machine, change these, or you'll end up committing as me:
- Git identity:
name,email, andsigningkeyin.gitconfig. - Apps: prune the
Brewfile. It installs everything I use, including Mac App Store apps. - Claude Code:
claude/holds my personal settings and rules. Keep, edit, or drop them. - Location:
install.shassumes the repo lives at~/.dotfiles. - Clone URL: use your fork's URL, over HTTPS if you don't have a GitHub SSH key set up yet.
| Area | What's in it |
|---|---|
| Editor | Neovim with LSP, Treesitter, Copilot, lazy.nvim |
| Shell | zsh, Starship prompt, autosuggestions, syntax highlighting, vi mode |
| Terminal | WezTerm with FiraCode Nerd Font, tmux with Catppuccin and tmuxinator |
| Apps and CLIs | Everything in the Brewfile, installed via Homebrew |
| Runtimes | Node, Ruby, Python, and Go via asdf, pinned in .tool-versions |
| Scripts | Helpers on $PATH: branch naming, tmux session picker, git utilities |
| Claude Code | claude-kit guardrails, see below |
Guardrails for Claude Code. It blocks dangerous commands like rm -rf ~ or a force push to main, keeps Claude out of .env and SSH keys, and won't let it say "done" while a linter or test is still failing.
It lives in its own repo, ku5ic/claude-kit, as a Claude Code plugin that works without the rest of these dotfiles. install.sh installs it.
Needs macOS with the Xcode command line tools:
xcode-select --installThen:
git clone git@github.com:ku5ic/dotfiles.git ~/.dotfiles
source ~/.dotfiles/install.shNo SSH key yet, or installing a fork? Clone over HTTPS instead:
git clone https://github.com/<you>/dotfiles.git ~/.dotfilesThe installer is safe to re-run. In order, it:
- pulls the latest repo
- installs Homebrew, then zsh and bash, and makes zsh your login shell
- runs
brew bundlefrom theBrewfile - symlinks every config into
$HOMEand~/.config - sets up Claude Code with claude-kit
- installs launchd agents
- installs the asdf runtimes
macOS system defaults are opt-in. Run them yourself:
~/.dotfiles/macos/set-defaults.sh| To | Run |
|---|---|
| Pull and refresh everything | ~/.dotfiles/install.sh |
| Upgrade Homebrew packages | brew_all |
| Add or remove an app | edit Brewfile, then brew bundle --file="$DOTFILES_DIR/Brewfile" |
| Drop apps no longer listed | brew bundle cleanup --file="$DOTFILES_DIR/Brewfile" --force |
| Re-link one config | ln -sfv ~/.dotfiles/config/nvim ~/.config/ |
| Path | Holds |
|---|---|
config/ |
Neovim, WezTerm, Starship, git |
claude/ |
My personal Claude Code settings on top of claude-kit |
scripts/ |
Shell helpers, each callable by its bare name |
completions/ |
zsh tab-completion for the scripts |
tests/ |
bats tests for the scripts |
macos/ |
System defaults script |
launchd/ |
Background jobs |
.tmuxinator/ |
tmux session layouts |
.github/workflows/lint.yml |
CI: shellcheck and bats tests |
Brewfile |
Every Homebrew package and app |
install.sh |
The installer |
MIT.