Every time I got a fresh Ubuntu VPS, I lost half a day to the same ritual: install zsh, copy over my .zshrc, remember which tools I had on the old machine, fix the bat vs batcat mess, reconfigure tmux, and inevitably discover a missing CLI a week later mid-task.

The fix was two things working together: GNU Stow for the config files, and a small set of idempotent bash scripts for everything Stow can't do (packages, services, login shell). Now a new server goes from bare Ubuntu 24.04 to my complete dev environment with one script, and I can re-run it any time without breaking anything.

This post walks through the whole setup as released in v1.1.0, then where it's heading next: from a collection of scripts to a proper CLI-driven tool. The full repo is on GitHub: ubuntu-server-dotfiles.

What is GNU Stow, and why use it for dotfiles?

GNU Stow is a symlink farm manager. You keep your real config files in a git repo, organized into "packages" that mirror your home directory, and Stow creates symlinks from $HOME into the repo: