
Dotfiles
The machine as a living document.
A decade of accumulated configuration managed via GNU Stow. Neovim, zsh, tmux, git, macOS defaults — wired to reproduce a working dev environment on fresh hardware in under an hour.
A decade of configuration decisions, accumulated one dotfile at a time, managed through GNU Stow and designed to reproduce a fully functional development environment on fresh hardware in under an hour. This isn't a backup — it's infrastructure as code for the personal machine.
The philosophy
Dotfiles are the most personal codebase a developer maintains. They encode taste, workflow, muscle memory. Losing them — or worse, not being able to reproduce them on new hardware — means rebuilding years of accumulated decisions from scratch. That's unacceptable. The repository treats the machine itself as a living document: every configuration choice is tracked, versioned, and reproducible.
The goal isn't just backup. It's declarative environment management. Run the bootstrap script, wait, and you get a machine that feels exactly like the one you were working on before. Same keybindings, same shell behavior, same editor config, same git aliases. Zero "oh right, I need to set that up" moments.
GNU Stow: managing complexity
Stow is the secret weapon. It's a symlink farm manager — it takes directories of config files and symlinks them into the right locations in your home directory. Each tool gets its own directory in the repo (neovim/, zsh/, tmux/, git/), and stow neovim creates all the right symlinks. No copying. No manual path management. Clean separation between tools, clean activation and deactivation.
The alternative — a shell script that copies files around — is fragile. Stow gives you idempotent, reversible operations. Run it twice and nothing changes. Run stow -D neovim and all the symlinks are removed cleanly. It's the right abstraction for the problem.
What's configured
The major modules:
- Neovim — LazyVim-based config with custom keybindings, LSP setup for TypeScript/Go/Python/Rust, Harpoon for file navigation, Oil for file management, telescope for fuzzy finding. Transparent backgrounds. The editor I live in.
- zsh — Custom prompt (no oh-my-zsh), aliases, path management, completion, vi-mode. Fast startup time is non-negotiable — no plugin managers that add 200ms to shell init.
- tmux — Session management, Navigator integration for seamless vim/tmux pane switching with Ctrl+h/j/k/l, custom status bar.
- git — Aliases, commit templates, delta for diffs, global gitignore.
- macOS defaults — Shell scripts that set system preferences via
defaults write. Dock size, key repeat rate, screenshot format, Finder preferences. The stuff you configure once on a new Mac and never want to configure again.
The bootstrap process
Fresh machine to working environment: clone the repo, run ./bootstrap.sh, answer a few prompts, wait for Homebrew to install everything, and Stow to symlink all configs. Under an hour from unboxing to productive. The script is idempotent — running it on an already-configured machine just verifies everything is in place.
Current status
Active and evolving. This repo has been maintained for years and will continue as long as I use a Unix-based machine. It's the most stable project I maintain — because it has to be.