Skip to main content

Prerequisites

Before setting up the PowerShell configuration, you need a fresh Windows 11 installation with updated system and drivers.
1

Update Windows 11

Open SettingsWindows Update and install all available updates.
# Verify Windows version
winver
After updates complete, restart your PC.
2

Update drivers

Download and install Driver Booster to update system drivers.
Repeat Windows Update after driver updates to catch any additional patches.
3

Clean up pre-installed apps

Remove unnecessary bloatware:
  1. Open SettingsAppsInstalled apps
  2. Uninstall apps you don’t need (games, promotional software, etc.)
  3. Update remaining apps via Microsoft Store

Install core tools

Package managers

1

Verify Winget

Winget comes pre-installed on Windows 11. Verify it’s available:
winget --version
Update sources:
winget source update
2

Install Scoop

Scoop handles CLI tools better than Winget. Install it:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
Add essential buckets:
scoop bucket add extras
scoop bucket add nerd-fonts
scoop update

Terminal and fonts

1

Install WezTerm

WezTerm is a GPU-accelerated terminal with excellent font rendering:
winget install wez.wezterm
Create the config directory:
New-Item -ItemType Directory -Path "$HOME\.config\wezterm" -Force
2

Install Nerd Font

Nerd Fonts provide icons for the terminal:
scoop install nerd-fonts/JetBrainsMono-NF
After installation, configure WezTerm to use “JetBrainsMono Nerd Font” in your wezterm.lua config file.
3

Install Oh My Posh

Oh My Posh provides beautiful, informative prompts:
winget install JanDeDobbeleer.OhMyPosh -s winget
Create the theme directory:
New-Item -ItemType Directory -Path "$HOME\.config\oh-my-posh" -Force
Download your custom theme (optional):
curl -o $HOME\.config\oh-my-posh\heyitsiveen.omp.json https://raw.githubusercontent.com/vntbln/ubuntu/main/.config/oh-my-posh/heyitsiveen.omp.json

CLI tools

1

Install all CLI tools

Install modern replacements for Unix tools in one command:
scoop install fzf bat eza zoxide ripgrep fd delta lazygit fastfetch btop jq
Install HTTPie separately via Winget:
winget install HTTPie.HTTPie
2

Verify installations

Check that all tools are available:
fzf --version
bat --version
eza --version
zoxide --version
rg --version
fd --version
delta --version
lazygit --version
fastfetch --version
btop --version
jq --version
http --version
If any command is not found, restart your terminal or run:
$env:PATH = [System.Environment]::GetEnvironmentVariable("PATH", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("PATH", "User")

PowerShell modules

1

Install required modules

Install PowerShell modules from the gallery:
Install-Module -Name PSReadLine -Force -SkipPublisherCheck
Install-Module -Name PSFzf -Force
Install-Module -Name Terminal-Icons -Force
2

Verify modules

Check installations:
Get-Module -ListAvailable -Name PSReadLine, PSFzf, Terminal-Icons

Set up PowerShell configuration

1

Create directory structure

Create the config directories:
New-Item -ItemType Directory -Path "$HOME\.config\powershell\conf.d" -Force
New-Item -ItemType Directory -Path "$HOME\.config\powershell\functions" -Force
2

Create profile entry point

Create the main profile file at $HOME\.config\powershell\Microsoft.PowerShell_profile.ps1:
@'
# ============================================================
# POWERSHELL CONFIGURATION
# ============================================================
# Lean entry point - modular configs live in conf.d/
# Functions are loaded from functions/
# ============================================================

$ConfigRoot = "$HOME\.config\powershell"

# Source all conf.d files in order
$confDir = Join-Path $ConfigRoot "conf.d"
if (Test-Path $confDir) {
Get-ChildItem -Path $confDir -Filter "*.ps1" | 
    Sort-Object Name | 
    ForEach-Object { 
        . $_.FullName 
    }
}
'@ | Out-File -FilePath "$HOME\.config\powershell\Microsoft.PowerShell_profile.ps1" -Encoding UTF8
3

Create symlink

Link PowerShell’s $PROFILE to your config:
# Create profile directory if it doesn't exist
$profileDir = Split-Path $PROFILE -Parent
if (!(Test-Path $profileDir)) {
    New-Item -ItemType Directory -Path $profileDir -Force
}

# Remove existing profile
if (Test-Path $PROFILE) {
    Remove-Item $PROFILE -Force
}

# Create symbolic link
New-Item -ItemType SymbolicLink -Path $PROFILE -Target "$HOME\.config\powershell\Microsoft.PowerShell_profile.ps1"
Creating symbolic links requires either:
  • Windows Developer Mode enabled (Settings → Privacy & Security → For developers)
  • Running PowerShell as Administrator
4

Clone or download configuration files

If you’re using this as a template, you’ll need to create the configuration files in conf.d/ and functions/.The minimum files needed are:
  • conf.d/00-init.ps1 - Core settings and PSReadLine
  • conf.d/10-environment.ps1 - Environment variables and editor chain
  • conf.d/20-aliases.ps1 - Git and tool aliases
  • conf.d/30-tools.ps1 - Tool integrations (bat, eza, zoxide, fzf)
  • conf.d/60-prompt.ps1 - Oh My Posh initialization
See the PowerShell profile structure documentation for complete details.

Verify the setup

1

Restart terminal

Close and reopen WezTerm to load the new configuration.
2

Test core functionality

Verify key features work:
# Press Ctrl+R and start typing to search command history
3

Check Oh My Posh prompt

Your prompt should display:
  • Current directory
  • Git branch and status (if in a repo)
  • Execution time for long commands
  • Custom theme styling
If you don’t see a themed prompt, check that your Oh My Posh theme file exists:
Test-Path "$HOME\.config\oh-my-posh\*.omp.json"

Quick command reference

Here are the most useful commands to get started:
CommandDescription
gsGit status
ga <file>Git add
gcm "msg"Git commit with message
llLong list with icons and git status
ltTree view (2 levels)
cat <file>View file with syntax highlighting
Ctrl+RSearch command history
Ctrl+TFuzzy find files
Alt+CFuzzy find directories
mkcd <name>Create directory and cd into it
reloadReload PowerShell configuration
~Go to home directory
..Go up one directory
-Go to previous directory

Troubleshooting

If you see “running scripts is disabled on this system”:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
  1. Install a Nerd Font: scoop install nerd-fonts/JetBrainsMono-NF
  2. Configure WezTerm to use the Nerd Font in ~/.config/wezterm/wezterm.lua:
config.font = wezterm.font("JetBrainsMono Nerd Font")
Refresh your PATH:
$env:PATH = [System.Environment]::GetEnvironmentVariable("PATH", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("PATH", "User")
Then restart your terminal.
Ensure PSFzf is installed and imported:
Install-Module PSFzf -Force
Import-Module PSFzf
Then restart PowerShell.

Next steps

  • Customize the Vesper color theme in conf.d/30-tools.ps1
  • Add your own aliases in conf.d/20-aliases.ps1
  • Create custom functions in functions/
  • Add machine-specific settings to conf.d/99-local.ps1 (gitignored)
  • Explore the PowerShell configuration and custom functions for advanced features

Build docs developers (and LLMs) love