Cookbook
Cookbook: Troubleshooting
Symptom → cause → fix.
Installation
Symptom: install.sh fails with "chezmoi not found"
Cause: /usr/local/bin or ~/.local/bin not in PATH at install time.
Fix:
# Re-run only the installer that was release-pinned and SHA256-verified.
Symptom: "could not create directory ~/.local/share/chezmoi"
Cause: Permission issue on ~/.local.
Fix:
Symptom: Install hangs at "Downloading chezmoi"
Cause: Slow network or corporate proxy.
Fix:
# if applicable
# Or pre-download chezmoi manually
Apply / Sync
Symptom: dot apply reports "file modified, skipping"
Cause: Chezmoi detected local drift on a managed file.
Fix:
# OR
Symptom: "template: error calling index"
Cause: A template references a missing data field.
Fix: Check that the field exists in defaults/.chezmoidata.toml or defaults/.chezmoidata/*.toml. Machine presets are [machines.<name>] tables in defaults/.chezmoidata/hardware.toml; a machine value that names no preset leaves index .machines .machine empty. For example:
Set machine in ~/.config/chezmoi/chezmoi.toml to a preset that exists (macbook-t2, surface-pro, geekom-a9), or leave it empty to use the [hardware] defaults:
[data]
machine = "macbook-t2"
Symptom: Apply succeeds but shell doesn't reflect changes
Cause: Cached init scripts are stale.
Fix:
Theme
Symptom: dot theme shows no themes
Cause: No wallpapers discovered, themes.toml not generated.
Fix:
Symptom: dot theme <name> errors "Unknown command or theme"
Cause: Theme name doesn't exist in themes.toml.
Fix:
Symptom: macOS accent color doesn't update
Cause: System Settings UI cached the old value.
Fix: dot-theme-sync already runs killall -HUP cfprefsd, then killall on SystemUIServer, Dock and "System Settings". If it still doesn't refresh:
Or log out and back in.
Symptom: Wallpaper not applying
Cause: Wrong format or missing DE support on Linux.
Fix:
# Check the wallpaper file exists
# On Linux, verify a HEIC to PNG conversion tool
|| ||
# Install if needed (Debian/Ubuntu):
Symptom: Theme applies but Ghostty doesn't reload
Cause: Ghostty DBus or SIGUSR2 signaling failed.
Fix:
# Restart Ghostty manually, or:
# Or quit+relaunch the app
Secrets
Symptom: "could not decrypt: no age key"
Cause: The age identity is missing or unreadable. chezmoi reads ~/.config/chezmoi/key.txt (the age.identity in ~/.config/chezmoi/chezmoi.toml); SOPS reads ~/.config/sops/age/keys.txt.
Fix:
# Should be: -rw------- 1 user user
# If missing, restore from password manager or regenerate (requires re-encrypting all secrets)
Symptom: SOPS says "wrong recipient"
Cause: Your Age public key isn't listed in the file's recipients.
Fix:
# Add your public key to .sops.yaml
# Or, ask a recipient to re-encrypt for you
Symptom: Plaintext leak detected by gitleaks
Cause: A secret was committed to Git history.
Fix:
# Immediate mitigation
# Rotate the leaked secret upstream (it's now public)
# Rewrite Git history if needed (requires force-push):
Performance
Symptom: Shell startup >500ms
Cause: Heavy modules loaded synchronously.
Fix:
# Identify which module is slow
# Rebuild caches
# Disable heavy modules temporarily
# Edit ~/.config/zsh/.zshrc.local (or equivalent) to skip them
Symptom: dot doctor score show reports a low score
Cause: Multiple health issues.
Fix:
Symptom: Mise tools not found
Cause: Mise shim not activated.
Fix:
Build Artifacts
Symptom: Cargo builds into the project's ./target
Cause: This is the default. ~/.cargo/config.toml deliberately sets no shared target-dir, because Cargo locks the target directory and one shared path makes builds in different projects wait on each other. sccache (when installed) still shares compiled dependencies across projects.
Fix (optional, zsh): keep the output out of the repository by pointing ./target at the private build cache:
Symptom: $DOT_BUILD_ROOT is unset or missing
Cause: The shell predates the change, or mise is not activated. DOT_BUILD_ROOT is ~/.cache/dot/builds (under XDG_CACHE_HOME). mise exports it, and zsh and fish set it on start; the Go, pip, uv and Zig caches live below it.
Fix:
|
Fleet
Symptom: dot fleet apply hangs
Cause: A fleet host is unreachable.
Fix:
# Check connectivity to each SSH target
for; do
||
done
# Apply to the reachable hosts one at a time, or remove the unreachable
# ones from ~/.config/dotfiles/fleet.toml temporarily
Symptom: Git shows a signed commit as untrusted
Cause: The signer's SSH public key is not in ~/.config/git/allowed_signers (git's gpg.ssh.allowedSignersFile).
Fix: That file is managed by chezmoi, so add the key to the source, defaults/dot_config/git/allowed_signers.tmpl, as <email> ssh-ed25519 <key>, then:
CI
Symptom: PR fails on "Lint / Shell (Zero Warnings)"
Cause: shfmt formatting differs from canonical.
Fix:
# Commit the changes
Symptom: PR fails at the "Enforce module coverage" step
Cause: New code added without tests. The gate runs in "Test / Unit Tests" (100% in ci-enforced.yml) and "Test / Unit" (98% in ci.yml).
Fix:
MIN_COVERAGE=100
# Lists uncovered modules
# Add a test in tests/unit/<domain>/test_<module>.sh
Symptom: Checkov SARIF upload times out
Cause: Known infrastructure flake (Azure runner slow apt mirrors).
Fix: The workflow already guards this with hashFiles('reports/checkov.sarif'). If you see this after the guard was added, check the Checkov step output for errors.
Getting More Help
- Check FAQ
- Read the relevant concept chapter
- Open an issue: https://github.com/sebastienrousseau/dotfiles/issues
When filing an issue, include: