Personal configuration files for my development environment.
Automation can copy or symlink entire trees without per-file mapping:
config/— XDG-style application configs (Neovim, Ghostty, Zellij, Alacritty, Kitty, Oh My Posh themes, etc.). Paths inside these files avoid machine-specific locations where possible (e.g. Neovim usesstdpath()for cache/state; Alacritty theme imports use$HOME/.config/...).home/— Dotfiles meant for the home directory (e.g..zshrc,.bashrc,.tmux.conf,.vimrc). OS-specific zsh snippets live underhome/zsh/and are sourced fromhome/.zshrcafter resolving the repo root. Tmux 3.1+ can use~/.config/tmux/tmux.conf; this repo still ships~/.tmux.conffor broad compatibility.
home/.zshrc sets DOTFILES to the repository root by:
- Reading
~/.dotfiles_pathif it exists and still points at a tree that containshome/zsh/, or - Searching a few common locations once, then writing the result to
~/.dotfiles_pathso the next login avoids repeated filesystem checks.
Override DOTFILES in ~/.local_extras if your clone lives somewhere
else.
home/.zshrc exports standard defaults when unset (XDG Base Directory spec):
| Variable | Default |
|---|---|
XDG_CONFIG_HOME |
$HOME/.config |
XDG_DATA_HOME |
$HOME/.local/share |
XDG_CACHE_HOME |
$HOME/.cache |
XDG_STATE_HOME |
$HOME/.local/state |
Tools that respect these (including many terminals and Neovim) can find configs
under ~/.config without littering $HOME.
From the repository root, ./setup.sh:
- Verifies
config/andhome/exist before doing anything. - If
.gitmodulesis present, runsgit submodule update --init --recursiveonly when submodules are not yet initialized; otherwisegit submodule update --recursive. Safe to run repeatedly.
GitHub Actions runs StyLua on config/nvim and ShellCheck on
setup.sh and home/zsh/*.zsh.
- Alacritty —
config/alacritty/ - Ghostty —
config/ghostty/ - Kitty —
config/kitty/ - Zellij —
config/zellij/ - Oh My Posh — Prompt themes (
config/oh-my-posh/)
- Neovim —
config/nvim/; plugins via lazy.nvim. Options live inlua/config/lazy.lua(install.missing = true,change_detection.enabled = falsefor non-interrupting installs and automation).lazy-lock.jsonis committed so plugin revisions match across machines. Example headless sync:XDG_CONFIG_HOME=/path/to/this/repo/config nvim --headless "+Lazy! sync" +qa - VS Code —
vs-code/
- Taskwarrior —
taskwarrior/(includes a themes submodule)
These are my personal configurations. Feel free to browse and adapt them for your
own use. Machine-specific settings can live in ~/.local_extras, which is sourced
from home/.zshrc and home/.bashrc when present.
MIT License — see LICENSE for details.