chezmoi source for `$HOME`. `mode = "symlink"`: plain files in `$HOME` are symlinks into this repo, so editing `~/.config/foo/bar` edits `dot_config/foo/bar` directly. Templates (`*.tmpl`), `private_`, `executable_` targets are rendered copies — edit the source, then `chezmoi apply`.
Config lives in three places. Check which one before editing.
## 1. Local (this repo)
`dot_*` trees committed here. Edit in place, commit here. Docs for each tool are in `docs/`; update the matching page when behavior changes.
- Never edit a rendered copy of a `.tmpl`; edit the `.tmpl` and run `chezmoi apply <path>`.
`git-repo` externals. chezmoi clones them into `$HOME` when missing and fast-forwards (`--ff-only`) at most every `refreshPeriod`. The source tree holds nothing for these — only the `.toml`.
Editing: `cd ~/.config/<app>` (the live checkout), edit, commit, push there. Nothing to commit in this repo. Do not `chezmoi add` these paths.
Local working copies under `~/Code/github.com/prdlk/<app>` are ordinary clones of the same repos; `~/.config/<app>` is the one chezmoi manages and the one tools read.
Pulling a remote change before the refresh window: `chezmoi apply --refresh-externals ~/.config/<app>` (or `git pull` in the checkout). `--ff-only` means a diverged local checkout silently stays put — commit or stash first.
## Moving a config out to an external
1. Create the repo, copy the files (strip chezmoi prefixes; a `symlink_x` file becomes a real symlink), commit, push.
3.`git rm -r dot_config/<app>`; drop any `<app>`-specific lines from `.chezmoiignore.tmpl` / `.gitignore`.
4.`mv ~/.config/<app> /tmp/bak && chezmoi apply --force ~/.config/<app>`; diff against the repo, then delete the backup.
5. Update `docs/` (the tool's page, `docs/terminal/index.mdx` or sibling index, `docs/chezmoi/externals-and-ignore.mdx`) and any alias pointing at the old source path (`dot_config/fish/conf.d/20-aliases.fish`, `.chezmoidata/aliases.yaml`).
## Packages: every referenced tool must be declared
`.chezmoidata/packages.yaml` is the install manifest; the goal is `chezmoi init --apply` on a fresh Arch (Omarchy) machine yields a working setup. When a config, script, tmux-palette item, television cable `requirements`, or compositor binding starts calling a new binary, declare its package in the same change:
Find the package with `pacman -Qo "$(command -v <bin>)"`; `pacman -Qm` lists AUR/foreign packages, `pacman -Si <pkg>` shows the repo (`extra` vs `omarchy`). Verify names before committing: `pacman -Si` for repo packages, `https://aur.archlinux.org/rpc/v5/info?arg[]=<pkg>` for AUR, `https://formulae.brew.sh/api/formula/<name>.json` for brew, `mise registry <tool>` for mise (no registry entry: use a backend spec such as `github:owner/repo`). Hyprland/Waybar/`omarchy-*` come with Omarchy and are not declared. CLIs that mise can install (omp, opencode, …) go in `shared.mise`, not a curl installer; `15-tools` curl-installs only rustup and strata. `shared.mise` mirrors the global `~/.config/mise/config.toml`: a tool added there with `mise use -g` belongs in the list too.