run-windows11.py no longer installs Windows or touches ISO/img files: it creates a QCOW2 overlay on the base image (made by vm-images/build-windows-base.sh) and, when the disk is created, mounts seed.iso. Windows reads the Unattend.xml in its root during the specialize and OOBE passes (host name, account, auto logon, Remote Desktop) and Configure-Windows.ps1 then installs OpenSSH with the host's key, turns off Windows Update and copies the installer scripts. The VM hardware uses devices with inbox Windows drivers (IDE/NVMe, e1000e, ramfb on arm64), since the base image has no VirtIO drivers. Autounattend.xml moves to vm-images; the vm-images pointer is updated. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Cloud-init seed images
Each operating system has an independent NoCloud configuration and generated
seed.iso:
seediso/
├── debian13/
├── almalinux10/
├── fedora44/
└── ubuntu2604/
Keeping per-OS metadata separate allows each VM to use a distinct hostname and
cloud-init instance-id. Generated ISO files are ignored by Git and are built
automatically by the corresponding launcher when missing.