Opinionated setups for Windows dev boxes. Idempotent. CI-tested.
Set up a new Windows dev box in minutes, not hours. Pick a setup, run one command, get back to building. Everything here is safe to re-run.
| You want... | Go to |
|---|---|
| A full dev workstation: tools, Windows settings, WSL, and terminal. One command, one restart. | Windows Dev Config |
| A nicer WSL shell: zsh/bash, Starship, CLI tools, and a themed terminal profile. | WSL Comfort |
| One language or toolchain. | Workloads |
| Local AI: PyTorch for your GPU, plus Ollama, llama.cpp, or Foundry Local. | AI tooling |
Installs dev tools, applies opinionated Windows settings, and sets up WSL + Ubuntu — restart included. Nothing to clone, nothing to install first.
Open any PowerShell window — elevated or not — and run:
What you get #
-
Dev tools: Windows Terminal, PowerShell 7, Git, GitHub CLI, GitHub Copilot CLI, VS Code, .NET SDK 10, Python 3.14 + uv, Node.js LTS + nvm, Coreutils for Windows, Windows App CLI, Oh My Posh, and PowerToys.
-
Terminal: PowerShell 7 as the default profile, Oh My Posh in your prompt, Cascadia Mono NF as the default font, and a GitHub Copilot profile in the dropdown.
-
Windows settings: Dark theme, long paths, File Explorer defaults, Start/Search settings, and Do Not Disturb
-
WSL: WSL platform + Ubuntu, including the restart and the automatic resume afterwards.
-
Everything from standard
-
Windows settings: Developer Mode, Sudo, widgets off, and Edge policies, additional Start/Search/System Tray settings
-
Remote Desktop: Enabled and firewall settings set
irm https://aka.ms/devconfig/standard/setup.ps1 | iex
irm https://aka.ms/devconfig/full/setup.ps1 | iex
Heads up — it may restart your PC. WSL needs virtualization turned on, so save your work first. Setup picks up where it left off after the reboot.
⚠️
Every tool and setting, how to undo them, and troubleshooting: Windows Dev Config README.
Also known as Comfort Shell. A polished Windows + WSL shell setup — zsh/bash, Starship prompt, modern CLI tools, themed terminal.
Open any PowerShell window and run:
irm https://aka.ms/devconfig/wsl-comfort/setup.ps1 | iex
Interactive by default — pick and choose components as it runs. For unattended installs, pass -NonInteractive:
& ([scriptblock]::Create((irm https://aka.ms/devconfig/wsl-comfort/setup.ps1))) -NonInteractive
Nothing to clone: it downloads the signed scripts, verifies them, and installs WSL first if it's missing. Already have a clone? .\wsl-comfort\install.ps1 works too. The Linux half (comfort-shell-bootstrap.sh) is standalone, so you can also copy it onto any Ubuntu host and run it directly.
What you can pick #
- Your choice of shell: zsh orbash .
- Optional Starship prompt.
- Optional modern CLI tools:
fzf,rg,fd,bat,eza,zoxide,jq. - Optional clipboard and
openshims (pbcopy,pbpaste,open). - Optional Homebrew .
- Optional Git defaults.
- A themed Windows Terminal profile using Cascadia Code Nerd Font.
Full details: wsl-comfort/readme.md.
Just want one toolchain? Each of these is a single command.
| Workload | Run via IRM Powershell call |
|---|---|
| WinUI 3 | irm https://aka.ms/devconfig/winui/setup.ps1 | iex |
| WinForms | irm https://aka.ms/devconfig/winforms/setup.ps1 | iex |
| WinAppCLI | irm https://aka.ms/devconfig/winappcli/setup.ps1 | iex |
| .NET | irm https://aka.ms/devconfig/dotnet/setup.ps1 | iex |
| Go | irm https://aka.ms/devconfig/go/setup.ps1 | iex |
| Rust | irm https://aka.ms/devconfig/rust/setup.ps1 | iex |
| Workload | Run via Winget configure |
|---|---|
| TypeScript | winget configure -f .\Workloads\typescript\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Java | winget configure -f .\Workloads\java\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Python | winget configure -f .\Workloads\python\configuration.winget --accept-configuration-agreements --disable-interactivity |
| SQL | winget configure -f .\Workloads\sql\configuration.winget --accept-configuration-agreements --disable-interactivity |
| PowerShell | winget configure -f .\Workloads\powershell\configuration.winget --accept-configuration-agreements --disable-interactivity |
The winget configure will soon move to one-line style. Currently, to run them from a clone of this repo. What each one installs: Workloads.
Detects your GPU, installs the matching PyTorch build (CUDA, ROCm, Intel XPU, or CPU), and proves it works. Add a local model runtime if you want one.
| Workload | Run |
|---|---|
| Local AI (PyTorch for your hardware) | irm https://aka.ms/devconfig/local-ai/setup.ps1 | iex |
| Local AI + Ollama | irm https://aka.ms/devconfig/local-ai/ollama/setup.ps1 | iex |
| Local AI + llama.cpp | irm https://aka.ms/devconfig/local-ai/llama.cpp/setup.ps1 | iex |
| Local AI + Foundry Local | irm https://aka.ms/devconfig/local-ai/foundry/setup.ps1 | iex |
Individual pieces (CUDA, ROCm, Intel AI, PyTorch, llama.cpp, Ollama, Foundry Local), hardware support, and options: AI tooling workloads.
"Unrecognized command: configure" #
Run winget configure --enable. If winget configure is still not recognized after that, Workloads/_common/assert-winget-configure.ps1 tells you whether App Installer is too old, policy has disabled configuration, or something else needs fixing.
winget configure fails with "internal error" / error code -2146233079 #
winget configure fails with "internal error" / error code -2146233079
The Visual C++ Redistributable is missing. Install it, then re-run:
winget install Microsoft.VCRedist.2015+.x64
winget install Microsoft.VCRedist.2015+.arm64
Workloads/_common/enable-winget-configure.ps1 installs it automatically as part of enabling winget configure.
A workload says it succeeded but python / node / the tool isn't on PATH #
python / node / the tool isn't on PATH
Open a new terminal, or run the matching install.ps1 shim to refresh PATH in the current session.
Windows Dev Config rebooted the machine and looks stuck #
A scheduled task resumes the run about 30 seconds after you sign back in and finishes the WSL setup. Nothing after a couple of minutes? Run the one-liner again — it's safe to re-run and skips everything already done. More detail in windows-dev-config/README.md.
Comfort Shell bootstrap fails because WSL is missing #
Run the WSL Comfort one-liner from PowerShell on the Windows side instead. It installs WSL first.
WSL install fails with wsl --install ... failed with exit code -1 #
wsl --install ... failed with exit code -1
WSL needs hardware virtualization available to the OS. Two common root causes:
On bare metal: virtualization (VT-x / AMD-V) is disabled in BIOS/UEFI. Reboot into firmware settings, enable it, save, and reboot back into Windows. The exact label varies by vendor — check your motherboard or laptop manufacturer's documentation if you can't find it. #
Inside a VM: the host hasn't exposed nested virtualization to the guest. For a Hyper-V host, run this from an elevated PowerShell sessionon the host (with the guest VM powered off):
Set-VMProcessor -VMName <VM_NAME> -ExposeVirtualizationExtensions $true
Other hypervisors have their own equivalent settings — check your hypervisor's documentation.
Hit a bug, a stale doc, or a setup that fails on your machine? Open an issue at github.com/microsoft/WindowsDeveloperConfig/issues. Include your Windows build (winver), the exact command you ran, and the failing output. This helps us triage faster.
Contributions of all kinds are welcome: bug reports, doc fixes, new workloads, voice-and-tone tweaks. Start with CONTRIBUTING.md, then read src/docs/development.md for the CI matrix, the "how to add a language" walkthrough, and how the sign pipeline works.
Note on the repo layout: the src/ tree is the source of truth. The top-level windows-dev-config/, Workloads/, and wsl-comfort/ folders are Authenticode-signed release copies regenerated by the sign pipeline, so please don't edit them directly. Full details in src/docs/development.md.
The single source of truth for every flow (paths, build/run commands, ids, language metadata) is src/manifest.yml. The Command Palette extension, the CI harness, and the per-flow shims all read from it, so keep it in sync when you add or rename a flow.