~/.atuin/bin held an old standalone atuin (18.19.0) that the shells prepended to PATH, shadowing pacman's /usr/bin/atuin (18.21.0). The daemon runs the packaged binary and migrated the history DB, so every shell command through the old one failed with "migration 20260818000000 was previously applied but is missing in the resolved migrations". Drop conf.d/atuin.env.fish, the `. ~/.atuin/bin/env` lines in .bashrc and .zshrc (atuin init is now guarded on `command -v atuin`), the cargo-dist receipt, and atuin-pick's ~/.atuin/bin fallback. Also drop `atuin ai init fish`, which 18.21 removed; config.fish already carries the `?` binding it emitted.
dotfiles
Managed with chezmoi. Docs: https://dots.prd.lk. One command on any machine:
curl -fsSL https://dots.prd.lk/install | sh
# or, cloning over SSH:
sh -c "$(curl -fsSL https://dots.prd.lk/install)" -- init --apply --ssh prdlk/dotfiles
/install is chezmoi's get.chezmoi.io/lb script vendored in public/install,
defaulting to init --apply prdlk/dotfiles. The docs site (docs/, public/,
blume.config.ts) deploys to GitHub Pages via .github/workflows/docs.yml.
First apply prompts once for name, email, and machine role
(desktop | laptop | mac | server). Role gates the Linux desktop
layer (niri, noctalia, fontconfig, systemd user units) — mac and
server get the universal toolset only.
Prerequisites
-
Arch:
parufor AUR packages (optional — the install script warns and skips AUR if missing).sudofor pacman. -
macOS: Homebrew.
-
Secrets:
age-encrypted files need the key at~/.config/chezmoi/key.txt. Copy it there beforechezmoi apply(distributed manually, never committed):mkdir -p ~/.config/chezmoi scp <existing-machine>:.config/chezmoi/key.txt ~/.config/chezmoi/key.txt chmod 600 ~/.config/chezmoi/key.txt
What's managed
Universal: fish, bash + zsh (starship prompt, shared aliases), nvim
(AstroNvim), tmux, kitty, yazi, lazygit, lazydocker, gh (+ extensions),
starship, git, ssh config, Claude Code (settings/commands/hooks/skills).
Packages declared in .chezmoidata/packages.yaml, installed by
.chezmoiscripts (idempotent, re-run when the manifest changes).
Aliases are defined once in .chezmoidata/aliases.yaml and rendered
into fish (fish/conf.d/20-aliases.fish) and bash/zsh
(~/.config/shell/aliases.sh, sourced by .bashrc/.zshrc).
Shell utilities live as standalone sh/bash executables in
~/.local/bin (ai, c2p, fab, gdc, ghn, ghg-clone, git-summary,
mdp, mdcp, mtime-sort, pj, …) so all shells share one implementation.
Helpers that must mutate shell state (cd-style: yy, c, cd, ghg/ghn
wrappers, gho, clip-last) are per-shell functions in fish/functions/,
bash/functions/, and zsh/functions/.
Agent skills are not vendored: .chezmoidata/skills.yaml lists every
skill and its upstream source, and
.chezmoiscripts/run_onchange_after_25-skills.sh.tmpl installs them into
~/.agents/skills (plus ~/.claude/skills links) with the Skills CLI
whenever that file changes, removing skills it installed earlier that are
no longer listed.
Linux desktop (role desktop/laptop only): niri, noctalia,
fontconfig, mimeapps, systemd user units, niri-launch.
gh needs gh auth login once per machine; the extension install
script skips gracefully until then, and re-runs on the next apply.
See MIGRATION-NOTES.md for the dotstate → chezmoi migration record.