I Didn't Back Up My Dotfiles

Most of the work that I do at a computer is with text. Whether I’m communicating, coding, or creating a document, the act of doing so involves typing letters with a cursor. The purest form of that for me is in the terminal - fewer interruptions, tools that do one thing (and one thing well), and nothing competing for my attention.

I’ve been using Linux and BSD for more than 20 years - as a server, desktop, NAS, switch, hobby board. I wasn’t the type to customize my system - my idea of tricking out my shell was to install simpsons-fortune-mod and add it to my .bash_profile. When I got a new system, it was usually a new distro, different config files, and vi or nano to edit them.

Somewhere along the way I discovered tools like oh-my-zsh — easy shell customization by editing a single file — and Homebrew’s Brewfile, which makes package installs declarative. I realized I had customized my environment exactly the way I liked it, and found myself relying on it more and more.

And then it was gone.

The VM was corrupted by a power failure and the mirror duplicated it before I caught it. My development work was backed up to GitHub — I always back up my work. But I hadn’t backed up my dotfiles or configs. I wasn’t used to respecting the work I’d put into building the environment, and I didn’t realize how much of a pain it was going to be to reproduce.

So I started looking for something lightweight and declarative — easy to customize, easy to use on a fresh install. Ansible was too complex. Everything else seemed built for managing infrastructure at a scale I didn’t have.

I started with a shell script because I wanted something I could drop into a fresh install and be working in my environment within minutes. Bash alone made some tasks awkward, so I landed on a Python script that generates the shell script. You configure your environment on your main machine, and the output is a deployable artifact you run on the target. The two-machine design made more sense at the start than it does now — in practice, most people will run both on the same machine. It works for now, but I have some ideas for how to handle this better in a future release.

That’s CUTEkit. It reads a single YAML file and turns a fresh Ubuntu 24.04 server into a configured terminal workbench — installs packages via APT and mise, sets up shell hooks, creates a regular user, and hardens SSH. One config file, one script, and you have your environment up and running in a matter of minutes.

I have some exciting features that I’m looking forward to rolling out, so watch this space!