The instructions for this guide are geared towards users who are comfortable
with Linux and want a useful setup, or dual-boot a Linux OS and want to share
data with it. For the latter, this guide uses
F:\ to refer to the shared
drive. If you do not need a shared drive, you can mostly ignore those
Note: Previous iterations of this blog post included instructions on how to
C:\Users to a different drive. This has since been confirmed by
Microsoft Support to create an invalid system configuration, and from
experience will break a lot of things.
This guide also goes through the process of setting up a web browser, a terminal, and a JVM manager.
This guide will not cover custom themes or any sort of modifications to system internals. All modifications done in this guide are achieved through use of registry modifications or official Windows tools.
Issues or Questions
The footer of this blog contains a link to my GitHub. Open an issue on the
blog repository there to report issues or to ask questions.
Prerequisites and Terms
This is a list of terms, including drive names. These names may be different for your setup. I will not be mentioning when you should replace a drive name with your own. Look out for drive names in commands and variable strings.
- This marks a section that is mainly opinionated. It doesn’t align with the goals of the guide, but might be helpful for people who don’t want to manage something when it comes up down the line.
- The Windows Machine
- A fresh Windows 10 installation
- The boot drive/partition of Windows 10. This is the smaller/faster of the two drives in the two-drive setup.
- The data and programs partition. When dual-booting Linux, this is your “shared with Linux” drive. In this case, it must be formatted to a filesystem that can be used on both Windows and Linux such as BTRFS. Do your own research. I am not to be trusted with filesystems.
- Special Directories
- These are directories that can be relocated per-user, such as Documents, Downloads, Desktop, Pictures, and Videos.
- An all-caps identifier surrounded by underscores is meant to be a user-defined variable. It can be an environment variable if desired, but it is not required to be one. If something is required to be an environment variable, it should be explicitly mentioned.
Relocating Special Directories
You can skip this section if not using
The special directories in your user profile can be relocated to more helpful
locations, especially if you’re sharing data with a Linux installation. For
this, right click on a special directory and go to “Properties”. One of the
properties tabs should say “Location”. Here you can choose the new location of
the special folder, pointing it to
Open an administrator PowerShell, and run
Using UTF-8 Instead of Latin-1 by Default
Open Control Panel. Select “Change date, time, or number formats” under “Clock and Region”. In the new “Region” window that opens, select the “Administrative” tab. Click the button that says “Change system locale…” and enable the box that says “Use Unicode UTF-8 for worldwide language support”.
WinGet should already be installed, but check Microsoft’s Install winget guide to make sure.
Note that when running
winget install, you have the option of specifying a
--location flag to choose the install directory. Only some installers
will support this, however.
Install the Latest PowerShell (o)
PowerShell Core can be installed via
winget install Microsoft.PowerShell.
gsudo is the Windows equivalent of Linux’s
sudo. It lets you elevate
commands without starting a new command prompt. To install it, run
winget install gerardog.gsudo.
Install a Better Terminal (o)
Windows Terminal, Hyper, Cmder, etc. all provide some nicer abstractions over
pwsh. If you have a favorite terminal, you should install
Windows Terminal can be installed via
winget install Microsoft.WindowsTerminal.
Install a Browser (o)
If you prefer something other than Microsoft Edge, now would be the time to install it.
- Google Chrome can be installed via
winget install Google.Chrome.
- Firefox can be installed via
winget install Mozilla.Firefox.
Install WinCompose (o)
WinCompose allows you to enter special characters without the hassle of remembering numeric Alt-codes. It’s available at https://github.com/samhocevar/wincompose.
WinCompose can be installed via
winget install SamHocevar.WinCompose.
Install MacType (o)
MacType offers an alternative fond renderer that makes certain text much more smooth and crisp. It’s available at https://github.com/snowie2000/mactype.
MacType can be installed via
winget install MacType.MacType.
If you use a Chrome-based browser, you will want to disable the renderer code integrity policy.
You will want to add exclusions for Source games, as the Source console will be effectively unreadable under MacType. When you have the game open, open the MacType Wizard, go to its Process Manager, find the game, and check both options under the right-click menu. Both “Exclude this process” and “Don’t replace fonts for this process” should be checked. Relaunching the game should make the console readable again.
Follow the instructions at
Run these options:
- Remove All Bloatware
- Disables any sort of advertising. Removes unimportant applications.
- Disable Cortana
- Does what it says on the box.
- Uninstall OneDrive
- Completely removes OneDrive support from Explorer. Will create a backup of
your OneDrive files on your Desktop. If you get notifications about
pwshdownloading a bunch of files, then you can permanently block the app to make the Debloater think there are no files left to download.
This is a tool that fine-tunes the debloating done by Sycnex Debloater. It’s available to download from https://www.oo-software.com/en/shutup10.
You will want to choose “Actions” and then “Apply only recommended settings”.
Note: This will disable clipboard history. If you’re like me and want Clipboard History, scroll down to “Activity History and Clipboard” and disable (make the switches red) the two options that mention “storage of clipboard history”.
“File” and “Exit” Shutup10. It will prompt you to reboot.
You most likely want to install Git on Windows without installing the entirety of Vim and Git Bash. Git for Windows provides a distribution called “MinGit” that does exactly this.
Navigate to the latest release of Git for Windows:
Download the latest version of
MinGit that does not mention
64-bit. (At the time of writing, this is
If you want Git to be installed for all users, you can extract it to
C:\Program Files\, such that
git can be found at
C:\Program Files\Git\cmd\git.exe. Make sure to edit
C:\Program Files\Git\etc\gitconfig to not be self-referential.
If not, extract
Git to your
%LocalAppData%, such that
git can be found at
Then add the full path to the
cmd folder to
Path environment variable.
the latest version of the GHCUp installer
to somewhere on your
PATH. Recommended is to add a new directory to your
PATH, such as
Set the environment variable
%LocalAppData%\ghcup respectively. Then, run
ghcup install ghc. Afterwards,
there should be a new
%GHCUP_INSTALL_BASE_PREFIX%\ghcup\bin folder that you
should add to your
Java + Scala
If you will also need Scala tools, Coursier ships
with a Java manager. Instead of following the instructions for using
can run this command for PowerShell:
.\cs.exe, make sure to set the
variable to the location of your choice: Coursier has a bug right now where it
will fail to find the default cache location
#2118). When using
you may want something like
F:\Win\Program Files\Coursier\Cache\v1. If you’re
not sure, refer to the
the Coursier cache documentation.
Make sure to set
COURSIER_JVM_CACHE as well. If you
_COURSIER_ROOT_\Cache\v1 (in the above example,
_COURSIER_ROOT_ would be
F:\Win\Program Files\Coursier), then I recommend
COURSIER_BIN_DIR to be
COURSIER_JVM_CACHE to be
In full, if your
F:\Win\Program Files\Coursier, then
Try to run
.\cs.exe. If you get a VCRUNTIME140.DLL missing error, or nothing
happens, download the
.\cs.exe succeeds, you can run
.\cs.exe setup, which will
install Coursier and basic Scala development tools to
this succeeds, you will be able to remove the downloaded
cs.exe and run the
cs that exists on your
cs java --available will list JDKs available for installation, and
cs java --jvm _JDK_NAME_ --setup, with
_JDK_NAME_ set to an entry of that
list, will download that specific JDK and set it to be your default with
Java (no Scala)
Install nvm-windows. Once you
node installed, install Yarn with
gsudo npm install --global yarn.
Yarn by default will dump things in
%LocalAppData%\Yarn\. If you use
you most likely don’t want this. Configure Yarn to use a more appropriate
yarn config set prefix _YARN_ROOT_ yarn config set cache-folder _YARN_ROOT_\Cache yarn config set global-folder _YARN_ROOT_\Data\global
Replacing all instances of
_YARN_ROOT_ with your desired Yarn root, for
F:\Win\Yarn. You do not have to create a
variable, although you can if you would like.
Next, add the output of
yarn global bin to your
Path. For example, if your
output looked like
PS> yarn global bin F:\Win\Yarn\bin
You would add
F:\Win\Yarn\bin to your
Path. If you created a
environment variable, you can substitute it here.
Note that there is currently a bug in Yarn where it will think it’s running on
a Linux machine when generating wrappers
(#6295). You will need to edit
any of the
.cmd files of installed binaries. For example, with
yarn global add vsce, you would want to edit the
vsce.cmd found in the
yarn global bin folder from
@IF EXIST "%~dp0\/bin/sh" ( "%~dp0\/bin/sh" "%~dp0\..\Data\global\node_modules\.bin\vsce" %* ) ELSE ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% /bin/sh "%~dp0\..\Data\global\node_modules\.bin\vsce" %* )
@IF EXIST "%~dp0\cmd.exe" ( "%~dp0\cmd.exe" "%~dp0\..\Data\global\node_modules\.bin\vsce.cmd" %* ) ELSE ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% cmd /c "%~dp0\..\Data\global\node_modules\.bin\vsce.cmd" %* )
Visual C++ Build Tools.
The default options will work. If you use
F:\, you will want to change the
directories listed in the “Install Locations” tab.
rustup-init.exe from the rustup website. If
F:\, make sure to set the
variables to your desired locations. If you’re not sure, refer to
the Rust documentation.