Skip to content
Registry

What gets backed up

dothaven knows over 200 config locations. This list, the registry, is compiled into the binary and is the single source of truth: backup, restore, scan, check, collect, chezmoi-export and the dashboard all read it. If a path below exists on your machine, it is in your backups. Anything else can be added with dothaven include.

Only your user-level (global) setup is listed here. Project-level config, such as a repository’s own .claude/, .mcp.json or .vscode/, lives in the project and travels with its git repository. Run dothaven ready to make sure those repositories are pushed.

How to read the tables

MarkMeaningIn a plain backupIn an encrypted backup
πŸ”‘A credential: logins, keys, tokensLeft out, and listedIncluded
πŸ”’Sensitive config that can hold a secret (an MCP server’s API key in its env, a host name)Included, with secret values redactedIncluded
(none)Ordinary configIncluded (scanned and redacted like everything else)Included

“πŸ”‘ never pushed to GitHub” marks age keys: included in an encrypted file backup, left out of every github push, even an encrypted one (see GitHub).

The list below is generated from the registry itself (a test fails if they disagree), so it is exactly what a backup looks for.

On restore, πŸ”’ and πŸ”‘ files are written owner-only (0600). In a GitHub split push, they go into the encrypted bundle. .npmrc and ~/.ssh/config are credential-adjacent files with a dedicated redactor, so they stay in plain backups with just the token, HostName and IdentityFile masked.

Paths ending in / are folders: everything inside is carried, minus clutter each entry names (caches, logs, plugin downloads, shell history and compiled files). Symbolic links are followed. Where macOS and Linux differ, the macOS path is shown first. Entries marked (macOS) exist only there.

AI tooling

Your global AI setup is often the hardest thing to rebuild by hand: skills and agents you wrote, slash commands, hooks, plugins and marketplaces, and MCP servers configured with API keys. The ai category covers:

  • Claude Code: settings.json (permissions, plugins, marketplaces, hooks, status line, model), ~/.claude.json (user-scope MCP servers, from claude mcp add --scope user), skills, agents (subagents), commands, hooks, output styles, plugins with their marketplaces, keybindings, the status line script, and CLAUDE.md. The whole of ~/.claude.json is carried, including Claude Code’s per-project state. On Linux its login file is carried too; on macOS the login is in the Keychain, which dothaven does not copy, so you sign in again.
  • Claude Desktop: its MCP config.
  • Codex: config.toml (including MCP servers), AGENTS.md, prompts, skills, command rules, and its login (auth.json).
  • Gemini CLI: settings, skills, commands, extensions, GEMINI.md, its login, and its .env with the API key.
  • Cursor: mcp.json, skills, commands, rules and agents; its editor settings, keybindings and snippets are in editor.
  • Windsurf: MCP config, skills, global rules; editor settings and keybindings in editor.
  • Cline (MCP servers in VS Code and Cursor, global rules and workflows), Roo Code (MCP servers, global rules), VS Code MCP servers (mcp.json), opencode, GitHub Copilot CLI, Continue, aider, Goose, Kiro, Amp, Qwen Code and LM Studio.

Local model files (Ollama weights and the like) are not copied. collect records which Ollama models you have so you can pull them again.

The full list

ai

