Packages and aliases
The .chezmoidata YAML files that declare every installed package and every shared shell alias, and how they render.
Files in .chezmoidata/ are merged into chezmoi’s template data on every run. Nothing in the directory is written to $HOME; the data only reaches the machine through templates and scripts.
| File | Data key | Consumed by |
|---|---|---|
.chezmoidata/packages.yaml |
.packages |
run_onchange_before_10-packages.sh.tmpl, run_onchange_after_20-gh-extensions.sh.tmpl |
.chezmoidata/aliases.yaml |
.aliases |
dot_config/shell/aliases.sh.tmpl (bash and zsh) |
packages.yaml
One manifest per platform, plus a shared block. Any edit to the file changes the hash embedded in the package script, so the next chezmoi apply re-runs the install. Installs are idempotent (pacman --needed, paru --needed, brew install on already-installed formulae).
packages.arch.pacman, installed on every Linux machine with pacman -S --needed --noconfirm:
| Group | Packages |
|---|---|
| Shell and editors | fish, neovim, tmux, micro |
| Terminal | kitty |
| TUI tools | yazi, lazygit, lazydocker, btop, fastfetch |
| VCS and forge | git, github-cli, git-delta, diffnav |
| Search and files | fzf, fd, ripgrep, zoxide, eza, bat, jq, duf |
| Media and preview (yazi deps) | ffmpeg, ffmpegthumbnailer, poppler, resvg, imagemagick, 7zip, unzip |
| Misc CLI | gum, glow, atuin, wget, starship, zsh-syntax-highlighting |
| Fonts | ttf-victor-mono-nerd |
packages.arch.aur, installed with paru -S --needed --noconfirm on every Linux machine: topgrade.
packages.arch.desktop, added only for roles desktop and laptop:
| Source | Packages |
|---|---|
| pacman | niri, xdg-user-dirs |
| AUR | noctalia-shell |
packages.darwin.brew, installed with brew install:
fish, neovim, tmux, yazi, lazygit, lazydocker, btop, fastfetch, git, gh, git-delta, fzf, fd, ripgrep, zoxide, eza, bat, jq, duf, ffmpeg, ffmpegthumbnailer, poppler, resvg, imagemagick, sevenzip, gum, glow, atuin, starship, zsh-syntax-highlighting, topgrade
packages.darwin.cask, installed with brew install --cask: kitty, font-victor-mono-nerd-font.
Compared with Arch, macOS has no micro, diffnav, unzip, or wget, and gets topgrade from Homebrew instead of the AUR. The role does not change the macOS list.
packages.shared.gh_extensions, installed by the gh-extensions script on every OS:
| Extension | Purpose |
|---|---|
davidraviv/gh-clean-branches |
gh clean-branches: delete local branches whose upstream is gone |
prdlk/gh-commit |
gh commit |
dlvhdr/gh-dash |
gh dash: PR and issue dashboard |
meiji163/gh-notify |
gh notify: notifications in the terminal |
packages.shared.go is an empty list. packages.shared.cargo lists suvadu. No script in the repo reads either key; they document intent only, and cargo installs are kept current by topgrade’s [cargo] step.
aliases.yaml
The single source for aliases shared across shells. Each entry has a section and a list of { name, cmd } items.
Editors / file managers
| Alias | Command |
|---|---|
e |
nvim |
e.d |
cd ~/.config/dotstate/storage/Rogz/.config && yazi |
e.f |
cd ~/.config/fish && yazi |
e.k |
yazi ~/.config/kitty |
e.n |
yazi ~/.config/niri |
e.v |
yazi ~/.config/nvim/lua |
e.y |
yazi ~/.config/yazi |
e.t |
nvim ~/.config/tmux/tmux.conf |
hx |
helix |
Quick directory jumps
| Alias | Command |
|---|---|
cdc |
cd ~/.config && yazi |
cdd |
cd ~/Developer && yazi |
cdk |
cd ~/Documents/Knowledge && obsidian |
cdl |
cd ~/.local && yazi |
cds |
cd ~/.local/share/services && ls |
cdw |
cd ~/Downloads && yazi |
Tools
| Alias | Command |
|---|---|
dd |
lazydocker |
gg |
lazygit |
ff |
exec fish |
npx |
bunx |
sm |
sudo micro |
sd |
ssh prad@<lan-host> |
oc |
opencode |
dss |
dotstate sync |
fabric |
fabric-ai |
bk |
bead-kanban |
sua |
shelly upgrade-all -n |
lc |
leetcode |
tk |
task |
dd shadows coreutils dd in interactive shells.
How aliases render
bash and zsh
dot_config/shell/aliases.sh.tmpl renders to ~/.config/shell/aliases.sh. Because it is a template it is written as a real file, not a symlink; edit the YAML and run chezmoi apply to regenerate it.
{{- range .aliases }}
# {{ .section }}
{{- range .items }}
alias {{ .name }}='{{ .cmd }}'
{{- end }}
{{- end }}
After the generated block the file adds shell-specific pieces that are not in the YAML:
| Name | Definition |
|---|---|
cpy / pst |
wl-copy / wl-paste when wl-copy exists, else pbcopy / pbpaste when pbcopy exists |
q |
Function: if $YAZI_ID is set and ya exists, runs ya emit quit so the parent yazi also exits, then exit |
celar, claer |
Typo guards for clear |
ls |
eza --icons, when eza is installed |
~/.bashrc and ~/.zshrc source it for interactive shells:
[ -f "$HOME/.config/shell/aliases.sh" ] && . "$HOME/.config/shell/aliases.sh"
See bash and zsh for the rest of those files.
fish
dot_config/fish/conf.d/20-aliases.fish is not a template. It is a hand-maintained plain file (symlinked into ~/.config/fish/conf.d/) whose header says it is generated from the YAML; the YAML header likewise names a 20-aliases.fish.tmpl that does not exist. The fish file has drifted from aliases.yaml:
| Alias | aliases.yaml (bash/zsh) | fish |
|---|---|---|
e.d |
cd ~/.config/dotstate/storage/Rogz/.config && yazi |
not defined |
e.f |
cd ~/.config/fish && yazi |
cd ~/.local/share/chezmoi/dot_config/fish && yazi |
e.h |
not defined | cd ~/.local/share/chezmoi/dot_config/hypr && yazi |
e.k |
yazi ~/.config/kitty |
yazi ~/.local/share/chezmoi/dot_config/kitty |
e.n |
yazi ~/.config/niri |
yazi ~/.local/share/chezmoi/dot_config/niri |
e.y |
yazi ~/.config/yazi |
yazi ~/.local/share/chezmoi/dot_config/yazi |
e.t |
nvim ~/.config/tmux/tmux.conf |
nvim ~/.local/share/chezmoi/dot_config/tmux/tmux.conf |
cdd |
cd ~/Developer && yazi |
not defined |
,, |
not defined | cd ~/.local/share/chezmoi && yazi |
.. |
not defined | cd .. |
fish-only Bun aliases:
| Alias | Command |
|---|---|
br |
bun run |
br.d |
bun run dev |
br.b |
bun run build |
br.t |
bun run test |
bi |
bun install |
bg |
bun install -g (shadows fish’s bg job-control builtin) |
bx |
bunx |
Every other YAML alias (e, e.v, hx, cdc, cdk, cdl, cds, cdw, and the whole Tools section) is defined identically in fish. The file ends with the same extras as the sh version: cpy/pst clipboard detection, the q function, and, in interactive sessions only, celar/claer and ls → eza --icons. clear itself is an autoloaded function (functions/clear.fish), which is why it is not aliased. See fish.