Troubleshooting¶
Solutions to common issues with this dotfiles setup.
[!TIP] Run
mise run doctorfirst—it can automatically detect many common configuration issues.
Diagnostic Flowchart¶
flowchart TD
A[Something isn't working] --> B{Fresh install?}
B -->|Yes| C{mise available?}
B -->|No| D{What broke?}
C -->|No| E["Restart shell: exec \$SHELL -l"]
C -->|Yes| F["Run: mise run doctor"]
D --> G{Shell startup?}
D --> H{Missing tool?}
D --> I{WSL-specific?}
G -->|Slow| J["Run: mise run profile"]
G -->|Error| K["Check syntax: zsh -n ~/.zshrc OR bash -n ~/.bashrc"]
H --> L["Run: mise install"]
I --> M[See WSL-Specific Issues below]
F --> N{Errors found?}
N -->|Yes| O["Run: mise run install"]
N -->|No| P[Check specific section below] Fresh Install Issues¶
Issue: Bootstrap "hangs" or waits indefinitely¶
Symptoms: The install script stops and doesn't proceed.
Cause: The script is interactive and might be waiting for your confirmation (e.g., "Continue? [y/N]") or for you to generate keys.
Fix: Ensure you are running it in an interactive terminal.
Issue: "mise: command not found"¶
Symptoms: After running bootstrap, mise commands don't work.
Cause: Mise was installed but shell hasn't been restarted.
Fix:
# Restart your shell
exec "$SHELL" -l
# Or source mise manually (choose your shell)
eval "$(~/.local/bin/mise activate zsh)" # zsh
eval "$(~/.local/bin/mise activate bash)" # bash
Prevention: Always restart your shell after initial install.
Issue: mise ERROR no task install found¶
Symptoms: Bootstrap reaches install, then fails with: no task install found, but a non-executable file exists at .../mise-tasks/install
Cause: Task shim file permissions are incorrect in local checkout (commonly caused by cross-device sync/filesystem mode drift; git core.filemode=false can hide this from git status).
Fix:
cd "$DOTFILES_DIR"
git pull --rebase
# Repair execute-bit drift across shell-based tasks
bash scripts/check-shell-script-modes --path mise-tasks --repair
# Optional: confirm environment health and warnings
dots doctor
# Retry bootstrap/install after pulling permission fixes
./scripts/bootstrap
# or
mise run install
Root cause: On WSL2, git often defaults to core.fileMode=false, which prevents it from tracking or restoring execute bits on checkout. Since the dotfiles repo lives on ext4, this setting is unnecessary.
Prevention: - dots doctor now auto-fixes core.fileMode=false when detected - scripts/bootstrap sets core.fileMode=true on fresh clones - Run mise run lint (checks shell script executable bits in mise-tasks/) - Run dots doctor after syncing to a new device
Issue: dots update skips system package updates (sudo would prompt)¶
Symptoms: dots update completes, but prints a warning that system package updates were skipped to avoid a password prompt.
Cause: By default, dots update avoids interactive sudo prompts and skips privileged package-manager upgrade steps when non-interactive sudo is unavailable.
Fix / Intentionally include system package upgrades:
Explicitly skip package-manager upgrades:
Also note: - If gh is already mise-managed, dots update skips the package-manager gh upgrade step automatically - Use dots update --dry-run to see whether the step will run or be skipped (and why)
Issue: dots update refuses to run because the dotfiles repo is dirty¶
Symptoms: dots update exits with a message about unstaged changes.
Cause: The default update flow keeps a clean-worktree guard to avoid rebase/apply conflicts and surprise local changes.
Fix options:
# Recommended: stash automatically and restore after update
dots update --auto-stash
# Advanced: proceed without stashing (you handle conflicts/risk)
dots update --allow-dirty
Notes: - --auto-stash restores changes at the end; if restore conflicts, dots update prints recovery commands. - --auto-stash and --allow-dirty are mutually exclusive.
Issue: dots update says another update is already running¶
Symptoms: dots update fails fast with a lock-file message and suggests --wait-for-lock.
Cause: An update lock now prevents concurrent runs from multiple shells/devices from overlapping.
Fix:
Notes: - The lock lives in your runtime temp dir (for example /tmp/dots-update.lock). - If a previous update crashed, simply re-run; the lock is advisory and tied to the process/file descriptor.
Issue: dots update skips plugin/network steps (fast/offline modes)¶
Symptoms: Update summary shows steps like git pull, plugin syncs, or system package updates as skipped.
Cause: - --offline skips all networked steps - --fast skips plugin updates and system package updates - Default mode may also skip system package updates if sudo would prompt
Debug / inspect planned behavior:
Full run examples:
# Include optional steps (still non-interactive for sudo unless forced)
dots update --full
# Include privileged package upgrades too (may prompt for sudo)
dots update --full --system-updates
Issue: Need to repair common local drift safely without running install/update¶
Symptoms: You want to repair task execute bits or agent symlinks without running a full install/update.
Fix:
What --fix will do (safe/local only): - Repair shell script execute-bit drift under mise-tasks/ - Repair CLAUDE.md / GEMINI.md symlinks to AGENTS.md - Create a few safe local directories if missing
What it will not do: - sudo package installs - network/plugin updates - shell/login-shell changes
Issue: mise reports "Config files ... are not trusted" when cd into a project¶
Symptoms: Changing into a repo with .mise.toml prints an untrusted config error.
Cause: mise trust is path-based and per-project. A sibling directory is not auto-trusted just because another repo under the same parent is trusted.
Fix:
# Trust this project's config
mise trust -C ~/path/to/project
# Or ignore this project's config in the future
mise trust --ignore -C ~/path/to/project
Zsh behavior in this dotfiles repo: - On first entry into an untrusted repo, the shell shows one prompt: - [t]rust -> runs mise trust -y -C <repo> - [i]gnore -> runs mise trust --ignore -y -C <repo> - [s]kip (or Enter) -> no change, prints manual commands - The prompt is shown once per directory per shell session to avoid repeated noise.
Non-interactive shells: No prompt is shown; the shell prints the exact commands to run manually.
Issue: Install fails at chsh / can't change default shell¶
Symptoms: mise run install fails near the end with errors about chsh, sudo, or a missing/empty user.
Cause: Changing the default login shell is environment-specific and can fail in non-interactive environments (CI/containers), or when sudo/user accounts aren't available. Also, in server mode this project keeps the current shell by default.
Current behavior: - Interactive installs now prompt before running chsh. - If the system login shell is already zsh, the prompt is skipped. - If install cannot confirm the account shell from system records, reruns keep prompting instead of trusting the current $SHELL.
Fix:
# Re-run install and choose "n" at the shell-change prompt
mise run install
# Optional: change manually on workstations
chsh -s "$(command -v zsh)"
Automation note: In CI/non-interactive environments, shell changes are skipped automatically. You can also force skip with DOTFILES_SKIP_CHSH=1.
Issue: Install fails during doctor on minimal systems/containers¶
Symptoms: mise run install fails at the very end during mise run doctor, often due to missing optional packages (e.g., tmux).
Cause: doctor is a health check that assumes a fairly complete environment. On minimal images/containers, it may report errors.
Fix:
# Skip running doctor as part of install
DOTFILES_SKIP_DOCTOR=1 mise run install
# Or run the health check separately after installing missing dependencies
mise run doctor
Note: In CI/non-interactive environments, the install task skips running doctor automatically.
Issue: Dotfiles not applying¶
Symptoms: Running mise run install or chezmoi apply doesn't update files.
Cause: Chezmoi config needs re-initialization or file already exists.
Fix:
# Re-init chezmoi (handles template changes)
chezmoi init --source $DOTFILES_DIR --apply --force
# Or check diff first
chezmoi diff --source $DOTFILES_DIR
Prevention: Use dots cz reinit to re-init when you see "config file template has changed" warning.
Issue: Unexpected repository files appear directly in ~¶
Symptoms: Files like ~/CODE_OF_CONDUCT.md, ~/tests, ~/ansible, or ~/config/site appear after install/update.
Cause: Those paths were not excluded by .chezmoiignore, so chezmoi treated repo artifacts as managed home files.
Fix:
# 1) Pull latest ignore patterns
cd "$DOTFILES_DIR"
git pull --rebase
# 2) Remove existing artifacts from home (safe paths only)
rm -rf ~/CODE_OF_CONDUCT.md ~/CONTRIBUTING.md ~/DNS-FIX-SUMMARY.md ~/GEMINI.md ~/SECURITY.md
rm -rf ~/cliff.toml ~/mise-server.toml ~/ansible ~/config ~/examples ~/mise-profiles ~/mkdir ~/tests
# 3) Re-apply dotfiles
mise run install
Prevention:
# Verify unwanted root-level paths are not managed
chezmoi managed | rg '^(CODE_OF_CONDUCT\.md|CONTRIBUTING\.md|DNS-FIX-SUMMARY\.md|GEMINI\.md|SECURITY\.md|cliff\.toml|mise-server\.toml|ansible|config|examples|mise-profiles|mkdir|tests)(/|$)'
Issue: Chezmoi keeps asking for email/name¶
Symptoms: Every time you run chezmoi init or update, it prompts for email. Cause: older chezmoi.toml.tmpl didn't check for existing values. Fix: Update to latest template which uses hasKey logic.
Issue: "antidote: command not found"¶
Symptoms: Zsh loads but with errors about antidote.
Cause: Antidote wasn't installed or installation failed.
Fix:
# Install Antidote manually
git clone --depth=1 https://github.com/mattmc3/antidote.git ~/.antidote
# Restart shell
exec zsh
Issue: "~/.secrets missing" warning from doctor¶
Symptoms: mise run doctor shows a warning about missing secrets file.
Cause: Secrets file hasn't been created yet.
# Option A: Manual (unencrypted)
cp ~/repos/dotfiles/dot_secrets.example ~/.secrets
nvim ~/.secrets
# Option B: Encrypted (recommended)
mise run setup-secrets
See Secrets Management for details.
Shell Issues¶
Issue: Enter key behaves strangely in Bash (Ctrl+C needed, output redraw glitches)¶
Symptoms: Commands do not execute normally, output appears in odd order, prompt redraw is broken.
Cause: Enter (Ctrl-M) was rebound in Bash using bind -x, replacing Readline's default accept-line.
Fix:
# Restore default Enter handling for current session
bind '"\C-m": accept-line'
stty sane
reset
exec bash -li
Prevention: - Do not bind Enter in Bash. - Keep shell-specific keybinding tricks in zsh only.
Issue: Default hostname% prompt after reboot (no theme/autocomplete)¶
Symptoms: Prompt shows Jeremy-Surface% (or similar), no Powerlevel10k styling, autosuggestions/completions feel missing.
Cause: Static plugin bundle (~/.zsh_plugins.zsh) is missing or empty, so plugin/theme code never loads.
Fix:
# 1. Verify bundle is present and non-empty
ls -l ~/.zsh_plugins.zsh
wc -c ~/.zsh_plugins.zsh
# 2. Rebuild bundle and compile cache
source ~/.antidote/antidote.zsh
antidote bundle < ~/.zsh_plugins.txt > ~/.zsh_plugins.zsh
zcompile ~/.zsh_plugins.zsh
# 3. Reload shell
exec zsh
Prevention:
Issue: Shell startup is slow (>2s)¶
Symptoms: Opening a new terminal takes several seconds.
Cause: Usually one of: 1. Too many plugins loading 2. Slow network call (atuin sync, zoxide init) 3. Large history file
Fix:
# Profile startup time
time zsh -i -c exit
# For detailed timing
zmodload zsh/zprof
# (add to top of .zshrc, run `zprof` after shell loads)
Common Fixes:
# Defer atuin sync
# In ~/.zshrc.local:
export ATUIN_SYNC_FREQUENCY=0 # Disable auto-sync
# Reduce history size if very large
# In ~/.zshrc, lower HISTSIZE
Issue: Powerlevel10k not loading / ugly prompt¶
Symptoms: Plain prompt, no icons, or gibberish characters.
Cause: Missing Nerd Font or p10k not configured.
Fix:
# 1. Install a Nerd Font (e.g., MesloLGS NF)
# Download from: https://www.nerdfonts.com/
# 2. Set your terminal to use the Nerd Font
# 3. Reconfigure p10k
p10k configure
Issue: Antidote plugins not loading¶
Symptoms: Plugins like zsh-autosuggestions not working.
Cause: Plugin list not being loaded or antidote cache stale.
Fix:
# Clear antidote cache
rm -rf ~/.cache/antidote
# Rebuild plugins
antidote load ~/.zsh_plugins.txt
# Restart shell
exec zsh
Tool Issues¶
Issue: FZF Ctrl+T not showing preview¶
Symptoms: File list appears but no preview pane.
Cause: bat not installed or FZF_CTRL_T_OPTS not set.
Fix:
# Check bat is installed
command -v bat
# If missing, install it
mise install
# Check env var is set
echo $FZF_CTRL_T_OPTS
Issue: zoxide not jumping to directories¶
Symptoms: z command says "no match found".
Cause: zoxide hasn't learned your directories yet.
Fix:
# Check zoxide database
zoxide query -l
# If empty, navigate to directories normally first
cd ~/projects
cd ~/dotfiles
cd /etc
# Now zoxide will remember them
z proj # Should work
Issue: Atuin not syncing history¶
Symptoms: History not appearing on other machines.
Cause: Not logged in or sync disabled.
Fix:
WSL-Specific Issues¶
Issue: Windows commands not found (explorer.exe, etc.)¶
Symptoms: open alias doesn't work, can't run Windows executables.
Cause: WSL interop not working or path not set.
Fix:
# Check interop is enabled
cat /proc/sys/fs/binfmt_misc/WSLInterop
# If missing, in Windows PowerShell (admin):
wsl --shutdown
# Then restart WSL
# Ensure Windows PATH is in WSL path
# In /etc/wsl.conf:
[interop]
appendWindowsPath = true
Issue: DNS resolution failures ("Temporary failure in name resolution")¶
Symptoms: - ping google.com fails but ping 8.8.8.8 works - Internet works after WSL restart but breaks later - Network changes (VPN, sleep/wake) break DNS
Cause: Configuration conflict between WSL's DNS management and systemd-resolved.
Quick Fix:
Detailed Diagnosis & Solutions: See WSL DNS Quick Fix Guide
Prevention: Run mise run doctor regularly to detect DNS configuration issues.
Issue: Slow file access in /mnt/c¶
Symptoms: Commands like ls or git are very slow on Windows drives.
Cause: WSL filesystem translation overhead.
Fix: Work from your Linux home directory instead:
Issue: WSL shuts down unexpectedly / won't stay running¶
Symptoms: WSL terminates after periods of inactivity, SSH sessions drop.
Cause: WSL 2 has an idle timeout (default 60 seconds after last process exits).
Fix (Windows 11 only): Edit or create %USERPROFILE%\.wslconfig:
Then restart WSL:
[!NOTE] This setting is only available on Windows 11. The dotfiles provisioning script (
mise-tasks/setup/provision/windows/install.ps1) will copy a pre-configured.wslconfigif one doesn't exist.
Issue: Clipboard not working¶
Symptoms: Can't copy/paste between terminal and Windows.
Cause: Missing Windows clipboard integration.
Fix: Add to ~/.zshrc.local:
if grep -q "Microsoft" /proc/version 2>/dev/null; then
alias pbcopy="clip.exe"
alias pbpaste="powershell.exe -command 'Get-Clipboard'"
fi
Tmux Issues¶
Issue: TPM plugins not installing¶
Symptoms: Tmux works but plugins (continuum, resurrect) don't load.
Cause: TPM not installed or not initialized.
Fix:
# Install TPM
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# In tmux, install plugins
# Press: prefix + I (capital i)
# Default prefix is Ctrl+b
Issue: Sessions not auto-restoring¶
Symptoms: After reboot, tmux doesn't restore previous session.
Cause: tmux-resurrect needs explicit save, continuum may be misconfigured.
Fix:
# Manually save session
# In tmux: prefix + Ctrl+s
# Check continuum status
# In tmux: prefix + Ctrl+s shows save time
# Verify .tmux.conf has:
set -g @continuum-restore 'on'
Issue: "resurrection file not found" on startup¶
Symptoms: When starting tmux, you see a message saying "resurrection file not found" or "no saved session".
Cause: This is normal for a first-time installation. tmux-resurrect hasn't saved a state file yet, so tmux-continuum has nothing to restore.
Fix: 1. Start tmux normally (ignore the warning). 2. Press Prefix + Ctrl-s to manually save the first state. 3. The warning will disappear on future launches.
Recovery¶
Full Reset¶
If everything is broken and you want to start fresh:
# 1. Uninstall all symlinks
mise run uninstall
# 2. Remove mise tools
rm -rf ~/.local/share/mise
# 3. Remove cached configs
rm -rf ~/.cache/antidote ~/.cache/atuin
# 4. Remove plugin manager
rm -rf ~/.antidote
# 5. Reinstall
cd ~/repos/dotfiles
./scripts/bootstrap
Rollback to Previous State¶
If a recent change broke things:
# View recent changes
cd ~/repos/dotfiles
git log --oneline -10
# Checkout previous version
git checkout HEAD~1
# Reinstall
mise run install
# Test, then if OK, reset to main
git checkout main
Error Message Quick Reference¶
| Error Message | Likely Cause | Fix |
|---|---|---|
mise: command not found | Shell not restarted after install | exec "$SHELL" -l |
chezmoi: command not found | mise tools not installed | mise install chezmoi |
DOTFILES_DIR is not set | Environment not loaded | source ~/.local/bin/env |
DOTFILES_DIR does not exist | Repo not cloned | Clone the dotfiles repo |
Cannot decrypt secrets | Wrong age key | mise run setup-secrets |
age-keygen not found | age not installed | mise install age |
No SSH keys found | Keys not generated | mise run setup-ssh |
pre-commit hooks failed | Linting issues | Fix issues, re-commit |
WIP commit blocked | Pre-push hook active | Rename commit: git commit --amend |
❌ Missing essential tool | Tool not in PATH | mise install then exec "$SHELL" -l |
Getting Help¶
If you can't find a solution here:
- Run
mise run doctorto identify issues - Check CI Troubleshooting for pipeline issues
- Check tool-specific docs linked in TOOLS.md
- Search GitHub issues for the relevant tool