How to Configure Windows Terminal and PowerShell Profiles
Customizing Windows Terminal's settings.json and your PowerShell profile script, plus how fragment extensions and keybindings fit into the same configuration layers.
Windows Terminal and PowerShell each have their own distinct configuration layer — the terminal’s settings.json controls appearance and shell profiles, while your PowerShell profile script controls what runs every time a PowerShell session starts. This covers both.
Step 1: open Windows Terminal’s settings file
Windows Terminal → Ctrl+, (or Settings from the dropdown menu)
→ click "Open JSON file" at the bottom left
This opens settings.json directly for editing, rather than only exposing options through the GUI settings pages.
Step 2: set a default shell profile
{
"defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"profiles": {
"list": [ ... ]
}
}
Each installed shell (PowerShell, Command Prompt, WSL distributions) has its own GUID in the profiles list — setting defaultProfile to match one determines which shell opens by default when you launch a new terminal tab.
Step 3: customize a profile’s appearance
{
"name": "PowerShell",
"colorScheme": "One Half Dark",
"font": { "face": "Cascadia Code", "size": 11 },
"opacity": 90,
"useAcrylic": true
}
Step 4: add a custom color scheme
"schemes": [
{
"name": "MyScheme",
"background": "#0C0C0C",
"foreground": "#CCCCCC",
"black": "#0C0C0C",
"blue": "#0037DA"
}
]
Reference it in a profile with "colorScheme": "MyScheme".
Step 5: find or create your PowerShell profile script
$PROFILE
This prints the path PowerShell expects your personal profile script at — a file that doesn’t exist by default, but that PowerShell will run automatically every time a new session starts, once created.
Step 6: create the profile file if it doesn’t exist yet
if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -Type File -Force }
notepad $PROFILE
Step 7: add customizations to the profile script
# custom prompt
function prompt { "PS $($PWD.Path)> " }
# aliases
Set-Alias ll Get-ChildItem
# environment variables
$env:EDITOR = "code"
# import a module every session
Import-Module posh-git
Anything valid in a .ps1 script can go here — it runs at the start of every new PowerShell session, making it the right place for aliases, environment setup, and custom prompt logic you want available consistently.
Step 8: use a separate profile for different PowerShell hosts, if needed
$PROFILE.CurrentUserCurrentHost # this specific host (e.g. Windows Terminal)
$PROFILE.CurrentUserAllHosts # every PowerShell host for this user
PowerShell distinguishes between a profile for the current specific host and one for all hosts — relevant if you use PowerShell both inside Windows Terminal and inside another environment (like an IDE’s integrated terminal) and want different behavior in each.
Where Windows Terminal came from
Windows Terminal was announced at Microsoft’s Build conference in May 2019 and released as open source from day one — a deliberate departure from how Microsoft had historically shipped console tooling, with development happening in the open on GitHub and community contributions accepted directly into the product rather than Microsoft building it entirely in-house before a closed release. It shipped alongside a purpose-built monospace font, Cascadia Code, designed specifically for terminal use with programming ligatures (turning character sequences like -> or != into single connected glyphs) available as an opt-in feature rather than forced on by default. The terminal reached general availability via the Microsoft Store in 2020, and has since become the default terminal application on new Windows 11 installations, superseding the older conhost.exe-based console host as the primary way most users actually interact with a command line on modern Windows.
How fragment extensions add profiles automatically
Manually editing settings.json isn’t the only way profiles get added — Windows Terminal also supports fragment extensions, small JSON files that other installed applications can drop into a well-known folder to register their own profile automatically, without the user hand-editing anything. This is how installing a new WSL distribution, Git for Windows, or Visual Studio’s Developer Command Prompt typically makes a matching profile appear in the terminal’s dropdown without any manual settings.json work on the user’s part — each of those installers ships a fragment that Windows Terminal picks up and merges into the effective profile list at launch. Fragments live under %LOCALAPPDATA%\Microsoft\Windows Terminal\Fragments\<app-name>\ for user-scoped fragments, or a corresponding per-machine location for system-wide ones, and understanding that they exist explains profiles that appear in the dropdown despite never being manually added to settings.json — a common point of confusion when a profile shows up (or disappears, after uninstalling the application that provided it) without any deliberate settings edit having caused it.
Customizing keybindings and actions
Beyond appearance and default shell, settings.json also defines an actions array binding specific keys to specific terminal commands:
{
"actions": [
{ "command": { "action": "splitPane", "split": "auto" }, "keys": "alt+shift+d" },
{ "command": "newTab", "keys": "ctrl+shift+t" }
]
}
Every built-in terminal action — splitting panes, opening a new tab with a specific profile, adjusting opacity, even sending a specific block of text — is scriptable this way, letting keybindings be rebuilt entirely to taste rather than accepting the shipped defaults.
Why separating these two configuration layers matters
Windows Terminal’s settings.json controls how the terminal application itself looks and which shells are available; your PowerShell profile controls what happens inside a PowerShell session once it starts, regardless of which terminal application launched it. Confusing the two — for instance, expecting a PowerShell alias to somehow affect Command Prompt tabs — is a common source of “why isn’t my customization working” confusion that understanding this separation resolves immediately.
Related:
- Microsoft Open-Sources Windows Terminal and the Console Host
- Windows PowerShell 1.0 Ships, Ending Its Life as ‘Monad’
Sources: