This document assumes you're running a fresh copy of the latest version of Windows 11 latest stable release. Windows 10 22H2 is out of support since 2025, but might still work for most of this.
The following workflow assumes a clean installation of Windows or from a full manual reinstall. While it's okay to have third-party software installed, the installation process will be more streamlined and less convoluted with a manually installed Windows system.
- Command Line Interface
- Setting up Windows
- Privacy
- Windows Preparation
- Projects Directory
- Chocolatey
- Winget
- Ninite
- Windows Subsystem for Linux
- AI
- Sublime Text and VS Code
- Vim
- ZSH
- SSH
- Git
- Node.js
- Python
- Composer
- VirtualBox
- Docker
Throughout this document, you will encounter examples like this that contain one or more of the arguments listed:
sudo command -flag --flag directory file.extension # Comments are behind pound signsAnytime you see the above, it is referring to your CLI of choice, now defaulted to Windows Terminal as well as Bash Shell or Z Shell see below in Windows Subsystem for Linux. Setting up a command-line shell to your liking is a good idea.
This covers two options: clean install or clean up.
If you're looking to just wipe the system complete and start from scratch, there's a project called Tiny11Builder (and Tiny10 for Win10) is a tool for creating a smaller, customized Windows ISO from an official Windows ISO.
Here's an overview of what Tiny11Builder can do. It's very impressive and a great way to minimally install Windows.
It can remove telemetry and enhance privacy but YMMV so you probably want to test this out before trusting it.
Another tool that has fascinating potential is called UnattendedWinstall. Using this, you can start with a clean, debloated Windows and theoretically install it with minimal interaction from yourself.
It's a similar workflow as Tiny11 where you have to create a bootable disk.
Whether you're using a company's provided Windows with third-party software or you installed Windows from scratch yourself, it's always a good idea to have a minimal and clean installation.
Most of you will likely need this section more. You've just bought a new laptop and you want to clean it up. The benefit of cleaning up is that the manufacturer's default software should provide some minimal to moderate benefits to stay on the laptop. So, you can primarily just remove the non-manufacturer software or unnecessary Microsoft software.
Winhance is a debloat app that has been rewritten, modernized, and provides a comprehensive aid to debloat and enhance. In my first usage, I like it so far.
Want to migrate a moderately old laptop to Windows 11? Look no further than FlyOOBE. I used it in 2025 on my personal laptop that I bought in 2017 and it worked great.
Microsoft collects telemetry data on how you use Windows. There's not a lot of transparency about what's going on but there are many free and open source applications that help us shut down and block as many as we know about. Scroll above to see the section about cleaning up Windows.
In addition to any of the clean up apps above, one really popular app for helping with privacy is Win11Debloat. I've used it in conjunction with Winhance and it is a great companion just to be sure.
I recommend you look through https://privacytools.techlore.tech/ and https://www.privacyguides.org/. There are valuable software and links to consume.
Step One - Update the system! (Prepare for more than one reboot)
Settings > Windows Update
Step Two - Turn on BitLocker for full disk encryption
(If you can't install Bitlocker, you can use a third-party encryption software like Veracrypt, which is open-source and well regarded by the security community.)
Control Panel\System and Security\BitLocker Drive Encryption
Why do you want full-disk encryption? Theft.
You're most likely using a portable laptop of some kind. If you lose it, the laptop gets stolen or someone tries to hack into it, your personal data is at risk. Using full-disk encryption is an extra layer of security to keep your mind at ease in case of potential intrusion.
Two main caveats:
- Make sure you do not forget your encryption software password. You'll have multiple options to retain a recovery key so choose the best option for you. Losing this recovery key means you cannot log in and everything on your computer is 100% inaccessible.
- After encryption completes, any corruption that makes the Windows partition unaccessible has no recovery. Make sure you're both backing up using a local backup device such as Windows 11 Backup on an external drive or a NAS, and a cloud backup provider like Backblaze, Sync, or iDrive.
If you don't already have one, create a directory for your digital projects. I like to use C:\Users\<winusername>\Sites\<project-name>, and the name Sites can be anything you want. I prefer my Sites folder to exist alongside the rest of my user profile folders.
cd "$env:USERPROFILE"
mkdir Sites
Depending on the type of projects you work on, this might not be necessary or preferable.
Included by default in Windows 11 is a package manager called Winget. Because it's pre-installed, you can immediately use it to install applications and software.
Historically, because this package manager is one of the newest ones for Windows, it doesn't have as many applications or packages available. But, as 2026, there is a good chance you'll find what you need.
winget.run is a good place to check and see if your software is available for Winget.
winget install -e --id Mozilla.Firefox
Winget collects data and telemetry by default because it may use Microsoft services and is subject to Windows/Microsoft diagnostic settings, but there is a Windows diagnostics data opt-out:
Windows Key > Settings > Privacy & Security > Diagnostics & feedback > Diagnostic data > Send optional diagnostic data Unselect the last option
Optional but specific to Winget to disable telemetry, in your terminal:
winget settings
This will open "$env:USERPROFILE"\AppData\Local\Packages\Microsoft.DesktopAppInstaller_xxxxxxxx\LocalState\settings.json and you'll need to add a line to disable telemetry.
"telemetry": {
"disable": true
},If you want to install multiple apps at once, try out Winstall. You can select multiple apps and get a long command to install everything at once.
Note: Winget is fussy if you don't provide the correct syntax to install something or you haven't chosen the method for download.
Chocolatey is the most popular package manager for Windows.
**Windows Key > Search for "Terminal" > Right-click, Run as Administrator)
With PowerShell, you must ensure Get-ExecutionPolicy is not Restricted. We suggest using Bypass to bypass the policy to get things installed or AllSigned for quite a bit more security.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
Run above Get-ExecutionPolicy command. If it returns Restricted, then run Set-ExecutionPolicy AllSigned or Set-ExecutionPolicy Bypass -Scope Process.
You might also have to troubleshoot console errors if things like TLS 2.0 isn't available.
Chocolatey can be used to install applications with either choco install.
choco install <package>
choco install <package> --version=x.x.x # specific version (replace x with version number)Replace <package> with the name of the package you want to install.
To view Chocolatey's directory of packages:
(https://community.chocolatey.org/packages)[https://community.chocolatey.org/packages]
Other useful commands:
choco upgrade <package>
choco list --localonly # what's installed on your local machine, including version numbers
choco outdated # which installs are not currentNote
choco outdated does not stay in sync with evergreen software using the free version of Chocolatey. For example, if you use Chocolatey to install Firefox version 150, and Firefox upgrades itself to version 151, Chocolatey doesn't know that Firefox updated itself and the outdated command only remembers the version of Firefox you installed. I use outdated to see what the newest versions are available rather than what I have installed. In order to track local installation versions, Chocolatey provides this feature in the paid upgrade of Chocolatey.
Chocolatey is awesome because now that you understand what it does, you can install all your favorite apps in one command. Here's a list of my favorite apps, including Firefox, that I need for development on a regular basis.
choco install firefox firefox-dev brave helium tor-browser powertoys thunderbird slack zoom git sublimetext4 vscodium filezilla mullvad-app vlc virtualbox vnc-viewer docker-desktop malwarebytes qbittorrent quicklook libreoffice-fresh wireguard freetube --pre -y
Note
This document installs Node inside WSL using nvm-sh, so the Windows-specific Chocolatey nvm package is intentionally not included above.
Using Chocolatey to install software will sometimes require you to restart Windows to complete its installation. Several packages will auto-start the software and ask you to set them up as well.
If you need more software that's not included in Winget or Chocolatey, or you wish to use something that has a GUI, Ninite is historically a solid app to install all the essential software you need.
Web development is not a sole operating system or browser process. WSL gives us more tools such as using native Unix commands within Windows. This is a big deal if you come from a Unix based OS and want to feel more comfortable on Windows.
Let's install WSL 2, the latest version of WSL. You must be on the latest version of Windows 10 or Windows 11.
Powershell.exe (Run as Administrator)
wsl --install
By default, the installed Linux distribution will be Ubuntu. I recommend this distro.
WSL has two caveats that I can't overcome yet both decreasing performance.
I have my environment set up, using Windows Terminal or another terminal in VSCodium. I run npm script or just trying to git status my project and it TAKES FOREVER. It's one of the worst issues I've had with WSL. There are fixes slowly being added to WSL or Windows but it's a slow rollout. In the meantime, if you have issues with npm, webpack, gulp, git, or one of many other utilities, try using Powershell or Git Bash (if you installed git for Windows).
Another issue that can cause a headache is the virtual machine memory task called Vmmem. After running WSL and Docker for more than a week, I saw the memory usage went up to more almost 10GB. At first I thought it was just Docker, but after shutting that down, I still saw about 8GB or memory usage. Only after using powershell to wsl --shutdown did I see the memory usage drop to a decent level below 1GB.
For best WSL performance, store Linux/git/Node-heavy projects inside the WSL filesystem, such as ~/Sites, not under /mnt/c/.... Access them from Windows with \\wsl$\Ubuntu\home\<linuxusername>\Sites or through VS Code's WSL integration. To be explicit about this advice, WSL projects stored in the Linux filesystem ~/Sites perform significantly better than /mnt/c/....
One of the first things we need to figure out is how to access our projects within Windows.
Here's the windows folder structure for the Home directory:
C:\Users\<winusername>\
WSL maps that to this:
/mnt/c/Users/<winusername>
Using the Projects directory I created above, if I store all my projects in C:\Users\micah\Sites, in bash I'll get there using this command:
cd /mnt/c/Users/micah/Sites
Once you create a new folder inside of your Projects directory, this will become your home for that project. It's where you'll install any package managers you might need such as npm and Composer.
Two of the most common commands to set up new projects and tools are apt-get and sudo. Knowing this, it's imperative to keep the system and software up-to-date and patched.
Once WSL is installed, update the apt-get tool as well as packages so that it updates the package lists for app updates.
sudo apt update && sudo apt upgrade # apt and apt-get are interchangeableapt update synchronizes your list of available packages with the servers in source repositories.
apt upgrade then downloads & installs any newer versions of your installed programs.
It's a good habit to get into that every time you use apt-get, run this update first. You can combine the two using the following:
sudo apt update && apt-get <package>
One last thing to mention about WSL inside of Windows, using these environments means you're effectively working with one environment in Windows and another in Linux. In this respect, it's the same for the various terminals. Powershell works in the Windows environment and Ubuntu shell works in the Ubuntu environment.
I've had to install packages on both Windows and Ubuntu as well. So I'll have git installed in Ubuntu and then also in Windows and they're not related. Same with Node.js. And so on.
When using your favorite editor, it's a similar situation. Opening the project in your Windows folder means you're working with it in the Windows file system. It could be faster to put the project folder/files in the Ubuntu folder. Mount the Ubuntu file system as a mapped drive which will make things a bit easier to work with from Windows.
Long story short, this is a sad reality that will take some maturing to understand. You'll have to fiddle around with Windows to make it work well sometimes.
As the 2020s move forward, it is clear that AI is necessary for many tasks. Used properly, it can give feedback that could be expected from senior developers and management. It can give immediate feedback and help that can increase productivity.
Using many code editors, you can integrate many different services like GitHub Copilot using models from OpenAI, Google, or Anthropic.
I can recommend T3 Chat as the most affordable service to use any of the above AI and more as standalone chat services. You can have extensive conversations and get code samples as feedback from the conversations.
The text editor is a developer's most important tool. Everyone has their preferences, but unless you're a hardcore Vim user, I recommend one of two editors: Sublime Text or VS Code.
As of 2025, most of my time is spent in a fork of Visual Studio Code. It found popularity at the end of the 2010s and is a staple open-source code editor for most front-end developers. I use it both personally and professionally because of various built-in features like git support, terminal integration, live sharing your code with another developer (using an extension), and a large repository of great extensions.
choco install vscode
I recommend using VSCodium because it strips away the telemetry and tracking that Microsoft/GitHub integrates into VS Code. However, VSCodium has issues with extensions like Live Share, so keep that in mind.
choco install vscodium
There's a ton of great tutorials and articles, such as VS Code Docs.
Because of the rise of AI since Copilot and the release of ChatGPT, there are multiple projects that take an approach treating AI as a primary integration. I've tried multiple of these editors and they're interesting and helpful if you are good at your craft and can request the right approaches.
Chris Coyier wrote about various code editors in 2025.
Since the early 2010s, my classical goto editor is Sublime Text, because, it just works and is faster than all the rest.
choco install sublimetext4
I prefer using the dev build of Sublime Text, which requires a license. If you want Chocolatey-managed installs, use the stable package shown above.
Sublime Text is not free, but it has an unlimited "evaluation period". The seemingly expensive $99 price tag is worth the cost. If you can afford it, I suggest you support this awesome editor. :)
After installing Sublime Text, add Package Control. This is the most important addition you'll make to Sublime Text and it'll give you the power to install plugins, add-ons, themes, color schemes and more.
I recommend to change two color settings:
- Theme (which is how the tabs, the file explorer on the left, etc. look)
- Color Scheme (the colors of the code).
My favorite theme is Material Design Darker as well as Seti_UI Theme.
Go to Tools > Command Palette (Shift-Command-P), Highlight Package Control: Install Package and then search for your preferred theme, make sure it's highlighted then press Enter to install it.
Then go to Sublime Text > Preferences > Settings - User and add the following two lines (using Seti UI) and restart Sublime:
"theme": "Seti.sublime-theme",
"color_scheme": "Packages/Seti_UI/Scheme/Seti.tmTheme",
Let's configure our editor a little. Go to Sublime Text > Preferences > Settings - User and paste this code (and edit it if you want) from my Preferences.sublime-settings file.
I also recommend creating shortcuts so you can launch Sublime Text from the command-line
Now, we can open a file with subl myfile.html or start a new project in the current directory with subl .. Pretty cool!
It is a good idea to learn some very basic usage of Vim. It is a very popular open-source editor accessed using command-line shells and is usually pre-installed on Unix systems.
For example, when you run a git commit, it will open Vim to allow you to type the commit message.
I suggest you read a tutorial on Vim. Grasping the concept of the two "modes" of the editor, Insert (by pressing i) and Normal (by pressing Esc to exit Insert mode), will be the part that feels most unnatural. After that it's just remembering a few important keys.
Vim's default settings aren't great, and you could spend a lot of time tweaking your configuration (the .vimrc file). But if you're like me and just use Vim occasionally, you'll be happy to know that Tim Pope has put together some sensible defaults to quickly get started.
Keeping it simple:
sudo apt install vim
vimtutor
And a minimal ~/.vimrc:
syntax on
set number
set expandtab
set shiftwidth=2
set tabstop=2
set mouse=a
Z Shell, or ZSH, was written to extend Bash and make improvements to how Bash works.
Install or confirm ZSH for your OS:
sudo apt install zsh
Install Oh My Zsh! for extra help and nice defaults.
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"Don't forget to customize ZSH!
Themes are available. Autosuggestions and Syntax Highlighting will improve ZSH user experience too.
Sign up and follow the videos recorded by Wes Bos to learn a ton more about ZSH and why it's so powerful. Or a free 80 minute video on YouTube by Karl Hadwen.
SSH is imperative, just like git and node as you'll see.
GitHub has excellent instructions for setting up git and connecting it to a GitHub account. This will help you to install the repos to your computer from GitHub as well as set up keys that you'll need to connect git and GitHub.
Now you can add a little shortcut to make SSHing into other boxes easier. Paste the following block of code into your SSH config file at ~/.ssh/config, changing the variables for any hosts that you connect to.
First:
ssh-keygen -t ed25519 -C "your_email@example.com"
Then:
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
Below the above, you can add other sites as needed.
Host myssh
HostName example.com
User user
IdentityFile ~/.ssh/key.pem
With the above code, you can now run the alias myssh to connect.
ssh myssh
What's a developer without Git? Install Git, then configure your identity:
sudo apt install git
git config --global user.name "Your Name Here"
git config --global user.email "your_email@youremail.com"
git config --global core.autocrlf input # Set to change how Git handles line endings
If you have 2FA enabled on GitHub (you should), you’ll also need to follow the Add SSH Key to GitHub and be sure you’re using the Linux instructions.
Less keystrokes can be better, so here are optional and sensible shortcuts to a global Git config file.
touch ~/.gitconfig
Pick and choose any of these aliases to help you.
[user]
name = Firstname Lastname
email = you@example.com
[github]
user = username
[alias]
a = add
ca = commit -a
cam = commit -am
cm = commit -m
s = status
pom = push origin main
pog = push origin gh-pages
puom = pull origin main
puog = pull origin gh-pages
cob = checkout -b
co = checkout
fp = fetch --prune --all
l = log --oneline --decorate --graph
lall = log --oneline --decorate --graph --all
ls = log --oneline --decorate --graph --stat
lt = log --graph --decorate --pretty=format:'%C(yellow)%h%Creset%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset'
With the above aliases, I can run git s instead of git status or git ca instead of git commit -a when I have a bunch of file updates.
If you used Chocolatey above to install applications, you'll notice this is the 2nd time we're installing Git; it is required for Visual Studio Code and is available for other local Windows apps.
For modern JavaScript programming, Node.js is required. Using Node Version Manager (nvm) to install Node allows you to easily switch between Node versions and is useful for projects on different versions of Node.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bashWhen you enter a project, you can install Node using NVM.
nvm install node
Restart terminal and confirm that you are using the default version of Node and npm.
node -v && npm -v
For most projects, install the latest LTS version of Node.
nvm install --lts
Set the latest LTS version as the default.
nvm alias default 'lts/*'
If desired, install the current version of Node for testing newer platform features.
nvm install node
You can switch to another version of Node and use it by changing to the directory where you want to use Node and run the following.
nvm install xx.xx
nvm use xx.xx
Node modules are defined in a local package.json file inside your project. npm install will download external libraries and frameworks into each project's own node_modules folder by default. You'll never need to edit files in this folder, only reference them.
Update NVM
nvm install node --reinstall-packages-from=node
Automating npm to switch to the right Node is a nice little time saver. Add some code to your shell to allow this auto switch capability.
Put this into your $HOME/.zshrc after nvm initialization:
# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrcAfter saving the file, run source ~/.zshrc to reload the configuration with the latest changes made.
Even if you don't use Python in your day to day, it's likely you'll encounter something that requires it. Python 2 is years outdated, so install and use Python 3.
Even if you already installed it with choco, install the latest Python using Windows Terminal on your WSL command line.
sudo apt update
sudo apt install python3 python3-pip python3-venv
After installation, open a new terminal tab to make sure it installed correctly.
python3 --version
pip3 --version
On Ubuntu, python may not point to Python 3 unless python-is-python3 is installed:
sudo apt install python-is-python3
PHP is still one of the most used programming languages on the web, thanks in part to the amount of sites still using WordPress. We need a way to manage PHP scripts and packages similarly to how we manage JavaScript dependencies using npm.
One of the most popular PHP dependency managers is called Composer. The difference between Composer and npm, for example, Composer is usually installed as a global command, but dependencies are normally installed per project into that project's vendor directory. So you must run and setup Composer on every new project if you want to use it.
To install Composer globally, go to the Download page and run the package installer. It would be preferable to install this inside WSL instead of Windows.
For WSL/Ubuntu, include:
sudo apt update
sudo apt install php-cli unzip curl
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php
sudo mv composer.phar /usr/local/bin/composer
composer --version
The free, open-source virtual machine called VirtualBox can be useful for isolated testing of older browsers or environments. This gives you a basic but very capable VM host for any operating system that supports virtual installations.
choco install virtualbox
Note: VirtualBox may require OS-specific permissions or configuration changes.
Docker is regularly used for projects today. It features portability, encapsulation for the environment within the OS, and consistency for development environments.
choco install docker-desktop
Docker can be quite powerful but complicated to set up. For this reason, I've enjoyed another project which is a wrapper around Docker called Lando. Originally designed for Drupal, it also supports WordPress, Node.js, and Laravel among others. On Windows, use the latest installer from GitHub unless your package manager has a current package.
For privacy, I recommend disabling tracking. Inside of your .lando.yml file, add the following:
stats:
- report: false
url: https://metrics.lando.dev
Note: Docker Desktop on Windows commonly uses the WSL2 backend.