Automate the setup and configuration of your Windows development environment.
PowerShell
2,446
193 commits
updated Sep 26, 2026
Opinionated setups for Windows dev boxes. Idempotent. CI-tested.
Your dev environment should help you ship, not become another project to debug. Try the new Windows developer configuration and spend less time setting up, more time building something awesome.
Three developer setups live in this repo. Pick the one that matches what you want:
| You want... | Go to |
|---|---|
| A complete dev workstation: tools, OS settings, WSL, and terminal. One command, restarts once. | Windows Dev Config |
| A polished WSL shell: zsh/bash, Starship, CLI tools, and a themed terminal profile. Interactive or unattended. | WSL Comfort |
| A single language toolchain: Node, Python, SQL, PowerShell, .NET, Rust, Go, Java, PHP, WinForms, or WinUI 3. One command each. | Workloads |
Turns a fresh Windows 11 box into a clean, distraction-free dev workstation in one shot.
A set of PowerShell scripts that installs dev tools, applies opinionated Windows settings, and sets up WSL + Ubuntu through the required reboot. Nothing to clone, nothing to install first. Idempotent, so it's safe to re-run on an existing machine.
Open any PowerShell window — elevated or not — and run:
irm https://aka.ms/devconfig/standard/setup.ps1 | iex
irm https://aka.ms/devconfig/full/setup.ps1 | iex
⚠️ It will restart your machine, once. Enabling WSL needs a Windows optional feature that requires a restart. You get a 10-second warning, and a scheduled task resumes setup after you sign back in and accept the UAC prompt. Save your work before you start.
Full details — every setting it changes, how to undo them, and troubleshooting: windows-dev-config/README.md.
Also known as Comfort Shell. An interactive setup for a polished Windows + WSL shell environment.
WSL Comfort stands apart. It supports both interactive and non-interactive modes, and lets you pick and choose individual components. The Windows side handles WSL, the distro, the Cascadia Code Nerd Font, and a themed Windows Terminal profile. The Linux side runs inside the distro and configures the shell itself.
.\wsl-comfort\install.ps1
Interactive by default. Use -NonInteractive for unattended runs; the bootstrap also takes --minimal for a smaller setup. The Linux half is standalone, so you can copy comfort-shell-bootstrap.sh onto any Ubuntu host and run it directly.
fzf, rg, fd, bat, eza, zoxide, jq.open shims (pbcopy, pbpaste, open).Full details: wsl-comfort/readme.md.
Just want one toolchain? Pick a row. Each workload ships a configuration.winget file plus a matching install.ps1 shim that applies it and refreshes PATH in the current session.
Most of the single-language workloads use winget configure. If you've never used it before, enable it once:
winget configure --enable
[!IMPORTANT] If
wingetis being invoked from a non-elevated environment, the Microsoft Visual C++ Redistributable (aka.ms/vcredist) must also be installed — without itwinget configurefails with an internal error. Install it once with the command for your machine's architecture:# x64: winget install Microsoft.VCRedist.2015+.x64 # ARM64: winget install Microsoft.VCRedist.2015+.arm64
If that fails or winget configure is still not recognized, see Troubleshooting. Windows Dev Config doesn't use winget configure and needs none of this.
| Workload | Installs | Run |
|---|---|---|
| TypeScript | Node.js LTS + global typescript | winget configure -f .\Workloads\typescript\configuration.winget --accept-configuration-agreements --disable-interactivity |
| PHP | PHP 8.5 | winget configure -f .\Workloads\php\configuration.winget --accept-configuration-agreements --disable-interactivity |
| .NET | .NET SDK 10 | winget configure -f .\Workloads\dotnet\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Go | Go (rolling) | winget configure -f .\Workloads\go\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Java | Microsoft Build of OpenJDK 25 LTS | winget configure -f .\Workloads\java\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Rust | Rust stable via rustup | winget configure -f .\Workloads\rust\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Python | Python 3.14 + uv | winget configure -f .\Workloads\python\configuration.winget --accept-configuration-agreements --disable-interactivity |
| SQL | Lightweight SQL Developer: SQL Server + sqlcmd + VS Code extension | winget configure -f .\Workloads\sql\configuration.winget --accept-configuration-agreements --disable-interactivity |
| PowerShell | PowerShell 7 + VS Code PowerShell extensions + PSScriptAnalyzer settings | winget configure -f .\Workloads\powershell\configuration.winget --accept-configuration-agreements --disable-interactivity |
| WinForms | .NET SDK 10 + Windows Forms desktop workload | winget configure -f .\Workloads\winforms\configuration.winget --accept-configuration-agreements --disable-interactivity |
| WinAppCLI | Developer Mode + .NET SDK 10 + Windows App Development CLI | winget configure -f .\Workloads\winappcli\configuration.winget --accept-configuration-agreements --disable-interactivity |
| WinUI 3 | .NET SDK 10 + Visual Studio Community + Windows App SDK / WinUI 3 + WinAppCLI | winget configure -f .\Workloads\winui\configuration.winget --accept-configuration-agreements --disable-interactivity |
Want the PATH refresh in your current shell? Use the matching shim instead of calling winget configure directly:
.\Workloads\python\install.ps1
Heads up: WinForms and WinUI 3 pull down several gigabytes of Visual Studio components. Fine on a real workstation, painful on a small VM.
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 -2146233079This usually means the Microsoft Visual C++ Redistributable is missing — winget configure depends on it when invoked from a non-elevated environment. Install it once with the command for your architecture, then re-run:
# x64:
winget install Microsoft.VCRedist.2015+.x64
# ARM64:
winget install Microsoft.VCRedist.2015+.arm64
See aka.ms/vcredist for the standalone installer. The repo's Workloads/_common/enable-winget-configure.ps1 script also installs it automatically as part of enabling winget configure.
python / node / the tool isn't on PATHOpen a new terminal, or run the matching install.ps1 shim to refresh PATH in the current session.
It registered a scheduled task named WindowsDevConfigResume, so the run picks itself back up about 30 seconds after you sign back in. A window opens on its own and finishes the WSL setup. If nothing appears 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.
Run .\wsl-comfort\install.ps1 on the Windows side instead. It installs WSL first.
wsl --install ... failed with exit code -1WSL 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 session on 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-levelwindows-dev-config/,Workloads/, andwsl-comfort/folders are Authenticode-signed release copies regenerated by the sign pipeline, so please don't edit them directly. Full details insrc/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.
PowerShell
89.8%
C#
5.6%
Shell
4.6%
Automate the setup and configuration of your Windows development environment.
PowerShell
2,446
193 commits
updated Sep 26, 2026
Opinionated setups for Windows dev boxes. Idempotent. CI-tested.
Your dev environment should help you ship, not become another project to debug. Try the new Windows developer configuration and spend less time setting up, more time building something awesome.
Three developer setups live in this repo. Pick the one that matches what you want:
| You want... | Go to |
|---|---|
| A complete dev workstation: tools, OS settings, WSL, and terminal. One command, restarts once. | Windows Dev Config |
| A polished WSL shell: zsh/bash, Starship, CLI tools, and a themed terminal profile. Interactive or unattended. | WSL Comfort |
| A single language toolchain: Node, Python, SQL, PowerShell, .NET, Rust, Go, Java, PHP, WinForms, or WinUI 3. One command each. | Workloads |
Turns a fresh Windows 11 box into a clean, distraction-free dev workstation in one shot.
A set of PowerShell scripts that installs dev tools, applies opinionated Windows settings, and sets up WSL + Ubuntu through the required reboot. Nothing to clone, nothing to install first. Idempotent, so it's safe to re-run on an existing machine.
Open any PowerShell window — elevated or not — and run:
irm https://aka.ms/devconfig/standard/setup.ps1 | iex
irm https://aka.ms/devconfig/full/setup.ps1 | iex
⚠️ It will restart your machine, once. Enabling WSL needs a Windows optional feature that requires a restart. You get a 10-second warning, and a scheduled task resumes setup after you sign back in and accept the UAC prompt. Save your work before you start.
Full details — every setting it changes, how to undo them, and troubleshooting: windows-dev-config/README.md.
Also known as Comfort Shell. An interactive setup for a polished Windows + WSL shell environment.
WSL Comfort stands apart. It supports both interactive and non-interactive modes, and lets you pick and choose individual components. The Windows side handles WSL, the distro, the Cascadia Code Nerd Font, and a themed Windows Terminal profile. The Linux side runs inside the distro and configures the shell itself.
.\wsl-comfort\install.ps1
Interactive by default. Use -NonInteractive for unattended runs; the bootstrap also takes --minimal for a smaller setup. The Linux half is standalone, so you can copy comfort-shell-bootstrap.sh onto any Ubuntu host and run it directly.
fzf, rg, fd, bat, eza, zoxide, jq.open shims (pbcopy, pbpaste, open).Full details: wsl-comfort/readme.md.
Just want one toolchain? Pick a row. Each workload ships a configuration.winget file plus a matching install.ps1 shim that applies it and refreshes PATH in the current session.
Most of the single-language workloads use winget configure. If you've never used it before, enable it once:
winget configure --enable
[!IMPORTANT] If
wingetis being invoked from a non-elevated environment, the Microsoft Visual C++ Redistributable (aka.ms/vcredist) must also be installed — without itwinget configurefails with an internal error. Install it once with the command for your machine's architecture:# x64: winget install Microsoft.VCRedist.2015+.x64 # ARM64: winget install Microsoft.VCRedist.2015+.arm64
If that fails or winget configure is still not recognized, see Troubleshooting. Windows Dev Config doesn't use winget configure and needs none of this.
| Workload | Installs | Run |
|---|---|---|
| TypeScript | Node.js LTS + global typescript | winget configure -f .\Workloads\typescript\configuration.winget --accept-configuration-agreements --disable-interactivity |
| PHP | PHP 8.5 | winget configure -f .\Workloads\php\configuration.winget --accept-configuration-agreements --disable-interactivity |
| .NET | .NET SDK 10 | winget configure -f .\Workloads\dotnet\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Go | Go (rolling) | winget configure -f .\Workloads\go\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Java | Microsoft Build of OpenJDK 25 LTS | winget configure -f .\Workloads\java\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Rust | Rust stable via rustup | winget configure -f .\Workloads\rust\configuration.winget --accept-configuration-agreements --disable-interactivity |
| Python | Python 3.14 + uv | winget configure -f .\Workloads\python\configuration.winget --accept-configuration-agreements --disable-interactivity |
| SQL | Lightweight SQL Developer: SQL Server + sqlcmd + VS Code extension | winget configure -f .\Workloads\sql\configuration.winget --accept-configuration-agreements --disable-interactivity |
| PowerShell | PowerShell 7 + VS Code PowerShell extensions + PSScriptAnalyzer settings | winget configure -f .\Workloads\powershell\configuration.winget --accept-configuration-agreements --disable-interactivity |
| WinForms | .NET SDK 10 + Windows Forms desktop workload | winget configure -f .\Workloads\winforms\configuration.winget --accept-configuration-agreements --disable-interactivity |
| WinAppCLI | Developer Mode + .NET SDK 10 + Windows App Development CLI | winget configure -f .\Workloads\winappcli\configuration.winget --accept-configuration-agreements --disable-interactivity |
| WinUI 3 | .NET SDK 10 + Visual Studio Community + Windows App SDK / WinUI 3 + WinAppCLI | winget configure -f .\Workloads\winui\configuration.winget --accept-configuration-agreements --disable-interactivity |
Want the PATH refresh in your current shell? Use the matching shim instead of calling winget configure directly:
.\Workloads\python\install.ps1
Heads up: WinForms and WinUI 3 pull down several gigabytes of Visual Studio components. Fine on a real workstation, painful on a small VM.
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 -2146233079This usually means the Microsoft Visual C++ Redistributable is missing — winget configure depends on it when invoked from a non-elevated environment. Install it once with the command for your architecture, then re-run:
# x64:
winget install Microsoft.VCRedist.2015+.x64
# ARM64:
winget install Microsoft.VCRedist.2015+.arm64
See aka.ms/vcredist for the standalone installer. The repo's Workloads/_common/enable-winget-configure.ps1 script also installs it automatically as part of enabling winget configure.
python / node / the tool isn't on PATHOpen a new terminal, or run the matching install.ps1 shim to refresh PATH in the current session.
It registered a scheduled task named WindowsDevConfigResume, so the run picks itself back up about 30 seconds after you sign back in. A window opens on its own and finishes the WSL setup. If nothing appears 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.
Run .\wsl-comfort\install.ps1 on the Windows side instead. It installs WSL first.
wsl --install ... failed with exit code -1WSL 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 session on 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-levelwindows-dev-config/,Workloads/, andwsl-comfort/folders are Authenticode-signed release copies regenerated by the sign pipeline, so please don't edit them directly. Full details insrc/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.
PowerShell
89.8%
C#
5.6%
Shell
4.6%