Personal dotfiles for macOS and Ubuntu/Debian, managed with
chezmoi. Each program's configuration lives under
dot_config/<program>/, which chezmoi deploys to ~/.config/<program>/.
git clone https://github.com/azech-hqs/dotfiles.git ~/Development/dotfiles
~/Development/dotfiles/bootstrap.shbootstrap.sh installs chezmoi (Homebrew on macOS, the static-binary installer
on Linux), points it at this repo as its source directory, and runs
chezmoi apply. It is safe to re-run.
This repo is chezmoi's source of truth; chezmoi deploys copies into $HOME
(not symlinks). Typical workflow:
chezmoi diff # preview pending changes to $HOME
chezmoi apply # write changes into $HOME
chezmoi edit ~/.config/nvim/init.lua # edit the source, then apply
chezmoi re-add # pull edits made directly in ~/.config back into the repo
chezmoi cd # open a shell in the source repoBecause deployed files are copies, edits made directly in ~/.config must be
captured back with chezmoi re-add (or made via chezmoi edit).
The shell config is split into modular files under dot_config/zsh/ (deployed
to ~/.config/zsh/), loaded in numeric order: 00-env (machine-agnostic env)
→ 10-* (per-tool glue) → 20-aliases → 30-keymaps.
~/.zshrc itself is not owned by chezmoi. Instead modify_dot_zshrc
injects a single managed block at the end of whatever ~/.zshrc already exists
on the machine — that block just sources ~/.config/zsh/*.zsh. Everything
outside the block (oh-my-zsh setup, per-machine source lines) is preserved, so
machines with different base ~/.zshrc files can share these dotfiles.
The 10-*.zsh files are a stopgap: tool installation/PATH/init lines that
will move to a separate provisioning repo (ansible) once it exists, so each tool
brings its own shell glue (and OS-correct paths) when installed. Because
~/.config/zsh/ is not an exact_ directory, provisioning can drop additional
*.zsh files there without chezmoi apply removing them.
tmux plugins are not deployed as dotfiles — .chezmoiignore excludes
.config/tmux/plugins, and tmux.conf runs them from there. They are
installed instead by .chezmoiscripts/run_once_after_install-tmux-plugins.sh,
which clones each plugin at a pinned tag (no TPM: one manager, and the
version lives in git).
To bump a plugin, edit the version in that script and run chezmoi apply —
chezmoi keys run_once_ scripts on their contents, so changing the tag makes it
re-run and move the existing checkout onto the new tag.
Currently pinned:
| plugin | version |
|---|---|
| catppuccin/tmux | v2.3.0 |
The theme block in dot_config/tmux/tmux.conf uses v2 option names. v2
renamed or removed most of the v1/v0.3 ones (@catppuccin_window_default_text →
@catppuccin_window_text, the _fill and @catppuccin_status_fill options are
gone), and unknown @catppuccin_* options fail silently — so the config and the
pinned version have to move together.
Per-OS templating and secrets (SSH keys / API tokens pulled from KeePassXC and Proton Pass) are work in progress.