chezmoi is often filed under "dotfiles management," which is accurate but too small. In 2026 the more useful way to understand the project is as a renderer between two kinds of state: one common source directory that you keep under version control, and one machine-local configuration layer that decides how those files should come out on a particular laptop or workstation.[1][2] That framing matters because it explains why chezmoi feels sturdier than a plain symlink farm. It is not just copying files around. It is making the boundary between shared configuration, local variation, and secret material explicit.
The official homepage still describes the project in those terms: manage dotfiles across diverse machines, securely, with templates, password-manager support, encryption, archive imports, and scripts.[1] The live project also looks active rather than archival. As of 2026-04-29, the GitHub API reports 19,446 stars, 636 forks, 51 open issues, and a most recent push timestamp of 2026-04-28T00:00:20Z for twpayne/chezmoi.[8] The latest release listed on the project site and GitHub releases is v2.70.2, published on 2026-04-17.[1][9] So this is not a nostalgic niche utility. It is an actively maintained tool whose core design still solves a common engineering problem: how to make personal machine setup reproducible without pretending every machine should be identical.
Image context: the cover uses a real programmer workstation photograph rather than a terminal screenshot or generated illustration. That choice fits because chezmoi is about ordinary machine maintenance done with more discipline: one source state, a local rendering step, and a deliberate boundary around secrets and differences.[10]
The core idea is one source state plus one local config boundary
The setup guide is unusually clear about the architecture. chezmoi combines a source directory, typically ~/.local/share/chezmoi, that is common across your machines, with a local config file, typically ~/.config/chezmoi/chezmoi.toml, that is specific to the current machine.[2] Files that should be identical everywhere are copied from the source directory as-is. Files that need to vary are executed as templates, usually using values from the local config file.[2]
That is the design choice that separates chezmoi from the older "just keep a dotfiles repo" habit. A plain repo can store common files, but it is much weaker at declaring which differences are legitimate and where those differences should live. chezmoi makes that boundary first-class. Shared intent lives in the repo. Machine-specific facts live in local config. The final file in ~/.gitconfig, ~/.zshrc, or some application directory is a rendered result, not the only source of truth.[2][3]
This is also why the project scales better across a personal Mac, a Linux workstation, and a work laptop than many ad hoc alternatives. You are not forced to choose between one brittle universal config and three silently diverging copies. You keep one source state and let rendering absorb the variation.[2][3]
Templates are not an extra feature; they are the project's real operating system
The templating and machine-differences docs show where chezmoi becomes more than a sync tool. A file becomes a template either because it has a .tmpl suffix or because you add it as a template with commands like chezmoi add --template ~/.gitconfig.[3][4] Template data can come from the built-in .chezmoi variables, local [data] values in the config file, and structured data files such as .chezmoidata.*.[3] The docs explicitly recommend using that data layer for values like email addresses and other machine-specific settings.[4]
That means the cleanest chezmoi workflow is not "store every final file exactly as the machine uses it." It is "store a source state that knows what should stay common, and parameterize only the parts that genuinely differ." The docs even provide a debugging mindset for this model: use chezmoi data to inspect available values, chezmoi edit to work on the template source, and chezmoi execute-template to test template fragments directly.[3][4]
Two details matter here. First, .chezmoitemplates lets you keep shared template fragments once and reuse them across different target paths on different systems.[3][4] Second, .chezmoiignore is itself templated, which gives you a coarse but practical way to say that some directories or files should only exist on some machines.[4] Those features are why chezmoi feels like a source-state manager rather than a pretty wrapper on top of git pull.
The security boundary is strong because secrets do not need to live in the repo
The other reason chezmoi still stands out is that it treats secrecy as a boundary problem rather than a storage accident. The setup guide says your dotfiles repo can remain public because secrets can live in password managers, encrypted files, or machine-private config instead.[2] The password-manager guide makes the same point more directly: chezmoi extends its templates with password-manager-specific functions so that secret values can be pulled into the rendered result without being committed to the public source tree.[5]
That is the right mental model for engineers who dislike mixing public configuration with private material. Your shell aliases, editor defaults, prompt structure, and shared app config can stay in the common repo. Tokens, passwords, and private keys can stay outside it until render time.[2][5] If you prefer encrypted files, chezmoi also supports full-file encryption with tools such as age, gpg, git-crypt, and transcrypt.[1][6] The age guide documents a straightforward path: generate a key with chezmoi age-keygen, specify recipients and identities in config, and let chezmoi add --encrypt plus chezmoi edit manage the encrypted source files.[6]
One subtle but important detail is that chezmoi even includes built-in age support if the external age binary is missing from $PATH.[6] That matters because the project is not merely telling users to invent a separate secret-handling ceremony. It is trying to keep the secret boundary inside the same operational loop as the rest of the source state.[5][6]
diff and apply are why the workflow stays trustworthy
The official setup flow on a new machine is simple: chezmoi init to clone the source state, chezmoi diff to preview changes, and chezmoi apply to enforce the target state, with chezmoi init --apply available when you want the combined path.[2] The apply reference adds the critical safety guarantee: if a target has been modified since chezmoi last wrote it, the user is prompted before overwrite.[7] That is a small sentence, but it captures the whole temperament of the project.
chezmoi is useful precisely because it does not blur the boundary between definition and mutation. You keep a source state, inspect the delta, and then write the result. That is more disciplined than hand-editing dotfiles on every machine and hoping later syncs do not trample local changes. It is also less magical than tools that promise total environment reproducibility while quietly bundling provisioning, package management, and personal config into one harder-to-reason-about layer.[2][7]
An independent practitioner write-up from 2026-02-13 reinforces that point from the user side. Sam Wize describes moving away from a legacy dotfiles plus Oh My Zsh setup toward chezmoi, emphasizing the cleaner source-of-truth model and the value of keeping broader bootstrap scripts separate from dotfile management.[11] That is not official doctrine, but it aligns with what the docs imply. chezmoi is strongest when it owns personal configuration state. It can run scripts, but it is not trying to become your whole machine-provisioning platform.[1][11]
Best-fit boundary and mismatch boundary
The best fit for chezmoi is an engineer who moves between multiple machines and wants the final system to be reproducible without being uniform. It is especially good for people who want to keep their common config in one repo, parameterize only the differences that matter, and maintain a clean separation between public config and private secrets.[2][4][5]
The mismatch begins when you expect chezmoi to be a full device-management plane. The docs do mention scripts and broader setup flows, but the project's real strength is narrower and more defensible: source-state management for personal configuration, with templating and secret handling built in.[1][2][4] That narrower promise is a strength, not a limitation. It keeps the tool legible.
The cleanest introduction to chezmoi in 2026, then, is this: it gives you one version-controlled source state, one local data boundary, one explicit preview-and-apply workflow, and several sane ways to keep secrets outside the repo until the last responsible moment.[2][5][6][7] If your laptops keep turning into snowflakes, that is a meaningful upgrade over both raw dotfiles repos and overengineered personal-platform stacks.
Sources
- chezmoi homepage: project overview, current feature list, and latest version reference.
- chezmoi setup guide: source directory, local config file, and
init/diff/applyworkflow. - chezmoi templating guide:
.tmpl,.chezmoitemplates,chezmoi data,chezmoi edit, andexecute-template. - chezmoi guide to machine-to-machine differences:
(data),add --template, templated.chezmoiignore, and shared templates across systems. - chezmoi password-manager integration guide: keeping a public dotfiles repo while retrieving secrets through template functions.
- chezmoi
ageencryption guide:chezmoi age-keygen, recipients and identities, and built-inagesupport. - chezmoi
applycommand reference: explicit target-state enforcement and overwrite prompting for modified files. - GitHub API snapshot for
twpayne/chezmoi: stars, forks, open issues, and last push timestamp. - GitHub releases for
twpayne/chezmoi: recent release history including v2.70.2 on 2026-04-17. - Wikimedia Commons source page for the article image, "A Programmer's Workstation.JPG."
- Sam Wize, "I deprecated dotfiles and oh-my-zsh, and moved to chezmoi" (2026-02-13).