Install
$ agentstack add skill-obra-superpowers-lab-windows-vm ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Headless Windows 11 VM
Manage a headless Windows 11 VM running via dockur/windows in Docker with KVM acceleration. The VM is accessible via SSH only — no RDP or GUI required.
Host prerequisites
- Docker
- KVM support (
/dev/kvmmust exist — check withls /dev/kvm) sshpass(sudo apt install sshpass)imagemagick(optional, for screenshot debugging:sudo apt install imagemagick)
Configuration
- Container name:
windows11 - VM directory:
$HOME/windows-vm/ storage/— VM disk image (managed by dockur, wiped on recreate)iso/win11x64.iso— cached Windows ISO (7.3GB, persists across recreates)oem/install.bat— post-install script (installs OpenSSH Server)- Credentials: user / password
- SSH:
localhost:2222(bound to 127.0.0.1 only) - RDP:
localhost:3389(bound to 127.0.0.1 only, fallback) - Web console:
localhost:8006(VNC in browser, for debugging) - Resources: 8GB RAM, 4 CPU cores, 64GB disk
Actions
create — First-time setup or full recreate
- Ensure directories exist:
``bash mkdir -p "$HOME/windows-vm/oem" "$HOME/windows-vm/storage" "$HOME/windows-vm/iso" ``
- Ensure
$HOME/windows-vm/oem/install.batexists with OpenSSH setup:
``bat @echo off echo Installing OpenSSH Server... powershell -Command "Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0" 2>nul powershell -Command "Get-WindowsCapability -Online -Name OpenSSH.Server* | Add-WindowsCapability -Online" 2>nul dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0 2>nul powershell -Command "Start-Service sshd" 2>nul powershell -Command "Set-Service -Name sshd -StartupType Automatic" powershell -Command "New-ItemProperty -Path 'HKLM:\SOFTWARE\OpenSSH' -Name DefaultShell -Value 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -PropertyType String -Force" powershell -Command "New-NetFirewallRule -Name 'OpenSSH-Server' -DisplayName 'OpenSSH Server' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22" powershell -Command "Get-Service sshd" 2>nul echo Done. ``
- If recreating, remove the old container and disk:
``bash docker stop windows11 && docker rm windows11 rm -f "$HOME/windows-vm/storage/data.img" ``
- Launch the container. There are two cases:
If cached ISO exists ($HOME/windows-vm/iso/win11x64.iso): ``bash docker run -d \ --name windows11 \ -p 127.0.0.1:3389:3389 \ -p 127.0.0.1:2222:22 \ -p 127.0.0.1:8006:8006 \ -e RAM_SIZE="8G" \ -e CPU_CORES="4" \ -e DISK_SIZE="64G" \ -e USERNAME="user" \ -e PASSWORD="password" \ --cap-add NET_ADMIN \ --device /dev/kvm \ -v "$HOME/windows-vm/storage:/storage" \ -v "$HOME/windows-vm/oem:/oem" \ -v "$HOME/windows-vm/iso/win11x64.iso:/boot.iso" \ dockurr/windows ``
First time (no cached ISO) — omit the /boot.iso mount and add VERSION: ``bash docker run -d \ --name windows11 \ -p 127.0.0.1:3389:3389 \ -p 127.0.0.1:2222:22 \ -p 127.0.0.1:8006:8006 \ -e RAM_SIZE="8G" \ -e CPU_CORES="4" \ -e DISK_SIZE="64G" \ -e VERSION="win11" \ -e USERNAME="user" \ -e PASSWORD="password" \ --cap-add NET_ADMIN \ --device /dev/kvm \ -v "$HOME/windows-vm/storage:/storage" \ -v "$HOME/windows-vm/oem:/oem" \ dockurr/windows ` After the ISO downloads and Windows boots, **immediately** copy the ISO out before the container is ever stopped (dockur wipes /storage on recreate): `bash cp "$HOME/windows-vm/storage/win11x64.iso" "$HOME/windows-vm/iso/win11x64.iso" ``
- Wait for Windows install + OpenSSH setup to complete. This takes 20-30 minutes for a
fresh install (the OEM install.bat runs at the end of Windows OOBE and downloads OpenSSH from Microsoft, which is slow). Monitor with: ``bash docker logs -f windows11 ` You can also watch the VM screen via the web console at http://localhost:8006`.
To check if SSH is up: ``bash sshpass -p 'password' ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 -p 2222 user@localhost "whoami" ``
- Once SSH is responding, install Node.js and Claude Code by piping a setup script via stdin
(avoids PowerShell escaping hell over SSH): ```bash cat &1 | tail -5
### ssh — Connect to the VM
```bash
ssh -p 2222 user@localhost
screenshot — See what's on the VM screen (for debugging)
docker exec windows11 bash -c "echo 'screendump /tmp/screen.ppm' | nc -w 2 localhost 7100" > /dev/null 2>&1
sleep 1
docker cp windows11:/tmp/screen.ppm /tmp/screen.ppm
convert /tmp/screen.ppm /tmp/screen.png
Important Notes
- ISO caching: The
/storagevolume is managed by dockur and gets wiped on recreate. Store the ISO separately in$HOME/windows-vm/iso/and mount it as/boot.isoto skip the 7.3GB download. --cap-add NET_ADMINis required for port forwarding to work. Without it, QEMU falls back to user-mode networking and port forwarding silently fails.--device /dev/kvmis required for hardware acceleration.- Boot time: Fresh install takes 20-30 min (Windows install + OpenSSH download from Microsoft). Subsequent boots from existing
data.imgare fast (~2 min). - Ports are bound to
127.0.0.1only — not exposed to the network. - Do NOT use
-e VERSION="win11"when mounting/boot.iso— the version is auto-detected from the ISO.
Post-install gotchas
- Node.js is not pre-installed — the Claude Code install script (
irm https://claude.ai/install.ps1 | iex) will report success butclaudewon't work without Node. Install Node.js via MSI first. - npm global bin not in PATH — Node's MSI adds
C:\Program Files\nodejsto PATH but notC:\Users\user\AppData\Roaming\npm(wherenpm install -gputs binaries). Must add it to the system PATH (not user PATH) because OpenSSH's sshd only reads system PATH. After changing system PATH, restart sshd. - PowerShell execution policy — Default policy is
Restricted, which blocksclaude.ps1. Must set toRemoteSignedat LocalMachine scope (not CurrentUser) for it to take effect in SSH sessions. - Escaping hell — Running PowerShell commands over SSH with nested quotes is unreliable. Pipe scripts via stdin using
powershell -ExecutionPolicy Bypass -Command -instead. - Interactive SSH sessions don't get full PATH — Windows OpenSSH sshd doesn't properly propagate the system PATH to interactive PowerShell sessions. Fix: create a system-wide PowerShell profile (
$PROFILE.AllUsersAllHosts) that rebuilds$env:Pathfrom the registry on every login. - winget may not work — The Microsoft Store certificate can fail in a VM. Use direct MSI/installer downloads instead.
- Host key changes — Each recreated VM gets new SSH host keys. Run
ssh-keygen -R '[localhost]:2222'to clear the old one.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: obra
- Source: obra/superpowers-lab
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.