PathWhatHandling
~/.claude/settings.jsonClaude SettingsπŸ”’
~/.claude.jsonClaude Code state & user MCP serversπŸ”’
~/.claude/skills/Claude Skills
~/.claude/agents/Claude subagents
~/.claude/commands/Claude slash commands
~/.claude/hooks/Claude hook scripts
~/.claude/output-styles/Claude output styles
~/.claude/plugins/Claude plugins & marketplaces
~/.claude/keybindings.jsonClaude keybindings
~/.claude/statusline.shClaude status line script
~/.claude/.credentials.jsonClaude Code loginπŸ”‘
~/.claude/CLAUDE.mdCLAUDE.md
~/Library/Application Support/Claude/claude_desktop_config.json (Linux: ~/.config/Claude/claude_desktop_config.json)Claude Desktop MCP configπŸ”’
~/.codex/config.tomlCodex config & MCPπŸ”’
~/.codex/AGENTS.mdCodex AGENTS.md
~/.codex/prompts/Codex prompts
~/.codex/skills/Codex skills
~/.codex/rules/Codex command rules
~/.codex/auth.jsonCodex loginπŸ”‘
~/.cursor/mcp.jsonCursor MCP ConfigπŸ”’
~/.cursor/skills/Cursor Skills
~/.cursor/commands/Cursor commands
~/.cursor/rules/Cursor rules
~/.cursor/agents/Cursor agents
~/.gemini/settings.jsonGemini SettingsπŸ”’
~/.gemini/skills/Gemini Skills
~/.gemini/GEMINI.mdGEMINI.md
~/.gemini/commands/Gemini commands
~/.gemini/extensions/Gemini extensions
~/.gemini/oauth_creds.jsonGemini loginπŸ”‘
~/.gemini/.envGemini .env (API key)πŸ”‘
~/.codeium/windsurf/mcp_config.jsonWindsurf MCP ConfigπŸ”’
~/.codeium/windsurf/skills/Windsurf Skills
~/.codeium/windsurf/memories/global_rules.mdWindsurf global rules
~/Library/Application Support/Code/User/mcp.json (Linux: ~/.config/Code/User/mcp.json)VS Code MCP serversπŸ”’
~/.config/opencode/opencode config, agents & commandsπŸ”’
~/.copilot/mcp-config.jsonCopilot CLI MCP configπŸ”’
~/.copilot/config.jsonCopilot CLI configπŸ”’
~/.continue/config.yamlContinue configπŸ”’
~/.continue/config.jsonContinue config (json)πŸ”’
~/.aider.conf.ymlaider configπŸ”’
~/.config/goose/config.yamlGoose configπŸ”’
~/.kiro/settings/mcp.jsonKiro MCP configπŸ”’
~/.kiro/steering/Kiro steering
~/.config/amp/settings.jsonAmp settingsπŸ”’
~/.qwen/settings.jsonQwen Code settingsπŸ”’
~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json (Linux: ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json)Cline MCP serversπŸ”’
~/Library/Application Support/Cursor/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json (Linux: ~/.config/Cursor/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json)Cline MCP servers (in Cursor)πŸ”’
~/Documents/Cline/Rules/Cline global rules
~/Documents/Cline/Workflows/Cline global workflows
~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json (Linux: ~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json)Roo Code MCP serversπŸ”’
~/.roo/rules/Roo Code global rules
~/.lmstudio/mcp.jsonLM Studio MCP configπŸ”’

shell

PathWhatHandling
~/.zshrc.zshrc
~/.zprofile.zprofile
~/.zshenv.zshenv
~/.bash_profile.bash_profile
~/.bashrc.bashrc
~/.zlogin.zlogin
~/.zlogout.zlogout
~/.bash_aliases.bash_aliases
~/.bash_logout.bash_logout
~/.fzf.zsh.fzf.zsh
~/.fzf.bash.fzf.bash
~/.zsh/~/.zsh
~/.config/zsh/XDG zsh config
~/.profile.profile
~/.config/fish/Fish Config
~/Library/Application Support/nushell/ (Linux: ~/.config/nushell/)Nushell Config
~/.inputrc.inputrc
~/.oh-my-zsh/custom/oh-my-zsh custom
~/.config/sheldon/plugins.tomlsheldon plugins
~/.zsh_plugins.txtantidote plugins
~/.config/powershell/Microsoft.PowerShell_profile.ps1PowerShell profile

git

PathWhatHandling
~/.gitconfig.gitconfig
~/.gitignore_global.gitignore_global
~/.config/gh/config.ymlGitHub CLI Config
~/.gitattributes_global.gitattributes_global
~/.config/gh/hosts.ymlGitHub CLI hostsπŸ”‘
~/.config/glab-cli/config.ymlGitLab CLIπŸ”‘
~/.config/git/configXDG git config
~/.config/git/ignoreXDG git ignore
~/.config/git/attributesXDG git attributes
~/.config/git/allowed_signersgit allowed_signers
~/.config/git/hooks/Global git hooks
~/Library/Application Support/lazygit/config.yml (Linux: ~/.config/lazygit/config.yml)lazygit
~/.config/jj/config.tomlJujutsu config
~/.config/gitui/gitui
~/.tigrc.tigrc

