Personal macOS configuration files managed with plain git.
Clone the repo and symlink (or copy) the files you need. There is no install script — files map straightforwardly to their destinations:
| File in repo | Target |
|---|---|
zsh/zshenv |
~/.zshenv |
zsh/zprofile |
~/.zprofile |
zsh/zshrc |
~/.zshrc |
git/gitconfig |
~/.gitconfig |
git/gitignore |
~/.gitignore |
git/gitattributes |
~/.gitattributes |
tmux/tmux.conf |
~/.config/tmux/tmux.conf |
neovim/ |
~/.config/nvim/ |
mise/config.toml |
~/.config/mise/config.toml |
ghostty/config |
~/.config/ghostty/config |
bat/config |
~/.config/bat/config |
git/gitconfig is committed and contains all shared settings, but deliberately omits [user]. Create ~/.gitconfig.local on each machine with your identity:
[user]
name = Your Name
email = you@example.comThe shared config includes this file automatically via [include] path = ~/.gitconfig.local at the bottom.
brew bundlePlugins are managed by lazy.nvim and auto-install on first launch.
Everything standardizes on Catppuccin — Mocha in dark mode, Latte in light mode — and follows the system appearance automatically.
The switching is anchored on Ghostty, which sets the terminal palette per
appearance (theme = dark:"Catppuccin Mocha",light:"Catppuccin Latte"). Tools then
adapt in one of two ways:
- Inherit the terminal's ANSI palette. Anything that uses bare ANSI color names
picks up Ghostty's current Catppuccin flavour for free, so it switches with no extra
wiring. Starship does this (e.g.
[❯](green)), which is why the prompt already matched without a dedicated palette. - Explicit per-mode config, flipped on appearance change. Tools that need a named
theme are pointed at
Catppuccin Mocha/Catppuccin Latteand toggled bydark-notify:- Neovim — Catppuccin colorscheme;
dark-notify(seeneovim/lua/plugins/colorscheme.lua) flipsbackground, and the flavour follows. - git / delta —
[delta "light-mode"]/[delta "dark-mode"]set the Catppuccin syntax themes; adark-notifypreexec hook inzshrcsetsDELTA_FEATURESto the matching mode before each command. - bat —
bat/configuses--theme=autowith--theme-dark="Catppuccin Mocha"and--theme-light="Catppuccin Latte"(delta reads bat's installed theme set, so these two stay in sync).
- Neovim — Catppuccin colorscheme;
The Catppuccin syntax themes are bundled with modern bat, so no theme files need to
be installed separately.
Claude Code is left on theme: "auto" (its built-in dark/light, in
~/.claude/settings.json). It has no native Catppuccin theme; its *-ansi themes would
inherit Ghostty's palette exactly but are limited to 16 colors, so the richer built-in
themes are kept instead.
Several dedicated dotfiles tools exist. Here's why this repo uses plain git instead.
chezmoi (most popular, ~20k stars) adds templating, password-manager integration, and file encryption on top of git. It solves the problem of needing different config values per machine (e.g., different email addresses, work vs. personal API keys, OS-specific paths) without duplicating files. The cost is a new workflow: you edit files through chezmoi edit, apply with chezmoi apply, and learn its template syntax. It's the right choice when machine-to-machine variation is significant.
yadm is lighter: essentially git with built-in support for per-machine file alternates (e.g., .zshrc##os.Darwin) and optional GPG encryption. No new workflow to learn — it wraps git commands directly. A good middle ground if you want more than bare git without chezmoi's full complexity.
GNU Stow creates symlink trees from a source directory. It solves file organization, not secrets or templating. Pairs well with plain git but doesn't add much beyond what careful gitignore discipline achieves.
Bare git repo (the git --work-tree=$HOME --git-dir=$HOME/.dotfiles trick) avoids a dedicated tool entirely by pointing git's work tree at $HOME. The upside: zero dependencies. The downside: easy to accidentally track or commit sensitive files; no help with multi-machine variation.
This repo's machine-specific variation is handled inline:
- Conditional shell behavior:
if [[ "$TERM_PROGRAM" == "vscode" ]]guards inzshrcrather than per-machine file variants - Secrets: sourced from
~/.zshrcsecrets(excluded from git, present only on the relevant machine) - Git identity: split into
~/.gitconfig.local(see above) so the shared config is fully committed
This covers the main chezmoi use cases without the additional tooling layer. If the number of machines grows or per-machine variation becomes complex enough that inline guards get unwieldy, chezmoi would be the natural next step.