Idempotent developer bootstrap for Ubuntu 26.04 LTS on bare-metal/VM installations and WSL2. The installer detects WSL automatically; Windows integration is never configured on native Ubuntu.
git clone https://github.com/w0rldx/dotfiles.git ~/.dotfiles && bash ~/.dotfiles/bootstrap/install.shOn native Ubuntu, the bootstrap uses the normal Linux PATH and optionally installs native VS Code. Under WSL it additionally:
- removes conflicting Windows Node.js, pnpm, and PowerShell entries from PATH;
- skips the native VS Code package and prints WSL extension guidance;
- prints WSL-specific systemd guidance only when systemd is unavailable.
Rootless Docker uses systemd user services when available. If systemd is not running, the bootstrap falls back to starting dockerd-rootless.sh in the user session and zsh auto-starts it on login. If running in WSL2 and you want systemd:
- Edit
/etc/wsl.conf:
[boot]
systemd=true
- From Windows, run:
wsl.exe --shutdown- Re-open your WSL distro and rerun the installer.
Microsoft Learn: https://learn.microsoft.com/windows/wsl/systemd
- Installed from Docker's official Ubuntu apt repo (docker-ce, docker-ce-rootless-extras, etc.).
DOCKER_HOSTis set tounix://$XDG_RUNTIME_DIR/docker.sockwith a fallback to~/.docker/runwhen systemd is unavailable.- With systemd: user service
docker.serviceis enabled and linger is turned on. - Without systemd:
~/.config/docker/rootless-session.shstartsdockerd-rootless.shon login if it's not already running.
- Install VS Code on Windows (not inside WSL).
- During install, enable "Add to PATH".
- Install the "Remote Development" extension pack (or at minimum the WSL extension).
- From WSL, run:
code .— this opens the folder in VS Code and installs the VS Code Server in WSL automatically.
Native Linux VS Code is opt-in. Set the environment variable to install via the official Microsoft apt repo:
INSTALL_VSCODE_LINUX=1 ./bootstrap/install.shLanguage runtimes and user-level CLI tools are declared in mise/mise.toml and installed together by bootstrap/steps/30-mise.sh. Run mise outdated to inspect available updates and mise upgrade to update the toolchain.
- Source state lives in
chezmoi/(enabled via.chezmoiroot). - The installer runs
chezmoi init --apply <repo>on first run, thenchezmoi applyon subsequent runs. - Daily operations:
chezmoi diffchezmoi applychezmoi update
- Lint:
./scripts/lint-shell.sh - Format:
./scripts/format-shell.sh - Prereqs:
- ShellCheck and shfmt are managed by mise; zsh is installed through apt.
- Apt packages: zsh, git, curl, ca-certificates, build-essential, unzip, rsync
- System/custom sources: Docker Engine, Oh-My-Zsh, Powerlevel10k, zsh-autosuggestions, zsh-syntax-highlighting, mise, try, and optional native VS Code
- Mise toolchain: Node.js LTS, pnpm, Go, Rust, .NET SDK, Bun, Python, uv, Codex, GitHub CLI, lazygit, lazydocker, chezmoi, fzf, ripgrep, fd, eza, fastfetch, ShellCheck, and shfmt
-
Run full bootstrap:
./bootstrap/install.sh
-
Run doctor checks only:
./bootstrap/steps/90-doctor.sh
- Pull latest changes:
cd ~/.dotfiles && git pull
- Re-run bootstrap (safe/idempotent):
./bootstrap/install.sh
- Targeted updates:
mise upgradechezmoi apply
If the installer is not executable, either run:
chmod +x ./bootstrap/install.shor execute it explicitly:
bash ./bootstrap/install.shNote: bootstrap/steps/90-doctor.sh re-execs via zsh -lc once so PATH updates from your zsh env are picked up.