Ansible playbook that provisions a Windows 11 + WSL2 Ubuntu workstation, and the shell, editor and tooling configuration that goes with it.
Documentation: https://irish1986.github.io/dotfiles/
bash -c "$(curl -fsSL https://raw.githubusercontent.com/irish1986/dotfiles/main/scripts/setup)"That takes a bare Ubuntu install to a working workstation, and is safe to run again afterwards. Note the form — bash -c "$(curl ...)" passes the script as an argument, so stdin stays on the terminal and sudo can prompt; curl | bash would consume stdin and the prompt would hang.
Re-runs take arguments:
~/.dotfiles/scripts/setup --tags zsh,git # only those roles
~/.dotfiles/scripts/setup --tags configure # only config, no installs
~/.dotfiles/scripts/setup --check --diff # preview, change nothing
~/.dotfiles/scripts/setup --help- One command on a fresh machine, and safe to re-run.
- Every supported Ubuntu LTS — 22.04, 24.04 and 26.04, with no codename hardcoded anywhere.
- WSL2 first. The Windows side is managed too: Terminal settings, fonts, clipboard,
wsl.confand.wslconfig. - Fail loudly. Each role ends by asserting the thing it installs actually works, so a role cannot quietly do nothing.
| Section | Contents |
|---|---|
| Getting started | Install, configure, secrets |
| Roles | What each role does, generated from its source |
| Reference | Variables, collections, CLI, playbook |
| Architecture | Role layout and the WSL boundary |
| Troubleshooting | Things that go wrong |
Role pages, the variables table and the collections table are generated from the repository on every docs build, so they cannot drift from the code.
Machine configuration lives in inventory/group_vars/all.yml, which is gitignored because it holds identity. scripts/setup seeds it from docs/examples/group_vars-all.yml on a fresh clone, filling in your user, home directory and hostname. To reset it:
cp ~/.dotfiles/docs/examples/group_vars-all.yml ~/.dotfiles/inventory/group_vars/all.ymldotfiles_roles in that file decides which roles run.
uv run mkdocs serve # docs at http://127.0.0.1:8000
prek run --all-files # every lint hook
scripts/check-structure # role layout checks
ansible-playbook main.yml --check # preview, change nothingCommit conventions and the release process are in CONTRIBUTING.md. Releases are automated by release-please; there is nothing to run by hand.
Heavily influenced by ALT-F4-LLC and TechDufus.
MIT — see LICENSE.