Cleanup
Use this page when you want to remove the changes dot made to a machine. The safe first step is always dot clean; everything after that is optional and more destructive.
Remove stowed links
Section titled “Remove stowed links”dot clean only removes symlinks managed by GNU Stow. It unstows the private overlay first when it is available, then the public packages.
dot cleanThis does not remove packages, cloned repositories, pacman config, firewall rules, systemd user units, shell changes, generated agent instruction copies, logs, or backup files.
Restore backed-up files
Section titled “Restore backed-up files”dot install, dot init, and dot stow move conflicting live files into backup paths instead of deleting them. Check the public/private repo backup directories and any Omarchy init backups before removing the repos.
ls ~/.config/dotfiles/backupls ~/.config/dotfiles-private/backupls ~/.config/*.dot-init-backup-*Move back only the files you still want to keep.
Disable user services
Section titled “Disable user services”Disable user timers/services that were enabled from these dotfiles.
systemctl --user disable --now dot-doctor-startup.timersystemctl --user disable --now daily-volume-zero.timersystemctl --user daemon-reloaddaily-volume-zero.timer only exists on laptop stow packages, so that command may report that the unit is missing.
Remove synced agent instruction copies
Section titled “Remove synced agent instruction copies”dot init runs dot agents-sync, which mirrors the global OpenCode agent instructions into other harnesses. Remove these only if you want those harnesses unmanaged too. Check for the dot agents-sync header before deleting anything you may have edited by hand.
grep -H "dot agents-sync" ~/.cursor/rules/global-agents.mdc ~/.claude/CLAUDE.mdrm -f ~/.cursor/rules/global-agents.mdc ~/.claude/CLAUDE.mdRemove managed firewall rules
Section titled “Remove managed firewall rules”dot init adds managed ufw allow rules when ufw is installed. Delete only the rules you no longer want.
sudo ufw status numberedsudo ufw delete <number>sudo ufw reloadThe managed rules are labelled in ufw status with their purpose, for example KDE Connect, Home Assistant, OpenCode server, LocalSend, and libvirt.
Remove public pacman repo config
Section titled “Remove public pacman repo config”Remove the managed include and snippet, then refresh package databases. Do not replace the signed configuration with TrustAll or another relaxed signature policy.
sudoedit /etc/pacman.confsudo rm -f /etc/pacman.d/timmo.confsudo pacman-key --delete F94469C08E3B717014E2815FA026A3671E9151DAsudo pacman -SyuRemove this line from /etc/pacman.conf if present:
Include = /etc/pacman.d/timmo.confExisting installed packages remain installed. AUR helpers remain available and can build subsequent versions from AUR. To recover a damaged or removed setup, run dot setup-public-repo; it downloads the key again and refuses to trust it unless the full fingerprint matches.
Remove private pacman repo config
Section titled “Remove private pacman repo config”If dot setup-private-repo or dot init registered the private package repo, remove the include line and snippet manually.
sudoedit /etc/pacman.confsudo rm -f /etc/pacman.d/timmo-private.confsudo pacman -SyRemove this line from /etc/pacman.conf if present:
Include = /etc/pacman.d/timmo-private.confIf your private config overrides DOT_PRIVATE_PACMAN_REPO_CONFIG or DOT_PRIVATE_PACMAN_MAIN_CONFIG, use those paths instead.
dot setup-private-repo also syncs a local file:// mirror from the private package repo config. If you want to remove that mirror and source clone too, check path= and mirror_path= in ~/.config/dotfiles-private/.dot-private-package-repo and remove only those directories.
Remove pacman hooks
Section titled “Remove pacman hooks”Public/private pacman hooks are installed into /etc/pacman.d/hooks from stowed hook sources. Remove only hooks that came from these dotfiles.
ls ~/.config/pacman-hooksls /etc/pacman.d/hookssudo rm /etc/pacman.d/hooks/<hook-name>.hookRestore the login shell
Section titled “Restore the login shell”dot init sets the login shell to zsh when needed. Change it back if you no longer want zsh as the login shell.
chsh -s /bin/bash "$USER"If init added /usr/bin/zsh to /etc/shells, leave it unless you know nothing else on the machine needs it.
Remove Git config include
Section titled “Remove Git config include”dot init adds the managed Git include to your global Git config. Remove it if you no longer want Git to load the stowed dotfiles settings.
git config --global --fixed-value --unset-all include.path "~/.config/git/config.dotfiles"Revert generated locales
Section titled “Revert generated locales”dot init ensures en_GB.UTF-8 is enabled in /etc/locale.gen and runs locale-gen. Leave the locale in place unless you specifically want to remove it.
sudoedit /etc/locale.gensudo locale-genRemove cloned repos and state
Section titled “Remove cloned repos and state”After the stowed links and system config are removed, delete cloned repos and generated state only if you no longer need them.
rm -rf ~/.config/dotfiles-privaterm -rf ~/.local/state/dot ~/.cache/dotPrivate package repos and other private Git clones are configured by the private overlay. Review ~/.config/dotfiles-private/.dot-private-package-repo and ~/.config/dotfiles-private/dot-git.yml, then remove only clones and mirrors you no longer need.
If you removed stowed config directories that Omarchy should own again, refresh the stock Omarchy defaults afterwards. Quattro’s UWSM defaults are package-owned under /usr/share, so there is no uwsm/env user config to refresh.
omarchy refresh shellomarchy refresh hyprlandomarchy refresh config ghostty/configRun omarchy refresh --help on the target machine for the exact refresh commands supported by that Omarchy version.
Do not remove ~/.config/dotfiles until you no longer need the dot binary, docs, or backup directory.
Remove installed packages
Section titled “Remove installed packages”dot init installs the public/private package lists but does not track ownership of packages afterwards. Removing packages is intentionally manual. This command only covers the default public package list; if you override DOT_PUBLIC_PACKAGES_FILE, use that file instead.
comm -12 <(sort ~/.config/dotfiles/.dot-public-packages) <(pacman -Qq | sort)Review that output, then remove only packages you no longer use.
sudo pacman -Rns <package>For private packages, review the private package list before removing anything.
dot install and dot init may also install setup prerequisites such as stow, gum, or mise when they are missing. Remove those manually only if nothing else uses them.
Remove mise-managed tools
Section titled “Remove mise-managed tools”dot init runs mise install, which can install language and CLI tool versions from the stowed mise config. Remove only versions you no longer use.
mise ls --installedmise uninstall <tool@version>Remove GitHub CLI extensions
Section titled “Remove GitHub CLI extensions”dot init installs the GitHub CLI extensions listed in .dot-gh-extensions when gh is available. Remove only extensions you no longer want.
gh extension listgh extension remove <owner/repo>Final check
Section titled “Final check”Run doctor after cleanup to see what managed state remains. It will report missing dotfiles pieces if the repo is partly removed, which is expected during a full uninstall.
dot doctor