Reference
Reference: Configuration Files
Every config file read or written by .dotfiles, with its schema and purpose.
Source Repository
.chezmoiroot is defaults, so chezmoi's source state (data, templates, ignore rules) lives under ~/.dotfiles/defaults/. Repo tooling (mise.toml, scripts/, lib/) stays at the root.
| File | Purpose |
|---|---|
~/.dotfiles/defaults/.chezmoidata.toml | Global defaults: theme, profile, version, features, install pins |
~/.dotfiles/defaults/.chezmoidata/hardware.toml | [hardware] defaults and [machines.<name>] presets (macbook-t2, surface-pro, geekom-a9) |
~/.dotfiles/defaults/.chezmoidata/keybinds.toml | Modifier hierarchy matrix |
~/.dotfiles/defaults/.chezmoidata/apple.toml | Generated Apple palette data (scripts/theme/apple.py --write-data) |
~/.dotfiles/defaults/.chezmoidata/secrets-patterns.toml | Atuin history_filter patterns |
~/.dotfiles/defaults/.theme-manifest/themes.toml | Generated theme palettes, do not edit |
~/.dotfiles/defaults/.chezmoiignore.tmpl | Paths excluded from chezmoi apply, per OS and feature flag |
~/.dotfiles/defaults/.chezmoitemplates/ | Reusable template partials, alias and function sources |
~/.dotfiles/mise.toml | Pinned runtime versions for the dotfiles repo |
User-Owned Configuration
| File | Purpose | Git-tracked? |
|---|---|---|
~/.config/chezmoi/chezmoi.toml | Per-host overrides (machine, theme, shell) | No |
~/.config/chezmoi/key.txt | Age private key chezmoi decrypts with (the age_identity default) | No |
~/.config/sops/age/keys.txt | Age private key sops reads | No |
~/.config/mise/config.toml | Your own tool pins (mise use -g, mise upgrade) | No |
~/.config/mise/conf.d/00-dotfiles.toml | Base tool list and settings (managed by this repo) | Via chezmoi |
~/.config/dotfiles/fleet.toml | Fleet host list (optional) | No |
~/.config/git/allowed_signers | SSH public keys trusted for commit verification | Via chezmoi (template) |
.chezmoidata.toml Schema
An excerpt of defaults/.chezmoidata.toml:
dotfiles_version = "0.2.542"
profile = "laptop"
machine = ""
# Visual theme: family + mode, and the resolved palette name
theme = "maui-dark"
theme_family = "maui"
theme_mode = "auto" # auto, dark, or light
# Terminal settings
terminal_font_family = "JetBrainsMono Nerd Font"
terminal_font_size = 20
default_shell = "fish" # zsh, fish, or nu
# Git identity (should be set via chezmoi init prompts or local overrides)
name = ""
email = ""
signingkey = ""
# Feature flags (see 05-feature-flags.md)
[features]
alias_wrapper = false
dms = true
zellij = false
ai_theme_sync = true
linux_desktop = false
niri = false
# ... waybar, fuzzel, mako, foot, kanshi, touch, t2, surface, corral_gitea_mirror
[features.ai_theme_providers]
codex = true
claude = true
# ... gemini, agy, qwen, opencode
dotfiles_version is bumped by version-sync.sh at release time. The file also carries the install pins ([tools], [go_tools], [rust_tools], [tmux_plugins], [ai_tools]) and the alias settings ([aliases.buckets], [aliases.policy]). There is no [profiles] table: profile is a name that templates read as .profile.
.chezmoidata/hardware.toml Schema
# Defaults, used when no machine preset is selected
[hardware]
profile = "laptop"
scale = 1.0
hidpi = false
touchscreen = false
touchpad = true
max_refresh = 60
gpu = "integrated"
keyboard_layout = "us"
touchpad_accel = 0.0
touchpad_accel_profile = "adaptive"
output_name = ""
output_mode = ""
# Presets, selected by `machine = "<name>"`, with the same keys
[machines.macbook-t2]
scale = 2.0
hidpi = true
output_name = "eDP-1"
output_mode = "2560x1600@60"
# ...
Presets shipped: macbook-t2, surface-pro, geekom-a9. A preset replaces [hardware] as a whole (it is not merged key by key), and it carries no feature flags. Today only the Niri config template (defaults/dot_config/niri/config.kdl.tmpl) reads these values.
.theme-manifest/themes.toml Schema
Generated by dot theme rebuild (scripts/theme/rebuild-themes.sh). Do not edit manually.
[themes.<name>]
mode = "dark" | "light"
family = "<family-name>"
macos_accent = -1 .. 6 # -1=Graphite, 0=Red, 1=Orange, 2=Yellow, 3=Green, 4=Blue, 5=Purple, 6=Pink
wallpaper = "/absolute/path/to/wallpaper.heic"
source = "custom" | "system"
[themes.<name>.term]
bg, fg, cursor, cursor_text, sel_bg, sel_fg # hex RGB
c0 .. c15 # 16 ANSI colors
grey0 .. grey11 # grey ramp
[themes.<name>.ui]
accent, accent_text # WCAG AAA enforced (7:1)
secondary, tertiary, text_muted
accent_on_surface, secondary_on_surface, tertiary_on_surface
error, warning, success, info
panel # 1.08-2.0 contrast vs bg
border
secondary_container, on_secondary_container, status_text
[themes.<name>.app]
nvim, nvim_style, lualine
gtk_theme, gtk_icon, gnome_shell, gnome_gtk
vscode, vscode_dark, vscode_light, vscode_icons
cat_wallpaper
starship_palette
The manifest is not chezmoi data: templates load it with include ".theme-manifest/themes.toml" | fromToml (see Template Variables). See Theme Engine concept for how values are derived.
~/.config/chezmoi/chezmoi.toml (Per-Host)
Written by chezmoi init from defaults/.chezmoi.toml.tmpl (on a terminal it prompts for the age identity and recipient, profile, theme and git identity), then edited by hand or by dot theme. An excerpt:
encryption = "age"
sourceDir = "~/.dotfiles"
[age]
identity = "~/.config/chezmoi/key.txt"
recipient = "age1..."
[data]
profile = "laptop"
theme = "maui-dark"
git_name = "Your Name"
git_email = "you@example.com"
git_signingkey = "~/.ssh/id_ed25519"
git_signingformat = "ssh"
machine = "surface-pro" # added by hand: selects [machines.surface-pro]
Fields here override same-named fields in .chezmoidata.toml at render time. Per-host feature flags go under [data.features].
~/.dotfiles/mise.toml (Pinned Versions)
Strict versions for working on the repo itself (separate from the user's own mise config). An excerpt:
[settings]
lockfile = true
[tools]
node = "24.14.0"
rust = "1.95.0"
go = "1.26.10"
bun = "1.3.10"
starship = "1.24.2"
sops = "3.13.3"
# ...
~/.config/mise/conf.d/00-dotfiles.toml (Managed)
The base layer, deployed by chezmoi and loaded first, so it has the lowest precedence. ~/.config/mise/config.toml is deliberately not managed: mise use -g and mise upgrade write their version pins there, and those pins override this file.
[settings]
minimum_release_age = "0s" # explicit: unset falls back to mise's own age gate
auto_install = true
activate_aggressive = true
# mise's own GitHub API calls; the token is never exported
github.credential_command = "gh auth token"
[tools]
node = "24"
python = ["3.12", "3.11", "3.14"]
go = "latest"
# ... more tools
[env]
MISE_EXPERIMENTAL = "1"
DOT_BUILD_ROOT = "{{ xdg_cache_home }}/dot/builds"
GOCACHE = "{{ env.DOT_BUILD_ROOT }}/go-cache"
PIP_CACHE_DIR = "{{ env.DOT_BUILD_ROOT }}/pip-cache"
UV_CACHE_DIR = "{{ env.DOT_BUILD_ROOT }}/uv-cache"
ZIG_LOCAL_CACHE_DIR = "{{ env.DOT_BUILD_ROOT }}/zig-cache"
ZIG_GLOBAL_CACHE_DIR = "{{ env.DOT_BUILD_ROOT }}/zig-global-cache"
[env] never holds a GitHub token: every process mise launches inherits it, including untrusted build and test commands.
~/.cargo/config.toml (Managed)
[build]
jobs = -1
incremental = true
# target-dir is deliberately not set: one shared target directory makes
# concurrent builds across projects wait on Cargo's lock
rustc-wrapper = "sccache" # only when sccache is installed
~/.config/git/allowed_signers
Template: defaults/dot_config/git/allowed_signers.tmpl
Lists SSH public keys git trusts for signed commits, one per line (principal keytype key):
jane.doe@example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
dot_config/dotfiles/mcp-policy.json and mcp-registry.json
MCP policy and registry, both under defaults/dot_config/dotfiles/. See MCP Policy reference. Excerpts:
dot mcp list prints the registry; dot mcp check checks the setup against the policy.
dot_config/dotfiles/agent-card.json
Agent Card (A2A). An excerpt of defaults/dot_config/dotfiles/agent-card.json as shipped:
The shipped card's version field lags the release (it still names 0.2.501), and several entrypoints (dot agent conformance, dot agent a2a-card) use pre-ADR-020 spellings; dot agent card show and dot agent card check are the declared ones.
Log Files
| Path | Content | Rotation |
|---|---|---|
~/.local/state/dot/<domain>/log.jsonl | The domain's log.v1 events (schemas/cli/log.v1.schema.json): every dot command's log lines, metrics (dot doctor metric list), agent sessions (dot agent log show, in agent) and fleet events (dot fleet log show, in fleet). Mode 0600; the value of a key that names a secret (token, secret, password, api key, credential, auth) is written as ***, so a secret under any other key name is not caught | Records older than DOT_LOG_RETENTION_DAYS (30) are pruned by the maintenance job |
~/.local/state/dot/doctor/heal.log | Heal attempts | Append-only |
~/.local/state/dot/doctor/rollback.log | Rollback activity | Append-only |
~/.local/state/dot/attest/attestations/workstation-attestation.json | Latest attestation | Overwritten each run |
~/.local/state/dot/config/snapshots/*.json | dot doctor snapshot new snapshots | Kept until removed |
~/.local/share/dotfiles/backups/ | dot doctor rollback backups | clean keeps the newest 10 |
Cache Files
| Path | Content | Invalidation |
|---|---|---|
~/.cache/zsh/<label>.zsh, ~/.cache/bash/<label>.bash | _cached_eval tool init output | Binary mtime |
~/.cache/dotfiles/themes/*.toml | Per-wallpaper theme cache | Wallpaper mtime |
~/.cache/dotfiles/manual/* | Downloaded manual files | Older than 7 days |
~/.cache/dotfiles/registry/index-v2-*.json | dot cli registry index | 6 hours |
Ignored Files
Untracked files in the source directory (e.g. editor swap files) are ignored via defaults/.chezmoiignore.tmpl, for example:
.DS_Store
**/.DS_Store
*.swp
**/*.swp
_build
_build/**