Windows setup¶
A setup guide for programmers, etc., on Windows.
Hardware-specific setup¶
Intel and NVIDIA¶
I used these steps on 6 Intel+NVIDIA workstation builds.
- Download drivers from the NVIDIA driver page.
- Download and install the Intel Extreme Tuning Utility. Open it and view the system info and temperatures.
-
Overclock:
-
Restart your computer, enter the BIOS, and open the overclocking settings. In general, you’ll want to overclock the memory to the XMP profile. This might mean a change from 2400 MHz to 3600 MHz.
-
Overclock the CPU and cache frequencies a little bit at a time. After each change, run the Intel tuning utility: Run multiple “benchmarks” and watch the temperature.
-
Install the CUDA toolkit.
Security and cleanup¶
Security & features¶
First, update Windows to the newest feature release. In the security settings, enable Core Isolation and Trusted Platform Module in security settings. Restart your computer. If appropriate, enable BitLocker and restart again.
Built-in apps¶
Purge Windows’s horrifically unnecessary built‐in apps. In an unmistakably irresponsible choice, Windows comes with Candy Crush. Err on the side of assuming they’re useless and shouldn’t be there. Kill it with fire (1).
Optional Features¶
Install the Windows Developer Mode. Go to the start menu and type features. Navigate to Apps and Features ➤ Manage optional features ➤ add feature ➤ Windows Developer Mode ➤ install.
Also enable OpenSSH, uninstall Notepad and Wordpad, and disable other unnecessary Optional Features – which is most of them. These include the Telnet Client, Windows Media Player, and PowerShell 2.0.
Example Optional Features
Mine eventually looked like this:
Feature | On? |
---|---|
.Net 3.5 | |
.Net 4.8 | on |
Internet Information Services | |
Internet Information Services Hostable Web Core | |
Legacy Components | |
Media Features | |
Microsoft Message Queue (MSMQ) Server | |
Microsoft Print to PDF | |
Microsoft XPS Document Writer | |
Print and Document Services | on |
Remote Differential Compression API Support | on |
Simple TCPIP services (i.e. echo, daytime etc) | |
SMB 1.0/CIFS File Sharing Support | |
Telnet Client | |
TFTP Client | |
Virtual Machine Platform | on |
Windows Hypervisor Platform | |
Windows Identity Foundation 3.5 | |
Windows Powershell 2.0 | |
Windows Process Activation Server | |
Windows Projected File System | |
Windows Subsystem for Linux | on |
Windows TIFF IFilter | |
Work Folders Client |
System settings¶
Services¶
Warning
Be careful when disabling services. When in doubt, leave a service alone.
Next, open the Services app. Disable unnecessary services (set them to Manual start). However, set Windows Time Service to Automatic to force an NTP sync every startup. Otherwise, your system clock can drift seconds or even minutes after a small number of restarts.
Power settings¶
In the power settings, disable hibernation, automatic sleep mode, and USB connection suspending. While these can save power, chances are too high that they will interfere with a long‐running job or backup.
In some cases, you will want to disable scanning in a drive. This can drop performance. It can even cause issues because it can open file handles, temporarily preventing writes; this case it to interfered with data collection on our custom hardware.
Update settings¶
How Windows manages updates¶
Although I understand Microsoft’s rationale, it’s frustrating that Windows automatically downloads updates. The updates share bandwidth with everything else. In an important meeting or a remote interview? If you don’t see the notification (e.g. in Focus Mode), it’s going to be rough.
Even more frustrating is that it forces restarts, providing only a short window to postpone. That’s a serious problem for any non-interruptable or time-sensitive task you leave running because you can’t postpone a restart if you’re not there. Apps often won’t block the restart. Worse, Windows eventually stops further postponing.
Configuring via Settings¶
First, review the settings under Settings ➤ Windows Updates ➤ Advanced options. Set Active hours and make sure Get me up to date is unchecked.†
† Although you can throttle download speeds, but that applies even when you’re idle and would want to download updates (and may, in fact, want it to finish quickly). I recommend keeping this option disabled and instead make sure
Making updates non-automatic¶
Note: The following section was reviewed and updated as of April 2025.
You may want to disable automatic updates to manage them yourself, something Windows doesn’t normally allow. An app I used and recommended called Win Update Stop is now paid-only. The GitHub repo Aetherinox/pause-windows-updates has a pair of registry keys, one to pause and another to resume. It worked flawlessly on my laptop, but I have only tested it on that machine. Alternatively you can search for other apps on GitHub.
Warning
Make sure that any app includes an on/off toggle or that it doesn’t prevent manual updates. Additionally, check that it can be fully uninstalled.
Chocolatey and Powershell Core¶
Install Chocolatey, a fantastic package manager. After installing, run choco upgrade all -Y
. Install powershell-core (choco install powershell-core -Y
) and restart your terminal, choosing PowerShell Core.
Set powershell-core as your default shell. Check the PowerShell version using: Get-Host | Select-Object Version
. Make sure it’s 7+.
Tip: PowerShell
Although I’m used to shell scripting Linux, Powershell is actually quite good. Instead of needing to parse text from stdout when piping between commands, the data structures passed around in PowerShell are tables. It’s a much better approach, and I recommend learning it. You can install it in Linux and macOS.
Install some essential packages by running
Tip: Other packages
Applications like Zoom, Spotify, DropBox, Chrome, and Firefox are also available. Here is a set of popular developer-oriented packages:
Keep packages up-to-date by occasionally running choco upgrade all
.
Other package managers (Snappy & Scoop)¶
Install Snappy, a cross-platform package manager. Then install Scoop, another package manager specialized for software development.
Git, SSH, & GPG¶
Follow the Git, SSH, & GPG guide. The SSH key and config instructions work in PowerShell because OpenSSH is installed. Note that GitHub CLI was installed via Chocolatey (in the steps above).
Programming languages and frameworks¶
Note: Before installing a package, check for and uninstall any existing copy under Add or Remove Programs. For example, you’ll want to uninstall the copy of Java that ships with Windows.
Java, Rust, and Python¶
Tip: automate with a package manager
Install Rust and Java via either Scoop or Chocolatey:
For Rust, just install the Rust toolchain.
For Java, download JDK 21 LTS from Temurin (or a newer non-LTS version if preferred). Do not use Java 8, java.com, or OpenJDK. Make sure it’s on your $PATH
by checking the version via java --version
in a new shell.
For Python, install and use uv. You don’t need anything else – and you really shouldn’t use anything else. Make your life easier: (1) Leave your system Python alone, (2) don’t install Python via a package manager, and (3) install and use Conda/Mamba only if necessary.
_[LTS]: Long-Term Support _[JDK]: Java Development Kit
If the JDK is not on your $PATH
This may happen if you install the JDK manually. Confirm where it was installed; t’s likely to be (e.g.) C:\Program Files\Java\jdk-21
. In an administrator console, run this:
JavaScript ecosystem¶
Install Node.js:
Finally, install pnpm, a faster alternative to npm:
Visual C++ Build Tools¶
Note: This step is essential. Install the Visual C++ Build Tools This is not the same as the “redistributable” package. Install the package without optional packages (unless they’re wanted).
Troubleshooting: Building packages from source
Some packages do not publish wheels for Windows. Uv, as well as Pip and Poetry, will fall back to compiling on Windows if suitable wheels are not found. You may need to install older versions of the Visual C++ Build Tools for this to work (as well as the latest). Also take a look at Christopher Golhlke’s wheel archive. It often has Windows wheels for the latest Python versions much earlier than the packages officially release them.
Windows Linux Subsystem¶
Follow Microsoft’s instructions to install the WLS. Then follow the Linux setup guide.
Final steps¶
Disable startup apps¶
Disable unnecessary startup apps, which are listed under Settings ➤ Apps ➤ Startup. You should periodically review this list because apps love to add themselves.
*[WLS]: Windows Linux Subsystem
Credits: Cole Helsell drafted the original version of this guide with me.