Windows 11 developer setup — the first hour after unboxing
Single-path setup for Windows 11: winget · WSL2 · Git · SSH. Bring a new PC to ready-to-git-push state.
There are two flavors of Windows development: (a) do everything inside WSL2/Linux, (b) run natively with PowerShell + Git Bash. This guide sets up both so you can pick by case. Node/Go/Python? WSL2 wins by a wide margin. .NET, games, Tauri, Win32 APIs? Native is the answer.
Target: Windows 11 (22H2 or newer) with winget available. Windows 10 mostly works, with minor winget differences.
TL;DR
- Four Windows 11 system settings (Explorer extensions/hidden, clipboard history, virtual desktop shortcuts)
- winget installs eight essentials in one line (Git, GH CLI, Windows Terminal, PowerShell 7, VS Code, mise, ripgrep, fzf)
- WSL2 + Ubuntu 24.04:
wsl --install -d Ubuntu-24.04 - Git globals + SSH ed25519 → register on GitHub →
gh auth login
Prerequisites
- Windows 11 22H2+ — confirm with
winver. This is the first build with winget bundled. - Admin rights — needed for WSL2 install and some system-scope winget packages.
- Internet + Microsoft account (effectively required on Windows 11 Home).
- Hardware virtualization — Intel VT-x or AMD-V enabled in BIOS/UEFI (required by WSL2). Usually on by default.
Verify with
systeminfo | findstr /C:"Hyper-V"— every "Hyper-V Requirements" line should read Yes.
1. Windows 11 system settings — 5 minutes
1.1 Explorer — show extensions, hidden files, full path
Win + E opens Explorer → View → Show → File name extensions + Hidden items. Or do it in one shot from PowerShell:
# Show extensions + hidden files
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name HideFileExt -Value 0
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name Hidden -Value 1
Stop-Process -Name explorer -Force1.2 Clipboard history (Win + V)
Very useful, off by default. Settings → System → Clipboard → Clipboard history ON.
1.3 Virtual desktops
Ctrl + Win + ←/→ — switch desktops. Built-in but many newcomers don't know it. The Windows answer to macOS swipe-between-spaces.
1.4 PowerToys (optional, strongly recommended)
Microsoft's official productivity suite. One winget line:
winget install Microsoft.PowerToys --source winget --silentHighlights: FancyZones (window tiling — the Rectangle equivalent), PowerToys Run (Alt + Space — Raycast equivalent), Keyboard Manager (key remapping).
2. winget — check the package manager
winget ships with Windows 11. Very old builds may need an update.
winget --version
# v1.x.x ← present? you're goodMissing or stale? Microsoft Store → search "App Installer" → update. winget lives inside that package.
Automation script (optional)
Prefer to run one script instead of every step? Always download → verify SHA-256 → inspect → run.
setup-windows.ps1# 1. Download
Invoke-WebRequest -Uri https://devalice.jaceclub.com/assets/windows/initial-setup/setup-windows.ps1 -OutFile setup-windows.ps1
# 2. Verify SHA-256
Get-FileHash setup-windows.ps1 -Algorithm SHA256
# expected: 75A9A5CC7B8804CF0808971A648B7174DADE3A5F32F2DB9C80A9783242EEEEBD
# (lowercase: 75a9a5cc7b8804cf0808971a648b7174dade3a5f32f2db9c80a9783242eeeebd)
# 3. Inspect
notepad setup-windows.ps1
# 4. Run (relax execution policy for this session only)
PowerShell -ExecutionPolicy Bypass -File .\setup-windows.ps1The script is idempotent — re-running after a partial failure is safe. It automates the winget install + Git config + SSH key creation. WSL2 install and GitHub key registration remain manual.
If you'd rather follow each step manually, continue below.
3. winget essentials — 10 minutes
3.1 Eight essentials in one line
winget install --silent --accept-source-agreements --accept-package-agreements `
Git.Git `
GitHub.cli `
Microsoft.WindowsTerminal `
Microsoft.PowerShell `
Microsoft.VisualStudioCode `
jdx.mise `
BurntSushi.ripgrep.MSVC `
junegunn.fzf| Package | Purpose |
|---|---|
Git.Git | Git for Windows (Git Bash included) |
GitHub.cli | gh |
Microsoft.WindowsTerminal | Tabbed terminal — vastly better than the default console |
Microsoft.PowerShell | PowerShell 7 (default is 5.1; 7 is much improved) |
Microsoft.VisualStudioCode | VS Code |
jdx.mise | Runtime version manager (Node · Python · …) |
BurntSushi.ripgrep.MSVC | rg — faster grep |
junegunn.fzf | Fuzzy finder |
Some packages need a fresh terminal so PATH refreshes.
3.2 Verify
git --version
gh --version
pwsh --version # PowerShell 7
code --version
mise --version
rg --version3.3 Make Windows Terminal the default
Settings → Privacy & security → For developers → Terminal → choose Windows Terminal. Any future console launch opens in Windows Terminal.
4. WSL2 + Ubuntu — 10 minutes
If you'll do real Linux work, WSL2 is your primary tool. Node, Python, Docker — all much smoother inside WSL2.
4.1 Install
In an admin PowerShell (right-click → "Run as administrator"):
wsl --install -d Ubuntu-24.04This single line:
- Enables the WSL feature
- Enables the Virtual Machine Platform
- Sets WSL2 as the default version
- Downloads and installs Ubuntu 24.04
Reboot once. After reboot, Ubuntu launches and asks for a username/password.
4.2 Initial cleanup
Inside Ubuntu:
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git curl unzipTo open the current Ubuntu folder in Windows VS Code (auto-installs the WSL Remote extension):
code .Access WSL files via
\\wsl$\Ubuntu-24.04\home\<user>from Explorer. Linux file I/O is fastest inside WSL paths (/home/...). Putting code under Windows paths (/mnt/c/...) is much slower.
4.3 Verify WSL state
From PowerShell:
wsl --status
wsl --list --verbose
# NAME STATE VERSION
# Ubuntu-24.04 Running 25. Git globals + SSH — 10 minutes
WSL and Windows have independent git configs. Set both up.
5.1 Windows-side Git config (PowerShell)
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git config --global pull.rebase false
git config --global core.autocrlf true # Auto-handle Windows line endings
git config --global core.editor "code --wait"5.2 SSH key — ed25519
ssh-keygen -t ed25519 -C "you@example.com"
# Default path: $env:USERPROFILE\.ssh\id_ed25519 (Enter to accept)
# Passphrase: optionalStart ssh-agent + add the key (admin PowerShell):
# Auto-start the service
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
# Add the key
ssh-add $env:USERPROFILE\.ssh\id_ed255195.3 Register the public key on GitHub
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-ClipboardOpen https://github.com/settings/ssh/new → Title: "Windows 11 (PC name)" → paste the key → Add SSH key.
5.4 gh CLI auth
gh auth login
# GitHub.com → HTTPS → Y (auth Git with GitHub credentials) → Login with a web browser5.5 WSL-side Git config (optional, if WSL is your daily driver)
Inside Ubuntu, repeat:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
ssh-keygen -t ed25519 -C "you@example.com"
# Print the public key → register separately on GitHub (a distinct key per machine surface keeps audits clear)
cat ~/.ssh/id_ed25519.pubTip: You can symlink Windows's
%USERPROFILE%\.sshinto WSL's~/.sshto share keys, but permissions often go wrong. Keeping separate keys is safer.
6. Verify — did everything install correctly?
From PowerShell:
Write-Host "--- Versions ---"
[System.Environment]::OSVersion.Version
git --version
gh --version | Select-Object -First 1
pwsh --version
wsl --list --verbose
Write-Host "--- GitHub auth ---"
ssh -T git@github.com 2>&1 | Select-Object -First 1
gh auth status 2>&1 | Select-Object -First 3Expected output:
--- Versions ---
Major Minor Build
----- ----- -----
10 0 22631 (Windows 11 22H2+)
git version 2.x.x.windows.x
gh version 2.x.x
PowerShell 7.x.x
NAME STATE VERSION
Ubuntu-24.04 Running 2
--- GitHub auth ---
Hi <your-username>! You've successfully authenticated, ...
github.com
✓ Logged in to github.com account <your-username>
To verify on the WSL side, inside Ubuntu:
git --version
ssh -T git@github.com 2>&1 | head -17. Troubleshooting
wsl --install fails with 0x80070003 or a virtualization error
VT-x / AMD-V is disabled in BIOS. Reboot into BIOS → CPU Configuration → Virtualization Technology → Enabled → save and reboot.
winget "command not found"
App Installer is missing or very old. Microsoft Store → search "App Installer" → install/update.
PowerShell script execution blocked
.\setup-windows.ps1 : File ... cannot be loaded because running scripts is disabled on this system.
One-session bypass:
PowerShell -ExecutionPolicy Bypass -File .\setup-windows.ps1Persistent (user scope):
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSignedgit push returns "Permission denied (publickey)"
ssh-add -l # Is the key in the agent?
ssh -vT git@github.com 2>&1 | Select -Last 20ssh-agentservice may have stopped →Start-Service ssh-agent- The public key may not be on GitHub → check
https://github.com/settings/keys
Time inside WSL drifts (future/past) after sleep
Common after suspend. Inside WSL:
sudo hwclock -swinget refuses with "found multiple packages"
ID collision. Pin with --id:
winget install --id Git.Git --exactKorean text breaks in Windows Terminal
Settings (Ctrl + ,) → that profile → Appearance → Font face → Cascadia Mono or D2Coding (any font with proper Korean coverage).
8. What's next
This guide ended at "Windows 11 can git push". After that:
- Advanced WSL2 — Docker Desktop ↔ WSL2 integration, memory caps (
%USERPROFILE%\.wslconfig) — WSL tuning - Dev tooling — language runtimes (Node · Python), editor extensions
- AI agent environment — Claude Code setup — /ai-agents/claude-code
- Concurrent Mac use — input sharing, file sync — /multi-os/input-sharing
References
Changelog
- 2026-05-12 — Initial English translation (devAlice M3 i18n seed)