editor

PathWhatHandling
~/.config/zed/settings.jsonZed Settings
~/Library/Application Support/Cursor/User/settings.json (Linux: ~/.config/Cursor/User/settings.json)Cursor Settings
~/Library/Application Support/Cursor/User/keybindings.json (Linux: ~/.config/Cursor/User/keybindings.json)Cursor Keybindings
~/Library/Application Support/Cursor/User/snippets/ (Linux: ~/.config/Cursor/User/snippets/)Cursor Snippets
~/.config/zed/keymap.jsonZed Keymap
~/.config/zed/themes/Zed Themes
~/.config/zed/snippets/Zed Snippets
~/Library/Application Support/Windsurf/User/settings.json (Linux: ~/.config/Windsurf/User/settings.json)Windsurf Settings
~/Library/Application Support/Windsurf/User/keybindings.json (Linux: ~/.config/Windsurf/User/keybindings.json)Windsurf Keybindings
~/.config/nvim/Neovim Config
~/.vim/~/.vim (without plugins)
~/.emacsEmacs init
~/.emacs.d/~/.emacs.d (config only)
~/.vimrc.vimrc
~/Library/Application Support/Code/User/settings.json (Linux: ~/.config/Code/User/settings.json)VS Code Settings
~/Library/Application Support/Code/User/keybindings.json (Linux: ~/.config/Code/User/keybindings.json)VS Code Keybindings
~/Library/Application Support/Code/User/snippets/ (Linux: ~/.config/Code/User/snippets/)VS Code Snippets
~/.config/helix/Helix Config
~/.config/doom/Doom Emacs
~/Library/Application Support/Sublime Text/Packages/User/ (Linux: ~/.config/sublime-text/Packages/User/)Sublime Text User
~/.editorconfig.editorconfig
~/.ideavimrc.ideavimrc

terminal

PathWhatHandling
~/.p10k.zsh.p10k.zsh
~/.tmux.conf.tmux.conf
~/.config/tmux/XDG tmux config
~/Library/Application Support/iTerm2/DynamicProfiles/ (macOS)iTerm2 dynamic profiles
~/.config/starship.tomlStarship prompt
~/.config/alacritty/Alacritty
~/.config/kitty/Kitty
~/.config/wezterm/wezterm.luaWezTerm
~/.config/ghostty/configGhostty
~/.config/zellij/Zellij
~/.screenrc.screenrc

ssh

PathWhatHandling
~/.ssh/configSSH ConfigπŸ”’
~/.ssh/SSH keys & known hostsπŸ”‘

npm

PathWhatHandling
~/.npmrc.npmrcπŸ”’

bun

PathWhatHandling
~/.bunfig.toml.bunfig.toml

cloud

PathWhatHandling
~/.aws/configAWS CLI configπŸ”’
~/.aws/credentialsAWS CLI credentialsπŸ”‘
~/.config/gcloud/configurations/gcloud configurationsπŸ”’
~/.kube/configkubeconfigπŸ”‘
~/.kube/kube configsπŸ”‘
~/.docker/daemon.jsonDocker daemon.json
~/.botogsutil / boto configπŸ”‘
~/.config/gcloud/application_default_credentials.jsongcloud application default credentialsπŸ”‘
~/.config/configstore/firebase-tools.jsonFirebase CLI loginπŸ”‘
~/.docker/config.jsonDocker configπŸ”‘
~/.azure/Azure CLIπŸ”‘
~/.oci/Oracle Cloud (OCI)πŸ”‘
~/Library/Application Support/doctl/config.yaml (Linux: ~/.config/doctl/config.yaml)DigitalOcean (doctl)πŸ”‘
~/.fly/Fly.ioπŸ”‘
~/.config/linode-cliLinode CLIπŸ”‘
~/.config/hcloud/cli.tomlHetzner (hcloud)πŸ”‘
~/Library/Application Support/com.vercel.cli/auth.json (Linux: ~/.local/share/com.vercel.cli/auth.json)Vercel CLIπŸ”‘
~/.config/netlify/config.jsonNetlify CLIπŸ”‘
~/.supabase/Supabase CLIπŸ”‘
~/.config/stripe/config.tomlStripe CLIπŸ”‘
~/.railway/config.jsonRailway CLIπŸ”‘
~/.terraform.d/credentials.tfrc.jsonTerraform Cloud credsπŸ”‘
~/.pulumi/credentials.jsonPulumi credsπŸ”‘
~/.cloudflared/CloudflaredπŸ”‘
~/.tsh/Teleport (tsh)πŸ”‘
~/Library/Application Support/ngrok/ngrok.yml (Linux: ~/.config/ngrok/ngrok.yml)ngrokπŸ”‘
~/.config/scw/config.yamlScaleway CLIπŸ”‘
~/.config/argocd/configArgo CDπŸ”‘
~/.config/op/config1Password CLIπŸ”’

