I've been continually refining these dotfiles since 2010. They do 80% of the work of setting up a Mac the way I like it:
xcode-select --install
git clone https://github.com/notahat/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
export DOTFILES_ENV=home # or "work"
./installI keep them lean. Anything I stop using, I delete. What's here is what I actually run every day.
- A tiny install you can actually read.
./installruns plain-bash steps fromsteps/. No framework, no DSL, no magic. It symlinks config into place and is fully idempotent, so I re-run it constantly and it never rots. If a config file already exists, it warns and skips rather than clobbering it. - A clear rule for Homebrew vs. Mise. Homebrew installs anything I always want at the latest version (apps, CLI tools, even Mac App Store apps). Mise manages anything I need pinned to a particular version, like language runtimes. Two tools, one easy mental model.
- Zsh that starts in ~100ms. None of the Oh My Zsh
bloat: just a Pure prompt, fzf-tab
completion, and syntax highlighting, wired up by hand in
config/zsh. - Neovim that starts in under 100ms. Modern IDE features (LSP, Treesitter, fuzzy finding) with a deliberately minimal UI, so the code stays front-and-centre. It's heavily commented and has its own README.
- One command to update everything.
./upgradebumps Homebrew packages, Mise tools, and Neovim plugins in a single run. - A version-controlled Claude Code setup. Custom skills, hooks, and a
statusline live in
config/claude.
./install runs the steps in steps/, each a small bash script that
installs a tool and symlinks its config. Run them all, or just one:
./install # everything
./install zsh # just the zsh step
./install -h # usage, and the list of stepsThe pieces:
config/: every config file, symlinked into~and~/.configby the steps. Edit it in place here.environments/: separateBrewfiles andmise.tomls for my home and work machines, selected byDOTFILES_ENV.project-templates/: drop-in editor and tooling config for new Rails and Vite projects.
Take whatever's useful, whether a whole config, a single alias, or just an idea. Everything here is MIT licensed.
A couple of the Claude skills aren't mine. The install fetches them from their sources rather than bundling them: doc-coauthoring by Anthropic, and grill-me by Matt Pocock.