Machine-agnostic dotfiles managed with chezmoi, supporting three profiles: personal, homelab, and work.
| Category | Tools |
|---|---|
| Shell | zsh, zinit, starship, atuin, zoxide, fzf |
| Editor | neovim (mini.nvim + LSP), VS Code |
| Terminal | ghostty with Catppuccin theme |
| Git | Commit signing via SSH keys (per-profile) |
| AI | Claude Code with custom plugins and MCP servers |
| Versions | mise for runtime management |
| Encryption | age for sensitive files (SSH config, GitHub hosts) |
| History sync | Self-hosted atuin server on homelab with SQLite |
macOS only - This dotfiles setup is designed exclusively for macOS Sequoia 15.x or newer.
Before installing, ensure you have:
-
System updates - Run Software Update to ensure macOS is current
-
Homebrew - Package manager for macOS
-
Chezmoi - Install via Homebrew
brew install chezmoi
-
Age encryption key - Required for decrypting sensitive files
- If migrating from another machine: Copy your existing
~/.config/chezmoi/key.txt - If setting up fresh: Generate a new key with
age-keygen -o ~/.config/chezmoi/key.txt - Encrypted files:
.ssh/config,.config/gh/hosts.yml
- If migrating from another machine: Copy your existing
Note: Older macOS versions may work but aren't regularly tested.
These dotfiles are managed with chezmoi, a powerful dotfile manager with templating, encryption, and cross-machine support.
One-command setup - Initialize and apply dotfiles:
chezmoi init --apply https://github.com/mrleeio/dotfiles.gitThis will:
- Clone the dotfiles repository
- Install configured Homebrew packages automatically
- Set up encryption (you'll be prompted for your email)
- Apply all configurations to your home directory
- Install Vim plugins automatically
- Sync Claude Desktop and Code settings
Keep up to date - Pull and apply the latest changes:
chezmoi updateAll profiles share the same tools and config. Differences:
| personal | homelab | work | |
|---|---|---|---|
| Atuin sync | To homelab (192.168.1.237) |
Localhost | Disabled |
| Atuin server | No | Yes (LaunchAgent) | No |
Profile data is in .chezmoidata/machines.yaml. To change your machine name after init:
# Edit the cached config
$EDITOR ~/.config/chezmoi/chezmoi.toml
# Change machine_name = "personal" to your profileUses mini.nvim as the plugin/UI framework with native LSP.
LSP servers (installed via Homebrew): gopls, lua_ls, pyright, ruby_lsp, ts_ls
Key bindings: <leader> is \
| Key | Action |
|---|---|
<leader>f + f/g/b/h |
Find files / grep / buffers / help |
<leader>e |
File explorer |
gd / gr / gI |
Go to definition / references / implementation |
K |
Hover docs |
<leader>ca / <leader>rn |
Code action / rename |
Ctrl-hjkl |
Window navigation |
Shift-hl |
Previous/next buffer |
Tree-sitter parsers auto-install on startup (requires tree-sitter-cli).
Sensitive files are encrypted with age:
private_dot_ssh/private_config.tmpl— SSH config (per-profile host/key mapping)dot_config/gh/encrypted_private_hosts.yml.age— GitHub CLI hosts
To set up encryption on a new machine, copy your existing key:
# Copy from another machine (required — a new key can't decrypt existing secrets)
scp other-machine:~/.config/chezmoi/key.txt ~/.config/chezmoi/key.txt
# Then re-apply to decrypt encrypted files
chezmoi applyThe public key (recipient) is stored in .chezmoi.toml.tmpl. If you need to start fresh with a new key, generate one with age-keygen -o ~/.config/chezmoi/key.txt, update the recipient in .chezmoi.toml.tmpl, and re-encrypt all files.
Edit .chezmoidata/packages.yaml and add to the appropriate list:
packages:
darwin:
brews:
- new-package # https://example.com/
casks:
- new-app # https://example.com/Packages install automatically on chezmoi apply (via brew bundle).
- Atuin sync setup — Self-hosted history sync between machines
- Git commit signing — SSH key signing setup (per-profile)
- Neovim — Plugin architecture, key bindings, adding LSP servers
.chezmoidata/ Data files (machines, packages)
.chezmoiscripts/ Install scripts (darwin, universal)
.chezmoitemplates/ Shared templates (shell-header, claude-settings)
dot_config/ ~/.config/ (nvim, atuin, ghostty, starship, mise, gh)
dot_claude/ Claude Code settings
private_Library/ macOS LaunchAgents, VS Code settings
private_dot_ssh/ SSH config (encrypted)