One tool, whole machine
Packages, system config, git repositories, and dotfiles.
One command bootstraps a machine: it ensures a new-enough Ansible, clones your dotfiles repo (or scaffolds a starter if you don't have one yet), and installs the Dotfiles Pro collection. Then dotpro apply converges the machine. It's the same command for every update.
Read the installer before you pipe it to a shell:
curl -LsSf https://dotfiles.pro/install.sh | lessThen run it against your own dotfiles repo:
curl -LsSf https://dotfiles.pro/install.sh | sh -s -- git@gitlab.com:yourname/mydotfiles.gitOr with no repo yet, to scaffold a starter in ~/.dotfiles:
curl -LsSf https://dotfiles.pro/install.sh | shStart from the one-machine example and go to multiple machines from there.
Your personal repo references it in requirements.yml:
collections:
- name: dotfilespro.rolesList the roles to run in playbook.yaml. The OS base is picked per machine from facts (ubuntu on Linux and WSL, macos on a Mac), so one file runs unchanged across all your machines. Add the roles you want, then override defaults with your own vars (git identity, repositories, aliases):
- hosts: localhost
connection: local
roles:
- role: dotfilespro.roles.ubuntu
when: ansible_facts.os_family == 'Debian'
- role: dotfilespro.roles.macos
when: ansible_facts.os_family == 'Darwin'
- dotfilespro.roles.git
- dotfilespro.roles.kubernetesDeclare only the settings you want under vars; everything else keeps the tool's own defaults. Your git identity and repositories are the usual starting point:
- hosts: localhost
# ...
vars:
git_config:
user:
name: Your Name
email: you@example.com
git_repositories:
.dotfiles:
repository: git@gitlab.com:yourname/mydotfiles.git
path: ~/.dotfilesThe first run and every later update are the same command. It's idempotent, so a re-run only touches what drifted. Preview with dotpro plan, target one role with dotpro tags <role>:
dotpro applydotpro is a smart Ansible wrapper
Every dotpro command shells out to plain Ansible, so the raw command is always one step away:
dotpro apply # ansible-playbook playbook.yaml --ask-become-pass
dotpro plan # ansible-playbook playbook.yaml --check --diff
dotpro tags git # ansible-playbook playbook.yaml --tags git
dotpro tags # ansible-playbook playbook.yaml --list-tags
dotpro vars # ansible-inventory --host $(hostname) --yaml
dotpro requirements --upgrade # ansible-galaxy collection install -r requirements.yml --upgradeGetting started → walks through the full setup.
A short tour of the everyday wins, the aliases, functions, and prompts that make a managed machine a pleasure to use. The highlights page covers each one in full; here is the whole list.
Servers stopped needing configuration management when they became disposable, rebuilt from images, orchestrated by Kubernetes. A developer laptop is the opposite: the last long-lived, mutable, personal machine in the stack, the one that can't be containerized because it's where the containers run.
Keeping such a machine up-to-date over time is exactly the problem configuration management was built for.
Most dotfiles tools manage the files in $HOME. This manages the whole machine (packages, system config, repositories, and dotfiles) on the configuration-management engine built for long-lived hosts. It's scored against chezmoi, yadm, Nix home-manager, Stow, dotbot, bare git, Salt, Puppet, Chef, MDM, devcontainers, and golden images, on each one's own terms.