devops

PathWhatHandling
~/Library/Preferences/helm/repositories.yaml (Linux: ~/.config/helm/repositories.yaml)Helm repositoriesπŸ”’
~/Library/Application Support/k9s/config.yaml (Linux: ~/.config/k9s/config.yaml)k9s config
~/.colima/default/colima.yamlColima config
~/.config/containers/Podman configπŸ”’
~/.ansible.cfgAnsible configπŸ”’
~/.terraformrcTerraform CLI config
~/.packerconfigPacker config
~/.skaffold/configSkaffold config

build

PathWhatHandling
~/.m2/settings.xmlMaven settingsπŸ”‘
~/.gradle/gradle.propertiesGradle propertiesπŸ”‘

db

PathWhatHandling
~/.pgpass.pgpassπŸ”‘
~/.my.cnf.my.cnfπŸ”‘
~/.psqlrc.psqlrc
~/.sqliterc.sqliterc
~/.pg_service.conf.pg_service.confπŸ”‘
~/.config/pgcli/configpgcli config
~/.myclirc.myclirc
~/.config/litecli/configlitecli config
~/.mongoshrc.js.mongoshrc.js

schedule

PathWhatHandling
~/Library/LaunchAgents/ (macOS)launchd agentsπŸ”’

net

PathWhatHandling
~/.curlrc.curlrcπŸ”’
~/.wgetrc.wgetrcπŸ”’

dev

PathWhatHandling
~/.config/direnv/direnv
~/.config/chezmoi/chezmoi configπŸ”’

apps

PathWhatHandling
~/.config/karabiner/ (macOS)Karabiner
~/.hammerspoon/ (macOS)Hammerspoon
~/.aerospace.toml (macOS)AeroSpace
~/.config/aerospace/ (macOS)AeroSpace (XDG)
~/.yabairc (macOS)yabai
~/.skhdrc (macOS)skhd
~/.config/sketchybar/ (macOS)SketchyBar
~/.config/bat/bat
~/.ripgreprc.ripgreprc
~/.config/atuin/config.tomlatuin
~/.config/yazi/yazi
~/.config/btop/btop.confbtop

vm

PathWhatHandling
~/.tool-versions.tool-versions
~/.nvmrc.nvmrc
~/.config/mise/config.tomlmise config
~/.asdfrc.asdfrc

secrets

PathWhatHandling
~/.config/chezmoi/key.txtchezmoi age keyπŸ”‘ never pushed to GitHub
~/Library/Application Support/sops/age/keys.txt (Linux: ~/.config/sops/age/keys.txt)sops age keysπŸ”‘ never pushed to GitHub
~/.netrc.netrcπŸ”‘
~/.vault-tokenVault tokenπŸ”‘
~/.gnupg/GnuPG homeπŸ”‘

lang

PathWhatHandling
~/.gemrc.gemrc
~/.bundle/configBundler configπŸ”’
~/.irbrc.irbrc
~/.config/uv/uv.tomluv configπŸ”’
~/Library/Application Support/pip/pip.conf (Linux: ~/.config/pip/pip.conf)pip configπŸ”’
~/.condarc.condarc
~/Library/Application Support/pypoetry/auth.toml (Linux: ~/.config/pypoetry/auth.toml)Poetry authπŸ”‘
~/.config/go/envgo env
~/.cargo/config.tomlCargo configπŸ”’
~/.cargo/credentials.tomlCargo credentialsπŸ”‘
~/.composer/composer.json (Linux: ~/.config/composer/composer.json)Composer config
~/.composer/auth.json (Linux: ~/.config/composer/auth.json)Composer authπŸ”‘
~/.nuget/NuGet/NuGet.ConfigNuGet configπŸ”‘
~/.yarnrc.yml.yarnrc.ymlπŸ”‘
~/.iex.exs.iex.exs
~/.julia/config/startup.jlJulia startup

mobile

PathWhatHandling
~/.android/debug.keystoreAndroid debug keystoreπŸ”‘
~/Library/Developer/Xcode/UserData/KeyBindings/ (macOS)Xcode key bindings
~/Library/Developer/Xcode/UserData/FontAndColorThemes/ (macOS)Xcode themes
~/Library/Developer/Xcode/UserData/CodeSnippets/ (macOS)Xcode code snippets

fonts

PathWhatHandling
~/Library/Fonts/ (Linux: ~/.local/share/fonts/)Your fonts

dothaven

PathWhatHandling
~/.config/dothaven/includedothaven include list

Your own paths

Files your git config points at come along by themselves. A .gitconfig often names files that have to travel with it: core.hooksPath, core.excludesFile, commit.template, init.templateDir, and the files [include] and [includeIf] pull in (a work identity, a signing key’s config). Whatever those point at inside your home folder is carried like an include, without you listing it, and restored to the same place.

The registry will never know every tool you use. dothaven include adds anything in your home folder to every backup:

dothaven include ~/.config/raycast ~/bin
dothaven include --list      # what you added, and what looks like config but nothing covers
dothaven include --review    # pick from those interactively
  • Your paths are kept in ~/.config/dothaven/include (one per line; a line starting with ! is a path you declined, so dothaven stops asking). That file is itself in the registry, so it travels with your backups.
  • In a backup they live under extra/, and restore puts them back in the same place under your home folder, even on a new machine that has no include list yet.
  • They are treated as πŸ”’: scanned and redacted in plain backups, written owner-only on restore.
  • A credential folder stays protected however it is reached. Including ~/.aws does not put ~/.aws/credentials into a plain backup.

To find candidates, dothaven looks at the dot-files in your home folder, the entries in ~/.config, ~/.claude, ~/.codex and ~/.gemini (skipping their sessions, history and caches), and ~/bin, and lists what no entry or include covers. On a terminal, backup offers these once.

Missing a tool?

If a config or CLI you use should be in the registry, request it with the tool’s name and config path. In the meantime, dothaven include <path> carries it today.

For contributors: the entry model

Each entry is one Go struct in internal/registry/registry.go:

type Entry struct {
	ID          string            // stable section key, e.g. "shell.zshrc"
	Name        string            // human-readable label
	Paths       map[string]string // keyed by GOOS: "darwin", "linux", "windows"
	Category    string            // what --only / --skip select
	Kind        Kind              // File, FileMetadata, Dir, JSONExtract
	Fields      []string          // JSONExtract only: keys to pull into a snapshot
	BackupDest  string            // path inside a backup
	Sensitivity Sensitivity       // low, medium, high
	Redact      func(string) string // optional structure-preserving scrubber
	Exclude     []string          // Dir only: clutter to skip (caches, logs…)
}
  • Paths use ~ for your home folder. An entry with no path for the current OS is skipped.
  • Kind decides what a collect snapshot records: the file’s text (File), just whether it exists and its line count (FileMetadata, used for the large generated .p10k.zsh), a folder listing (Dir), or selected JSON keys (JSONExtract). Backups always carry the whole file or folder.
  • Sensitivity: high with no Redact is what keeps an entry out of plain backups. Two entries have a redactor: ssh.config (HostName, IdentityFile) and npm.config (_authToken and the legacy _auth/_password).
  • Exclude patterns without a / match any path segment (logs, *.log); with a / they match from the entry’s root.

registry.BackupTargets projects the entries onto source and destination paths. Backup uses it to copy and restore uses it to map each file back, so a file always returns to the path it came from.