1# chezmoi comparison guide
2
3<!--- toc --->
4* [Comparison table](#comparison-table)
5* [Why should I use a dotfile manager?](#why-should-i-use-a-dotfile-manager)
6* [I already have a system to manage my dotfiles, why should I use chezmoi?](#i-already-have-a-system-to-manage-my-dotfiles-why-should-i-use-chezmoi)
7  * [Coping with differences between machines requires extra effort](#coping-with-differences-between-machines-requires-extra-effort)
8  * [You have to keep your dotfiles repo private](#you-have-to-keep-your-dotfiles-repo-private)
9  * [You have to maintain your own tool](#you-have-to-maintain-your-own-tool)
10  * [Setting up your dotfiles requires more than one short command](#setting-up-your-dotfiles-requires-more-than-one-short-command)
11
12---
13
14## Comparison table
15
16[chezmoi]: https://chezmoi.io/
17[dotbot]: https://github.com/anishathalye/dotbot
18[rcm]: https://github.com/thoughtbot/rcm
19[homesick]: https://github.com/technicalpickles/homesick
20[vcsh]: https://github.com/RichiH/vcsh
21[yadm]: https://yadm.io/
22[bare git]: https://www.atlassian.com/git/tutorials/dotfiles "bare git"
23
24|                                        | [chezmoi]     | [dotbot]          | [rcm]             | [homesick]        | [vcsh]                   | [yadm]        | [bare git] |
25| -------------------------------------- | ------------- | ----------------- | ----------------- | ----------------- | ------------------------ | ------------- | ---------- |
26| Distribution                           | Single binary | Python package    | Multiple files    | Ruby gem          | Single script or package | Single script | -          |
27| Install method                         | Many          | git submodule     | Many              | Ruby gem          | Many                     | Many          | Manual     |
28| Non-root install on bare system        | ✅            | ⁉️                 | ⁉️                 | ⁉️                 | ✅                       | ✅            | ✅         |
29| Windows support                        | ✅            | ❌                | ❌                | ❌                | ❌                       | ❌            | ✅         |
30| Bootstrap requirements                 | None          | Python, git       | Perl, git         | Ruby, git         | sh, git                  | git           | git        |
31| Source repos                           | Single        | Single            | Multiple          | Single            | Multiple                 | Single        | Single     |
32| dotfiles are...                        | Files         | Symlinks          | Files             | Symlinks          | Files                    | Files         | Files      |
33| Config file                            | Optional      | Required          | Optional          | None              | None                     | None          | Optional   |
34| Private files                          | ✅            | ❌                | ❌                | ❌                | ❌                       | ❌            | ❌         |
35| Show differences without applying      | ✅            | ❌                | ❌                | ❌                | ✅                       | ✅            | ✅         |
36| Whole file encryption                  | ✅            | ❌                | ❌                | ❌                | ❌                       | ✅            | ❌         |
37| Password manager integration           | ✅            | ❌                | ❌                | ❌                | ❌                       | ❌            | ❌         |
38| Machine-to-machine file differences    | Templates     | Alternative files | Alternative files | Alternative files | Branches                 | Templates     | ⁉️          |
39| Custom variables in templates          | ✅            | ❌                | ❌                | ❌                | ❌                       | ❌            | ❌         |
40| Executable files                       | ✅            | ✅                | ✅                | ✅                | ✅                       | ❌            | ✅         |
41| File creation with initial contents    | ✅            | ❌                | ❌                | ❌                | ✅                       | ❌            | ❌         |
42| Externals                              | ✅            | ❌                | ❌                | ❌                | ❌                       | ❌            | ❌         |
43| Manage partial files                   | ✅            | ❌                | ❌                | ❌                | ⁉️                        | ❌            | ⁉️          |
44| File removal                           | ✅            | ❌                | ❌                | ❌                | ✅                       | ❌            | ❌         |
45| Directory creation                     | ✅            | ✅                | ✅                | ❌                | ✅                       | ❌            | ✅         |
46| Run scripts                            | ✅            | ✅                | ✅                | ❌                | ✅                       | ❌            | ❌         |
47| Run once scripts                       | ✅            | ❌                | ❌                | ❌                | ✅                       | ❌            | ❌         |
48| Machine-to-machine symlink differences | ✅            | ❌                | ❌                | ❌                | ⁉️                        | ✅            | ⁉️          |
49| Shell completion                       | ✅            | ❌                | ❌                | ❌                | ✅                       | ✅            | ✅         |
50| Archive import                         | ✅            | ❌                | ❌                | ❌                | ✅                       | ❌            | ✅         |
51| Archive export                         | ✅            | ❌                | ❌                | ❌                | ✅                       | ❌            | ✅         |
52| Implementation language                | Go            | Python            | Perl              | Ruby              | POSIX Shell              | Bash          | C          |
53
54✅ Supported, ⁉️  Possible with significant manual effort, ❌ Not supported
55
56For more comparisons, visit [dotfiles.github.io](https://dotfiles.github.io/).
57
58---
59
60## Why should I use a dotfile manager?
61
62Dotfile managers give you the combined benefit of a consistent environment
63everywhere with an undo command and a restore from backup.
64
65As the core of our development environments become increasingly standardized
66(e.g. git or Mercurial interfaces to version control at both home and work), and
67we further customize them (with shell configs like
68[powerlevel10k](https://github.com/romkatv/powerlevel10k)), at the same time we
69increasingly work in ephemeral environments like Docker containers and [GitHub
70Codespaces](https://github.com/features/codespaces).
71
72chezmoi helps you bring your personal configuration to every environment that
73you're working in. In the same way that nobody would use an editor without an
74undo command, or develop software without a version control system, chezmoi
75brings the investment that you have made in mastering your tools to every
76environment that you work in.
77
78---
79
80## I already have a system to manage my dotfiles, why should I use chezmoi?
81
82> Regular reminder that chezmoi is the best dotfile manager utility I've used
83> and you can too
84>
85> — [@mbbroberg](https://twitter.com/mbbroberg/status/1355644967625125892)
86
87If you're using any of the following methods:
88
89* A custom shell script.
90* An existing dotfile manager like
91  [dotbot](https://github.com/anishathalye/dotbot),
92  [rcm](https://github.com/thoughtbot/rcm),
93  [homesick](https://github.com/technicalpickles/homesick),
94  [vcsh](https://github.com/RichiH/vcsh),
95  [yadm](https://yadm.io/), or [GNU Stow](https://www.gnu.org/software/stow/).
96* A [bare git repo](https://www.atlassian.com/git/tutorials/dotfiles).
97
98Then you've probably run into at least one of the following problems.
99
100---
101
102### Coping with differences between machines requires extra effort
103
104If you want to synchronize your dotfiles across multiple operating systems or
105distributions, then you may need to manually perform extra steps to cope with
106differences from machine to machine. You might need to run different commands on
107different machines, maintain separate per-machine files or branches (with the
108associated hassle of merging, rebasing, or copying each change), or hope that
109your custom logic handles the differences correctly.
110
111chezmoi uses a single source of truth (a single branch) and a single command
112that works on every machine. Individual files can be templates to handle machine
113to machine differences, if needed.
114
115---
116
117### You have to keep your dotfiles repo private
118
119> And regarding dotfiles, I saw that. It's only public dotfiles repos so I have
120> to evaluate my dotfiles history to be sure. I have secrets scanning and more,
121> but it was easier to keep it private for security, I'm ok mostly though. I'm
122> using chezmoi and it's easier now
123>
124> — [@sheldon_hull](https://twitter.com/sheldon_hull/status/1308139570597371907)
125
126If your system stores secrets in plain text, then you must be very careful about
127where you clone your dotfiles. If you clone them on your work machine then
128anyone with access to your work machine (e.g. your IT department) will have
129access to your home secrets. If you clone it on your home machine then you risk
130leaking work secrets.
131
132With chezmoi you can store secrets in your password manager or encrypt them, and
133even store passwords in different ways on different machines. You can clone your
134dotfiles repository anywhere, and even make your dotfiles repo public, without
135leaving personal secrets on your work machine or work secrets on your personal
136machine.
137
138---
139
140### You have to maintain your own tool
141
142> I've offloaded my dotfiles deployment from a homespun shell script to chezmoi.
143> I'm quite happy with this decision.
144>
145> — [@gotgenes](https://twitter.com/gotgenes/status/1251008845163319297)
146
147> I discovered chezmoi and it's pretty cool, just migrated my old custom
148> multi-machine sync dotfile setup and it's so much simpler now
149>
150> in case you're wondering I have written 0 code
151>
152> — [@buritica](https://twitter.com/buritica/status/1361062902451630089)
153
154If your system was written by you for your personal use, then it probably has
155the functionality that you needed when you wrote it. If you need more
156functionality then you have to implement it yourself.
157
158chezmoi includes a huge range of battle-tested functionality out-of-the-box,
159including dry-run and diff modes, script execution, conflict resolution, Windows
160support, and much, much more. chezmoi is [used by thousands of
161people](https://github.com/twpayne/chezmoi/stargazers) and has a rich suite of
162both unit and integration tests. When you hit the limits of your existing
163dotfile management system, chezmoi already has a tried-and-tested solution ready
164for you to use.
165
166---
167
168### Setting up your dotfiles requires more than one short command
169
170If your system is written in a scripting language like Python, Perl, or Ruby,
171then you also need to install a compatible version of that language's runtime
172before you can use your system.
173
174chezmoi is distributed as a single stand-alone statically-linked binary with no
175dependencies that you can simply copy onto your machine and run. You don't even
176need git installed. chezmoi provides one-line installs, pre-built binaries,
177packages for Linux and BSD distributions, Homebrew formulae, Scoop and
178Chocolatey support on Windows, and a initial config file generation mechanism to
179make installing your dotfiles on a new machine as painless as possible.
180
181---
182