I've managed my dotfiles (12 different configuration files all compatible with cygwin, wsl, linux, macOS) for the past decade in a git repo with a 50 LOC shell script that creates symlinks for me in an intelligent way. What am I missing?
Chezmoi also handles variations in config files for personal vs. Work machines, or even differences between machines themselves.
I agree it’s not a tremendous lift to write a bespoke solution for this (and I did so in the past) but at some point it becomes lower-effort to use something off the shelf.
It’s worked fine for me for 15 years, macOS, many Linux distros, FreeBSD.
I think such tools will be useful for people who use hundreds of apps and have to often migrate/reset or replicate those setups.
Kind of like you, my .dotfiles folder is a private github repo now which has barely 10 files and I don't even use symlinks anymore.
So I think it's also kind of a hobby, if I may say so.
I could use one repo for work and one for personal and live with the mess of useless files, but I like the cleanliness and having simple git histories. I also don’t have to have conditional statements all over the place.
Now to be fair, since I use rotz for this, I also install extra packages with it. So its not purely dotfiles.
Depends on your requirements. For example, if you have any values you want to keep secret in your config files, then using a config manager can help you to not expose them in a Git repository. Also, if you work across multiple operating systems, you can use config managers to alter your config files based on the current OS.
For example:
1. My editor config (neovim) including downloading and installing all my plugins, including the dependencies of the plugins (including deno, rust-analyzer, clippy, etc)
2. All the other tools I use, like ripgrep, python, and so on, including installing the same version on every machine I've got.
3. A bunch of misc programs and scripts I've written for myself, including all their dependencies
4. All the xdg configuration to open http links in the right browser profile, pdfs in evince, etc, as well as all the programs needed for that
5. systemd user units to run various daemons, like syncthing to sync some documents between computers, gpg-agent, etc etc.
And this works on all machines running any linux distro, from arch linux to nixos to ubuntu.
home-manager is just another dotfile manager, but since nix makes packages isolated, such that my user version of $pkg doesn't conflict or depend on the host version, home-manaer can also safely manage applications I run, like my editor, browser, developer tools, systemd units, etc etc etc.
I agree that most dotfile managers are weird overengineered projects that could have been a short shell script.
I think nix+home-manager is a weird overengineered project that could not have been a shell script.
https://tamerlan.dev/how-i-manage-my-dotfiles-using-gnu-stow...
Stow is usually trivially installable using the package manager while I'm installing git. Not nearly as full featured as chezmoi but gets the job done for me.
Should it be an indicator of better stability? Or performance? And if so, am I interested in the performance of a dotfile tool?
Genuinely curious.
Now the bar for GUI apps is cross-compilation to deployable web, Windows, Linux (Electron), Android, iOS (? I don't know I don't use/develop for Apple products) versions from running a simple command.
And for the CLI world, well, almost everyone is on Linux x86-64, or maybe arm, so a few static binaries (or "virtually" static -- depending only on glibc) are king for deployment.
https://www.graalvm.org/jdk24/reference-manual/native-image/
There’s a new LTS release with improvements coming out next week.
Unfortunately people writing libraries do all kinds of things just because they can and as such I've almost never been able to just simply AOT compile something without more manual efforts.
We've been shipping TruffleRuby as native image builds for years. Other Truffle languages have as well. And it's been quite popular with microservice frameworks. Recently I saw someone on the GraalVM Slack say they AOT compiled a large JavaFX application.
It's work, but probably far less than a rewrite in another language and the tooling is getting better. Obviously I can't speak to your experience, but if you haven't looked at it in a while it might be worth giving newer releases a shot.
How is it performance wise? Are there some big things/roadblocks to be aware of?
In fact, I'm gonna rewrite my dotfiles manager from Rust into POSIX sh.
It also uses clap for argument parsing so I know I can run it with `--help` to discover its options, and that the parsing of flags is likely not buggy, and consistent with other Rust tools I use.
None of this is _guaranteed_ with Rust, but the tooling and libraries make it so much easier for you to succeed at making a fast and robust piece of software. So for me "written in Rust" is usually a quality indicator of sorts. It's not 100% though, there will always be misses because it's still very possible to write bad software in any language.
I haven't looked at this one yet, but until someone compares it to Chezmoi and points out where it's better I'm not even looking attention I fear. Chezmoi is just that good.
More does not necessarily equal better, though. I think that's a matter of personal preference. I tried Chezmoi for a while and ultimately decided it was just a lot more levers at my disposal than I really wanted to even think about.
Dotter, by contrast, is a lot more minimal. Dotter is little more than a symlink manager plus templating engine plus config files to declare what machines need what config.
Chezmoi is all that, and does a lot more: encryption/decryption (even has password manager integrations), automatic push/pull. It's also designed so that you can add or manage files regardless of what your current working directory is (via commands like `chezmoi edit/add`).
In my case, after deciding I wanted to go for the minimal end of things, I almost went for GNU Stow however, I wanted templating functionality and I liked dotter's "packages" system for defining what files a given computer needs.
And very much a personal bias here: I found the learning curve of Chezmoi templates not great. I'm also not a big fan of the fact that Chezmoi relies on you naming your source files in particular ways in order to determine what the target file permissions should be.
How does dotter handle permissions?
> does a lot more: encryption/decryption (even has password manager integrations), automatic push/pull.
But you don't have to learn about it / use it?
Chezmoi manages stuff that's in my /home - configurations, scripts in ~/bin/ etc. It also installs a bunch of applications with a runonce_ -script both on Linux and MacOS.
Ansible makes sure the correct system-level packages are installed, things in /etc/ are set up the way I like etc. There's a bunch of overlap with the packages installed by ansible and Chezmoi - but I run `chezmoi update` multiple times a week an I can run it on any computer I'm on. Ansible is for Big Things.
Then I have an opentofu setup that manages a bunch of docker containers, keeping them as stateful as possible.
For daily simple things, I can just edit any config file, add it to chezmoi and push it to git. Then on any machine I can `chezmoi update` and everything is synced.
For example in my dotfiles repo I'll have `etc/pacman.d/01-options.conf` and the dotfiles install script will symlink that to `/etc/pacman.d/01-options.conf`. This way the source of truth is always in a single dotfiles repo.
This strategy has worked well for dotfiles I use on Arch, Debian, Ubuntu and macOS. It includes support for WSL 2 too. The install script has been working with this set up for years to run 1 single command and have everything work where work in this case is installing and configuring a bunch of tools I use. An example is here https://github.com/nickjj/dotfiles.
It also allows for including our not including a config based on an executable being available which can be useful. It requires some configuration, depending on how many of its features you use but I think it's worth it.
https://ericgreer.info/post/2025-08-31-simple-dotfiles-scrip...
1. git is already there and familiar
2. sync dotfiles over ssh . no internet access or separate credentials needed (for github, s3 etc)
3. handles merge conflicts
4. easily push & pull subdirectories into /etc , /usr/local or wherever else you need configuration using git subtree.
git bare repo works for tracking files anywhere on the FS as well. (check debian etckeeper for automating that)
thinking of git as a FS content & metadata tracker rather than SCM , opens up a lot of unique deployment patterns that developers often overlook
1. git init /etc
2. git init /home
3. (in home) git remote add s/etc /etc
4. (in home) git subtree add -P etc s/etc master # adds a prefix etc , from remote s/etc . This starts the subtree syncing
You can now edit files in either place. to pull changes from /etc: git subtree pull. to push changes to etc: git subtree push. git is now managing the commit shas and diffs for both directories.
The home repo is the "canonical" one that you backup , push to github/gitlab etc. /etc can just stay local for "deployment".
You can take it a step further by editing the home repo on another machine. this pattern lets you fan in and out to multiple machines and etcs so you can manage all of the variations from a single repo.
describing it is more complicated than just doing it. It's really just push/pull which triggers a normal merge over multiple directories.
git subtree push -P pi4.local pi4.local master
* It's easy to setup on a new machine, no creating symlinks on every setup
* I create separate branches for different machines/environments. Like, currently, I have a branch for macos and my master branch is for devcontainer, but I have had a linux branch too.
I copied the post to a markdown as a README in the repository in the off chance Atlassian deletes the post for some reason.
Most recently, I started moving any config files I could into the .config to keep the home directory clean. i.e. .config/git .config/fish and .config/zsh
My only big issue is how big ~/.config/ gets as a directory compared to how much I really want to keep/need in terms of a fresh setup. Similar for my ~/src/ directory, with all the ./.git/ files. I kind of wish there were a "smarter" backup/restore tool that could handle a few of these things better than ham-fisting and rsyncing all the things.. I was more selective in my restore when configuring my new computer earlier in the year.