Installation Guide¶
This guide covers installation scenarios for workstations, servers, and containers.
Quick Start¶
🖥️ Workstations (Linux/macOS)¶
Full setup including dotfiles, system packages, and development tools.
☁️ Servers & Containers¶
Minimal setup for headless environments (no GUI, no heavy runtimes).
# Automated (from a local clone)
git clone https://github.com/jerdaw/dotfiles.git ~/repos/dotfiles
cd ~/repos/dotfiles
./scripts/bootstrap --server
# Or Dotfiles Only (via chezmoi)
chezmoi init --apply jerdaw/dotfiles --exclude "run_once_*"
Shell Strategy¶
This project uses a tiered shell policy (see ADR-013):
- Workstations:
zshis the full interactive shell (plugins, prompt UX, advanced keybindings). - Servers/Homelab:
bashis the stable baseline by default. - Bash Baseline Guarantees: guarded optional tool init, conservative history defaults, and isolated AI-agent history.
- Both supported: Shared config must stay safe in either shell.
Detailed Installation¶
Workstation Setup¶
The default bootstrap script installs: - System Packages: via .chezmoidata.yaml (apt/pacman/brew) - Mise Tools: via mise.toml (node, python, nvim, etc.) - Dotfiles: via chezmoi apply - Rollback Safety: partial plugin/config setup is rolled back automatically if install fails
Interactive Mode: The script will prompt you for: - Sudo password (for system packages) - SSH key generation - Age key generation (for secrets) - Installing zsh if it is missing (recommended for full interactive UX) - Changing the system default login shell to zsh (the prompt is shown again on reruns until the account shell is actually zsh)
Manual Steps:
git clone https://github.com/jerdaw/dotfiles.git ~/repos/dotfiles
cd ~/repos/dotfiles
./scripts/bootstrap
Failure behavior: - scripts/bootstrap uses an atomic clone flow to avoid partial repo directories on failed clone. - mise run install cleans up partial state (plugin clones + replaced config links) before exiting on error. - Re-running mise run install repairs broken or partial TPM / Antidote checkouts instead of silently skipping them. - In non-interactive mode, missing zsh is not auto-installed; install continues with the supported bash baseline.
Server Setup¶
Use the --server flag for a lighter footprint. This uses mise-server.toml which excludes: - Desktop apps (WezTerm, VS Code) - Heavy tools (Atuin, Lazygit) - Fonts
Ansible Integration: For homelabs, use the provided playbook:
Server Profiles¶
The --profile flag selects a specialized server configuration from mise-profiles/:
See mise-profiles/README.md for the full list.
Windows (WSL2)¶
Prerequisites: - Windows 10/11 - PowerShell (Admin)
One-Liner:
Set-ExecutionPolicy Bypass -Scope Process -Force
irm https://raw.githubusercontent.com/jerdaw/dotfiles/main/mise-tasks/setup/provision/windows/bootstrap.ps1 | iex
This installs: - WSL2 & Hyper-V - Winget packages (VS Code, Windows Terminal) - Chocolatey packages
Post-Install:
- Open Ubuntu/Debian in WSL
- Run the Linux bootstrap command above
Post-Installation¶
After the bootstrap completes:
- Restart Shell:
- Workstation/full UX:
exec zsh - Server/baseline:
exec bash -l
- Workstation/full UX:
- Verify: Run
dots doctorto check health. - Sync History:
atuin login(if installed). - Secrets:
- Copy template:
cp dot_secrets.example ~/.secrets - Or setup encryption:
dots setup-secrets
- Copy template:
Uninstalling¶
To remove symlinks and restore state:
Related Documentation¶
- Day One Guide - Getting started with your new environment.
- Troubleshooting - Common installation issues.
- Customization - How to configure your setup.