Personal dotfiles managed with chezmoi, using a two-repository architecture for modular configuration management.
This repository manages system configurations across macOS machines. Neovim configuration is maintained in a separate repository (emmandev/lazyvim) and synced via chezmoi's external resources feature.
Architecture:
emmandev/dotfiles→ Shell configs, tool settings, package listsemmandev/lazyvim→ Neovim configuration (managed separately)
# Install chezmoi and apply dotfiles
brew install chezmoi
chezmoi init --apply emmandev
# On subsequent updates
chezmoi update && chezmoi applyAdding/removing packages:
chezmoi edit ~/.local/share/chezmoi/.chezmoidata/packages.yml
# Add package to brews/casks list
chezmoi apply # Auto-installs new packagesUpgrading packages:
~/.local/bin/brew-upgrade.sh # Updates all brew packages to latest versionsHow it works:
packages.ymldefines what should be installedrun_onchange_darwin-install-packages.shauto-runs when packages.yml changes- Upgrade script separately handles updating existing packages
Setup:
- Neovim config lives in separate repo: emmandev/lazyvim
- Chezmoi syncs it to
~/.config/nvimwith weekly refresh (refreshPeriod = "168h") - Plugins managed by lazy.nvim (not chezmoi)
Updating:
# Update LazyVim framework + plugins (inside Neovim)
:Lazy update
# Update your personal config (if you made changes)
cd ~/.config/nvim && git pull # or: chezmoi updateAdding plugins:
- Edit files in
~/.config/nvim/lua/plugins/ - Commit and push to emmandev/lazyvim
- Changes sync automatically via chezmoi refresh
| Command | Purpose |
|---|---|
chezmoi apply |
Apply dotfile changes to system |
chezmoi edit <file> |
Edit source file (e.g., chezmoi edit ~/.zshrc) |
chezmoi update |
Pull latest from external repos (oh-my-zsh, nvim, etc.) |
chezmoi diff |
Preview what will change before applying |
chezmoi cd |
Navigate to source directory |
Shell:
- zsh (with oh-my-zsh, powerlevel10k, autosuggestions, syntax-highlighting)
Development:
- Neovim (LazyVim) - external repo
- tmux + tpm plugins
- Git configuration
Tools:
- Aerospace (window manager)
- Ghostty (terminal)
- Yazi (file manager)
- Sesh (tmux session manager)
External Resources (auto-updated):
- oh-my-zsh (weekly)
- zsh plugins (weekly)
- Neovim config (weekly)
- tmux plugins
~/.local/share/chezmoi/
├── .chezmoidata/
│ └── packages.yml # Homebrew package definitions
├── .chezmoiexternal.toml # External repo references
├── scripts/
│ └── executable_brew-upgrade.sh # Manual brew upgrade script
├── dot_config/
│ ├── ghostty/ # Terminal config
│ ├── sesh/ # Session manager
│ ├── tmux/ # Tmux configuration
│ └── yazi/ # File manager
├── dot_zshrc # Zsh configuration
├── dot_aerospace.toml # Window manager config
└── run_onchange_darwin-install-packages.sh.tmpl
Check what will change before applying:
chezmoi diffForce re-run package installation:
chezmoi state delete-bucket --bucket=scriptState
chezmoi applyVerify external resources:
chezmoi update --verbose