My personal dotfiles for macOS, managed cleanly with GNU Stow. This setup is heavily optimized for terminal power users, featuring a modern Rust-based CLI stack, Neovim (LazyVim), and Starship prompt.
- Shell: Zsh powered by Starship for a blazing fast, cross-shell prompt.
- Dotfile Manager: GNU Stow for clean, symlink-based management.
- Modern CLI Stack:
fzffor fuzzy finding.ezaas a modern replacement forls.batas a syntax-highlighting replacement forcat.fdas a faster, friendlierfind.ripgrepas an incredibly fast replacement forgrep.zoxidefor smarter directory navigation.
- Git: Configured with git-delta for syntax-highlighted, side-by-side diffs, plus a global
.gitignore. - Tmux: Well-documented, customized configuration with
Ctrl-aprefix, vim-bindings, and sensible split shortcuts. - Multiplexer: herdr with a
Ctrl-`prefix, prefix-freeCtrl-h/j/k/lpane nav, and two fzf pickers bound over it — seeherdr/README.md. - Editor: Neovim configured via LazyVim.
- Agent guardrails: Claude Code hooks that stop the
cd x && yanti-pattern, protect hand-written PR descriptions, and keep agents from commenting on GitHub or Linear — seeclaude/README.md.
Ensure you have Homebrew installed on your Mac.
If you don't want to install dependencies manually, you can use the included Brewfile:
brew bundle --file=~/dotfiles/brew/BrewfileOr install the core packages manually:
brew install stow starship fzf eza bat fd ripgrep git-delta zoxide neovim tmuxClone this repository into your home directory:
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles
cd ~/dotfilesFor security, API keys and access tokens are not committed to this repository.
Before starting your shell, create a ~/.zsecrets file in your home directory:
touch ~/.zsecrets
chmod 600 ~/.zsecretsAdd your personal exports to this file (e.g., DigitalOcean, Hetzner, Gemini tokens):
# ~/.zsecrets example
export DO_TOKEN="your_token_here"
export GEMINI_API_KEY="your_api_key_here"Note: Your .zshrc is configured to automatically source this file if it exists.
Use GNU Stow to symlink the configurations into your home directory. Run this from inside the ~/dotfiles directory:
stow zsh
stow git
stow nvim
stow tmux
stow herdr
stow ripgrep
stow --adopt claude
stow iterm2
stow localAfter stow iterm2, run ./iterm2/install.sh (with iTerm2 closed) to apply the "Evangelion Dark" preset as the Default profile.
After stow herdr, install the plugins its keymap binds to and reload — the
plugin list itself is machine state and isn't committed. See
herdr/README.md for the commands and the full keymap.
claude needs --adopt because ~/.claude/hooks/ normally already exists with
files in it; check git diff afterwards in case adopt pulled a stale local copy
over the repo's. The guards need bun on the machine. See
claude/README.md for what each one blocks and the
settings.json snippet that wires them up.
The local package symlinks two CLIs into ~/.local/bin:
zz— zoxide-based command runner with optional git worktree jumping (e.g.zz proj npm startorzz data@fix-foo pnpm test). Source in~/eneko_projects/zz.wt— git worktree manager with per-worktree port + Postgres isolation. Service profiles (ports, DB vars, install/migrate commands) are not committed; they live in~/.config/wt/configon each machine. Runwt helpfor the config format.diff-preview— renders the current repo's diff as a dark-themed HTML page and opens it in the browser. Needs its deps (not committed):cd ~/.local/share/diff-preview && npm ci
To install everything at once:
stow */Restart your terminal, and you're good to go! 🎉
GNU Stow works by mirroring the directory structure of the package into the target directory (by default, the parent directory ~/).
If you want to add a new tool, say tmux, follow these steps:
- Create a folder for it in the dotfiles repo:
mkdir -p ~/dotfiles/tmux - Move your existing config into that folder, preserving the expected path relative to your home directory:
mv ~/.tmux.conf ~/dotfiles/tmux/
- Run stow to create the symlink:
cd ~/dotfiles stow tmux
To remove the symlinks for a specific package, use the -D (delete) flag:
stow -D zsh~/dotfiles
├── brew/
│ └── Brewfile # Homebrew declarative package list
├── claude/
│ ├── README.md # What each hook blocks + settings.json wiring
│ └── .claude/hooks/ # PreToolUse guards (bun) + iTerm2 tab title
├── git/
│ ├── .gitconfig
│ └── .gitignore_global
├── herdr/
│ ├── README.md # Keymap rationale + plugin install commands
│ └── .config/herdr/
│ └── config.toml # Prefix, pane nav, theme, plugin keybindings
├── nvim/
│ └── .config/
│ └── nvim/ # LazyVim setup
├── iterm2/
│ ├── install.sh # Apply preset as Default profile (ignored by stow)
│ └── Library/Application Support/iTerm2/ColorPresets/
│ └── Evangelion Dark.itermcolors # Matches Zed's Evangelion Dark theme
├── ripgrep/
│ └── .ripgreprc # Ripgrep smart case and ignore config
├── tmux/
│ └── .tmux.conf # Tmux configuration and shortcuts
└── zsh/
└── .zshrc