Windows Terminal is Microsoft's modern, GPU-accelerated terminal emulator for Windows 10 and 11. Built with C++20 and WinUI 2 (XAML Islands), it hosts multiple shell profiles in a tabbed, paned interface with full VT100/VT510 sequence support, a DirectX-based rendering pipeline, and extensive JSON-driven configuration. This guide covers every architectural layer, the complete settings surface, enterprise deployment, security hardening, performance tuning, and the developer internals needed to build, extend, or embed the terminal.
For end-user guidance (installation, everyday usage, key bindings, themes), see the User Guide and return here for depth.
| Attribute | Value |
|---|---|
| License | MIT |
| Primary language | C++20 |
| Main binary | WindowsTerminal.exe (packaged MSIX) |
| Min supported Windows | 10.0.19041 (version 2004) |
| Package identity | Microsoft.WindowsTerminal_8wekyb3d8bbwe |
| Preview identity | Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe |
| Canary identity | Microsoft.WindowsTerminalCanary_8wekyb3d8bbwe |
| Settings schema | https://aka.ms/terminal-profiles-schema |
| Build system | MSBuild + vcpkg (manifest mode) |
| CI | Azure DevOps (dev.azure.com/shine-oss/terminal) |
1. Architecture Overview
Windows Terminal is organized into a stack of reusable layers. Each layer compiles to its own static library or WinRT component; higher layers depend only on lower ones. The repository refers to this stack as Cascadia.
1.1 Component Stack
┌──────────────────────────────────────────────────────────────────┐
│ WindowsTerminal.exe (Win32 host; wWinMain; WindowEmperor) │
│ CascadiaPackage (MSIX identity, manifest, jumplist, assets) │
└──────────────────────────────────────────────────────────────────┘
▲
│ hosts
┌──────────────────────────────────────────────────────────────────┐
│ TerminalApp (WinRT) │
│ AppLogic · TerminalWindow · TerminalPage · NewTabMenu · │
│ CommandPalette · SettingsUI · Tabs · Panes · AppCmdlineArgs │
└──────────────────────────────────────────────────────────────────┘
▲
┌──────────────────────────────────────────────────────────────────┐
│ TerminalControl (WinRT XAML control, reusable in other apps) │
│ TermControl · ControlCore · ControlInteractivity │
└──────────────────────────────────────────────────────────────────┘
▲
┌──────────────────────────────────────────────────────────────────┐
│ TerminalCore │
│ Terminal · TextBuffer · Scrollback · Selection · Search │
│ VT parser · VT state machine · input translator │
└──────────────────────────────────────────────────────────────────┘
▲
┌──────────────────────────────────────────────────────────────────┐
│ TerminalSettingsModel / TerminalSettingsEditor (WinRT) │
│ CascadiaSettings · Profile · ColorScheme · Theme · Action │
│ JSON serialization, inheritance, migration │
└──────────────────────────────────────────────────────────────────┘
▲
┌──────────────────────────────────────────────────────────────────┐
│ TerminalConnection (WinRT; pluggable back-ends) │
│ ConptyConnection · AzureConnection · EchoConnection · ... │
└──────────────────────────────────────────────────────────────────┘
▲
│ ConPTY (pseudo console)
▼
┌──────────────────────────────────────────────────────────────────┐
│ OpenConsole.exe (dev build of conhost.exe) │
│ src/host, src/server, src/renderer, src/terminal │
└──────────────────────────────────────────────────────────────────┘
1.2 Core Components
| Component | Source Path | Role |
|---|---|---|
WindowEmperor |
src/cascadia/WindowsTerminal/WindowEmperor.* |
Manages all windows in the user session; implements the monarch/peasant model for cross-window communication |
AppHost |
src/cascadia/WindowsTerminal/AppHost.* |
Per-window host; creates the XAML island, bridges window and application logic |
IslandWindow / NonClientIslandWindow |
src/cascadia/WindowsTerminal/ |
Win32 HWND hosting XAML content; handles DPI scaling, virtual desktop interaction, and non-client-area rendering |
AppLogic / TerminalWindow |
src/cascadia/TerminalApp/ |
Application-level logic; tab and pane management, settings load, language selection |
TerminalPage |
src/cascadia/TerminalApp/TerminalPage.* |
Main UI page; action dispatch, tab management, command palette, new-tab menu |
TerminalControl |
src/cascadia/TerminalControl/ |
Reusable WinUI control wrapping the terminal core; TermControl, ControlCore, ControlInteractivity |
TerminalCore |
src/cascadia/TerminalCore/ |
VT parsing, buffer management, text storage, selection, search |
TerminalConnection |
src/cascadia/TerminalConnection/ |
Connection abstractions: ConptyConnection, AzureConnection, EchoConnection, EmptyConnection |
TerminalSettingsModel |
src/cascadia/TerminalSettingsModel/ |
Settings parsing, JSON schema, cascading defaults, profile generators, migration |
TerminalSettingsEditor |
src/cascadia/TerminalSettingsEditor/ |
Settings UI (XAML pages for each settings category) |
Note
Windows Terminal is not a shell. It hosts shells (PowerShell, cmd, WSL, Azure Cloud Shell, SSH). It does not implement command parsing, completion, or scripting. It is also not cross-platform — it is Windows-only by design.
1.3 Host and Server Components
| Component | Source Path | Files | Purpose |
|---|---|---|---|
| Console Host | src/host/ |
92 files, 942K chars | Classic conhost.exe — manages console sessions, text buffer, rendering |
| Console Server | src/server/ |
45 files, 258K chars | ALPC-based API server implementing Win32 Console API calls |
| ConPTY | src/winconpty/ |
5 files | Pseudo Console API: CreatePseudoConsole, ResizePseudoConsole, ClosePseudoConsole |
| Interactivity | src/interactivity/ |
Win32 + OneCore layers | Input/output interaction layers for different Windows SKUs |
1.4 Rendering Pipeline
| Renderer | Source Path | Technology | Use Case |
|---|---|---|---|
| AtlasEngine | src/renderer/atlas/ |
Direct3D 11 + Direct2D/DirectWrite | GPU-accelerated rendering for Windows Terminal (default) |
| GDI | src/renderer/gdi/ |
GDI | Fallback renderer for conhost.exe |
| UIA | src/renderer/uia/ |
UI Automation | Accessibility: emits text-changed and caret-moved events for screen readers |
| WDDM | src/renderer/wddmcon/ |
WDDM Console | Kernel-mode display rendering |
1.5 Terminal Adapter and Parser
| Component | Source Path | Purpose |
|---|---|---|
| VT Adapter | src/terminal/adapter/ (23 files) |
Implements ITermDispatch — maps parsed VT sequences to buffer mutations |
| VT Parser | src/terminal/parser/ |
State machine implementing xterm/Ecma-48/DEC VT parsing |
| Input Translator | src/terminal/input/ |
Encodes Win32 virtual keys and modifier state into VT input sequences |
1.6 Supporting Libraries
| Library | Source Path | Purpose |
|---|---|---|
src/types/ |
Common types | Coords, rects, colors, viewport, utils |
src/til/ |
Terminal Implementation Library | Custom containers, threading primitives (shared_mutex, latch, throttled_func) |
src/inc/ |
Shared headers | Public headers shared across the tree |
src/buffer/ |
Text buffer | Text buffer implementation used by both host and Cascadia |
src/tsf/ |
Text Services Framework | IME (Input Method Editor) support |
src/propslib/ |
Properties library | Registry-based settings for classic console |
src/propsheet/ |
Properties dialog | Console properties dialog (29 files, 262K chars) |
1.7 External Dependencies (vendored in oss/)
| Dependency | Purpose | License |
|---|---|---|
Chromium base/numerics |
Safe math (checked/clamped arithmetic) | BSD |
| stb | Image loading | MIT/Public Domain |
| pcg | Random number generation | Apache-2.0 |
| interval_tree | Interval tree data structure | Zlib |
| wyhash | Fast hash function | Unlicense |
| fzf | Fuzzy finder (for suggestions) | MIT (Junegunn Choi / Simon Hauser) |
1.8 vcpkg Dependencies (build-time)
| Package | Version | Purpose | License |
|---|---|---|---|
fmt |
12.1.0 | String formatting | MIT |
ms-gsl |
3.1.0 | Microsoft Guidelines Support Library (span, not_null) |
MIT |
jsoncpp |
1.9.6 | JSON parser for settings.json |
MIT |
cli11 |
2.6.1 | Command-line parser for wt.exe sub-commands |
BSD-3 |
cmark |
0.31.1 | CommonMark parser (About dialog, command descriptions) | BSD-2 |
1.9 Technology Stack
| Component | Technology |
|---|---|
| Language | C++20 with Microsoft extensions, C++/WinRT |
| UI Framework | WinUI 2 (XAML Islands hosted in Win32) |
| Build System | MSBuild + vcpkg (manifest mode) |
| Rendering | Direct3D 11 (AtlasEngine), GDI fallback |
| Terminal Protocol | VT100/VT220/VT510, Ecma-48 |
| IPC | COM-based Monarch/Peasant remoting, named pipes (ConPTY) |
| Packaging | MSIX (.msixbundle) |
1.10 Process Model
The MSIX package ships a single executable: WindowsTerminal.exe. It runs once per user session and uses a monarch/peasant cooperation model:
- Monarch: the first Terminal process launched in the session. Owns inter-window RPC.
- Peasants: subsequent launches register with the monarch. Commands like
wt -w <name>are forwarded to whichever peasant owns that named window. - WindowEmperor: the in-process manager that owns every window the monarch has opened.
1.11 Connection Back-ends
Each pane runs through an ITerminalConnection implementation:
| Connection | Purpose |
|---|---|
ConptyConnection |
Spawns a child process via CreatePseudoConsole. Default for every profile with a commandline. |
AzureConnection |
Opens an Azure Cloud Shell WebSocket session. |
EchoConnection |
Test-only echo back-end. |
EmptyConnection |
Used when Terminal displays UI without a live shell. |
1.12 Data Flow
User input → XAML TerminalControl → ControlInteractivity
→ TerminalInput (VT encoding) → ConPTY pipe → conhost/shell process
→ stdout pipe → ConptyConnection → VT StateMachine parser
→ TextBuffer mutations → Damage tracker → AtlasEngine
→ GPU glyph atlas → DirectComposition → display
1.13 Settings and Policy Flow
CascadiaSettings merges four layers at startup (lowest priority first):
┌──────────────────────────┐
lowest │ defaults.json (baked) │ Compiled into the binary
└──────────────────────────┘
│
┌──────────────────────────┐
│ Dynamic profile sources │ WSL, Azure, PowerShell 7, VS, Git Bash
└──────────────────────────┘
│
┌──────────────────────────┐
│ Fragments / extensions │ %ProgramData% or %LocalAppData%
└──────────────────────────┘
│
┌──────────────────────────┐
highest │ User settings.json │ %LocalAppData%\Packages\...\LocalState\
└──────────────────────────┘
For each property, the highest layer that sets the key wins. Arrays with name/guid keys are merged by key; everything else is replaced wholesale.
2. System Requirements
2.1 Runtime
| Requirement | Minimum | Recommended |
|---|---|---|
| Windows | 10.0.19041 (version 2004) | 11.0.22621+ |
| Architecture | x64 / ARM64 / x86 | x64 or ARM64 |
| GPU | D3D11 feature level 9_1 (or software WARP) | Any modern dGPU or iGPU |
| RAM | 256 MB free at boot | 1 GB+ for heavy scrollback |
| Disk | ~200 MB | -- |
| .NET | Not required (native C++) | -- |
| VC++ Redist | Required on older Windows 10 (framework package) | Bundled in MSIX dependencies |
2.2 Build-Time (Developer Box)
| Requirement | Minimum | Notes |
|---|---|---|
| OS | Windows 10 2004+ | 11 recommended for full feature set |
| Visual Studio | 2022 (17.8+) | Community, Professional, or Enterprise |
| VS Workloads | Desktop Development with C++, Universal Windows Platform Development | Required |
| Individual Components | C++ (v143) UWP Tools, Git for Windows, Windows App SDK | Required |
| Windows SDK | 10.0.22621 | Manifest builds against older SDKs but 22621 is required |
| PowerShell | 7+ | Required by build scripts |
| vcpkg | Bootstrapped by build | Uses vcpkg-configuration.json manifest mode |
| Free disk | ~30 GB | Build output, NuGet packages, vcpkg cache |
The fastest way to set up a developer box:
winget configure .config\configuration.winget
This installs Visual Studio Community with all required workloads and components automatically. Enterprise and Professional variants exist in the same folder.
Tip
Developer Mode must be enabled on the build machine: Settings > Privacy & Security > For developers > Developer Mode. This allows MSIX sideloading during development.
3. Configuration Reference
Everything about the Terminal user experience is defined in JSON. There is no registry, database, or protobuf backing store.
3.1 Settings File Locations
| Install Method | Path |
|---|---|
| Microsoft Store (Stable) | %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json |
| Microsoft Store (Preview) | %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe\LocalState\settings.json |
| Microsoft Store (Canary) | %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminalCanary_8wekyb3d8bbwe\LocalState\settings.json |
| Unpackaged / Portable | <install root>\settings\settings.json |
Important
The schema at
doc/cascadia/profiles.schema.json(109K chars, 3,300+ lines) is the authoritative source for every recognized setting. Point your editor at"$schema": "https://aka.ms/terminal-profiles-schema"for IntelliSense. Terminal itself does not validate against the schema at load time; invalid keys are silently ignored (a warning is trace-logged).
3.2 Top-Level JSON Structure
{
"$schema": "https://aka.ms/terminal-profiles-schema",
"defaultProfile": "{guid-or-name}",
"profiles": {
"defaults": {},
"list": []
},
"schemes": [],
"actions": [],
"keybindings": [],
"themes": [],
"newTabMenu": []
}
3.3 Global Settings
All global settings are set at the top level of settings.json, alongside profiles, schemes, etc.
Launch Settings
| Setting | Type | Default | Description |
|---|---|---|---|
defaultProfile |
string | {61c54bbd-...} (PowerShell) |
GUID or name of the profile opened by default. Required. |
initialCols |
integer (1-999) | 120 |
Column count at first load. Ignored when launchMode is maximized or fullscreen. |
initialRows |
integer (1-999) | 30 |
Row count at first load. Same caveat as initialCols. |
initialPosition |
string (Coordinates) | -- | Position of top-left corner on first load. Format: "x,y". ",200" keeps system X, overrides Y. |
centerOnLaunch |
boolean | false |
Auto-center the window on the display specified by initialPosition. |
launchMode |
enum | "default" |
Values: default, maximized, fullscreen, focus, maximizedFocus. |
firstWindowPreference |
enum | "defaultProfile" |
"defaultProfile" or "persistedWindowLayout" (restores tabs/panes from last session). |
startupActions |
string | "" |
Chain of wt sub-commands to execute at launch. |
windowingBehavior |
enum | "useNew" |
"useNew" always creates a new window. "useExisting" reuses the MRU window on this desktop. "useAnyExisting" reuses across desktops. |
autoHideWindow |
boolean | false |
Hide the window as soon as it loses focus. |
UI Settings
| Setting | Type | Default | Description |
|---|---|---|---|
theme |
string or ThemePair | "dark" |
Name of a theme from the themes array, or "dark", "light", "system". Also accepts {"light":"...","dark":"..."} for automatic switching. |
alwaysOnTop |
boolean | false |
Keep the window above all other windows. |
alwaysShowTabs |
boolean | true |
Show tab bar even with a single tab. |
showTabsInTitlebar |
boolean | true |
Merge tabs into the title bar. |
showTerminalTitleInTitlebar |
boolean | true |
Display selected tab's title in the title bar. |
showTabsFullscreen |
boolean | false |
Keep tabs visible in fullscreen mode. |
tabWidthMode |
enum | "equal" |
"equal", "titleLength", or "compact" (shrinks unfocused tabs to icon only). |
tabSwitcherMode |
enum | "inOrder" |
"mru" (most recently used), "inOrder", or "disabled". |
newTabPosition |
enum | "afterLastTab" |
"afterLastTab" or "afterCurrentTab". |
showAdminShield |
boolean | true |
Display a shield icon in the tab row when running elevated. |
useAcrylicInTabRow |
boolean | false |
Apply acrylic material (50% opacity) to the tab row. |
disableAnimations |
boolean | false |
Disable all XAML animations. |
snapToGridOnResize |
boolean | false |
Snap window to nearest character boundary on resize. |
focusFollowMouse |
boolean | false |
Focus pane on mouse hover. |
minimizeToNotificationArea |
boolean | false |
Minimize to system tray instead of taskbar. |
alwaysShowNotificationIcon |
boolean | false |
Always show the Terminal icon in the notification area. |
language |
string or null | null |
Override app language (BCP-47 tag, e.g., "en-US"). |
Clipboard and Selection Settings
| Setting | Type | Default | Description |
|---|---|---|---|
copyOnSelect |
boolean | false |
Copy text to clipboard immediately upon selection. |
copyFormatting |
CopyFormat | true |
Include formatting when copying. Values: true, false, "html", "rtf", "all", "none", or an array of ["html","rtf"]. |
trimBlockSelection |
boolean | true |
Remove trailing whitespace from rectangular (block) selections. |
trimPaste |
boolean | true |
Strip trailing whitespace from pasted text. |
wordDelimiters |
string | ./\()\"'-:,.;<>~!@#$%^&*|+=[]{}~?\│ |
Characters that delimit words for double-click selection. |
Warning and Confirmation Settings
| Setting | Type | Default | Description |
|---|---|---|---|
warning.confirmCloseAllTabs |
boolean | true |
Confirm before closing a window with multiple tabs. |
warning.largePaste |
boolean | true |
Warn when pasting more than 5 KiB of text. |
warning.multiLinePaste |
boolean | true |
Warn when pasting text containing newlines. |
warning.inputService |
boolean | true |
Warn if Touch Keyboard and Handwriting Panel Service is disabled. |
Rendering Settings
| Setting | Type | Default | Description |
|---|---|---|---|
rendering.graphicsAPI |
enum | -- | "automatic", "direct2d", or "direct3d11". Direct3D 11 is more performant; Direct2D is more stable. |
rendering.disablePartialInvalidation |
boolean | -- | When true, uses a FLIP_DISCARD swap chain with no dirty rectangles. Useful for certain GPU/driver combinations. |
rendering.software |
boolean | -- | Force software rasterizer (WARP). Almost never needed. |
Compatibility Settings
| Setting | Type | Default | Description |
|---|---|---|---|
compatibility.allowHeadless |
boolean | false |
Allow Terminal to run in the background with no visible windows. Required for globalSummon and quakeMode when all windows are closed. |
compatibility.enableUnfocusedAcrylic |
boolean | true |
Allow unfocused windows to retain acrylic instead of switching to opaque. |
compatibility.textMeasurement |
enum | "graphemes" |
How text is grouped into cells: "graphemes" (modern, Unicode-correct), "wcswidth" (UNIX-style), or "console" (legacy Windows behavior). |
compatibility.ambiguousWidth |
enum | "narrow" |
Cell width for East Asian Ambiguous characters: "narrow" or "wide". |
Experimental Global Settings
| Setting | Type | Default | Description |
|---|---|---|---|
experimental.detectURLs |
boolean | true |
Underline URLs on hover; Ctrl+click to open. |
experimental.enableColorSelection |
boolean | false |
Add preset color-selection keybindings (e.g., Alt+6 to color selection red). |
experimental.input.forceVT |
boolean | -- | Deprecated. Replaced by the per-profile compatibility.input.forceVT. |
experimental.scrollToZoom |
boolean | true |
Ctrl+scroll changes font size. |
experimental.scrollToChangeOpacity |
boolean | true |
Ctrl+Shift+scroll changes window opacity. |
experimental.useBackgroundImageForWindow |
boolean | false |
Expand focused profile's background image across the entire window. |
Profile Source Control
| Setting | Type | Default | Description |
|---|---|---|---|
disabledProfileSources |
array of strings | [] |
Disable dynamic profile generators. Values: "Microsoft.WSL", "Windows.Terminal.Wsl", "Windows.Terminal.Azure", "Windows.Terminal.PowershellCore", "Windows.Terminal.VisualStudio". |
3.4 Profile Settings
Profile settings go in profiles.defaults (applied to all profiles) or individual entries in profiles.list. Use the object form: "profiles": { "defaults": {...}, "list": [...] }.
Identity and Command
| Setting | Type | Default | Description |
|---|---|---|---|
guid |
ProfileGuid | -- | Unique identifier in registry format {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Required for list entries. |
name |
string | -- | Display name in the dropdown. Required for list entries. |
source |
string or null | -- | Name of the profile generator that created this profile (e.g., "Windows.Terminal.Wsl"). |
commandline |
string | -- | Executable to launch (e.g., "powershell.exe", "wsl.exe -d Ubuntu"). |
startingDirectory |
string or null | -- | Initial working directory for the shell. |
icon |
string or null | -- | Image file path, URI, or emoji for the tab, dropdown, and jumplist. |
tabTitle |
string or null | -- | Override the default tab title passed to the shell on startup. |
suppressApplicationTitle |
boolean | false |
When true, tabTitle is fixed and title-change messages from the shell are ignored. |
hidden |
boolean | false |
Hide this profile from the dropdown without removing it from settings. |
elevate |
boolean | false |
Always open this profile in an elevated context. Triggers UAC if the window is not already admin. |
reloadEnvironmentVariables |
boolean | true |
Reload the environment block when creating a new session (instead of inheriting from the Terminal process). |
environment |
object | -- | Key-value pairs of environment variables to set. Names are case-insensitive. Supports %PATH%-style expansion. |
Appearance
| Setting | Type | Default | Description |
|---|---|---|---|
colorScheme |
string or SchemePair | "Campbell" |
Color scheme name. Accepts {"light":"...","dark":"..."} for theme-aware switching. |
foreground |
Color or null | "#cccccc" |
Override text color from color scheme. |
background |
Color or null | "#0c0c0c" |
Override background color from color scheme. |
cursorColor |
Color or null | -- | Override cursor color from color scheme. |
selectionBackground |
Color or null | -- | Override selection background from color scheme. |
opacity |
number (0-100) | 100 |
Window opacity. Defaults to 50 when useAcrylic is true. |
useAcrylic |
boolean | false |
Enable acrylic material background. |
padding |
string or integer | "8, 8, 8, 8" |
Padding around text. Formats: "8", "8, 8", or "8, 8, 8, 8" (left, top, right, bottom). |
tabColor |
Color or null | -- | Fixed tab color. Overridden by the tab color picker. |
intenseTextStyle |
enum | "bright" |
How intense (bold) text renders: "bold", "bright", "all", or "none". |
adjustIndistinguishableColors |
enum | "never" |
Adjust foreground for visibility against background: "never", "indexed", or "always". |
Background Image
| Setting | Type | Default | Description |
|---|---|---|---|
backgroundImage |
string or null | -- | Path to background image, or "desktopWallpaper" to use the current wallpaper. |
backgroundImageOpacity |
number (0.0-1.0) | 1.0 |
Transparency of the background image. |
backgroundImageStretchMode |
enum | "uniformToFill" |
How image fills the pane: "fill", "none", "uniform", "uniformToFill". |
backgroundImageAlignment |
enum | "center" |
Image alignment: "center", "left", "right", "top", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight". |
Font
| Setting | Type | Default | Description |
|---|---|---|---|
font.face |
string | "Cascadia Mono" |
Font face name. |
font.size |
number | 12 |
Font size in points. Minimum: 1. |
font.weight |
string or integer | "normal" |
Font weight: "thin", "extra-light", "light", "semi-light", "normal", "medium", "semi-bold", "bold", "extra-bold", "black", "extra-black", or numeric 100-990. |
font.features |
object | -- | DWrite font features. Example: {"ss01": 1, "liga": 0} enables stylistic set 01 and disables ligatures. |
font.axes |
object | -- | DWrite font axes. Example: {"wght": 200} sets font weight to 200. |
font.cellWidth |
CSSLengthPercentage | -- | Override cell width. Works like CSS letter-spacing. |
font.cellHeight |
CSSLengthPercentage | -- | Override cell height. Works like CSS line-height. Defaults to approximately 1.2x font size. |
Note
The deprecated aliases
fontFace,fontSize, andfontWeight(top-level profile properties) still function but should be replaced with the nestedfont.*form.
Cursor
| Setting | Type | Default | Description |
|---|---|---|---|
cursorShape |
enum | "bar" |
Cursor shape: "bar" (┃), "doubleUnderscore" (‗), "emptyBox" (▯), "filledBox" (█), "underscore" (▁), "vintage" (▃). |
cursorHeight |
integer (1-100) or null | 25 |
Cursor height percentage (bottom-up). Only effective when cursorShape is "vintage". |
Input and Scrolling
| Setting | Type | Default | Description |
|---|---|---|---|
historySize |
integer | 9001 |
Lines of scrollback. Value of -1 means unlimited (high memory usage). |
snapOnInput |
boolean | true |
Scroll to the input line when typing. |
scrollbarState |
enum | "visible" |
Scrollbar visibility: "visible", "hidden", "always". |
altGrAliasing |
boolean | true |
Treat Ctrl+Alt as AltGr. Set to false on layouts where AltGr is a physical key. |
antialiasingMode |
enum | "grayscale" |
Text antialiasing: "grayscale", "cleartype", "aliased". Requires a new terminal instance to take effect. |
Bell
| Setting | Type | Default | Description |
|---|---|---|---|
bellStyle |
BellStyle | "audible" |
How BEL characters are handled: "audible", "window" (flash), "taskbar" (flash icon), "all", "none", or an array like ["audible","taskbar"]. Also accepts booleans. |
bellSound |
string, array, or null | "" |
Custom WAV file path for the bell sound. Accepts an array for random selection. |
Shell Integration
| Setting | Type | Default | Description |
|---|---|---|---|
autoMarkPrompts |
boolean | true |
Automatically mark prompts (requires OSC 133 integration in the shell). |
showMarksOnScrollbar |
boolean | false |
Show marks added via addMark action on the scrollbar. |
rightClickContextMenu |
boolean | false |
Right-click shows a context menu instead of pasting. |
answerbackMessage |
string or null | -- | Response string sent when an ENQ control character is received. |
Compatibility (Per-Profile)
| Setting | Type | Default | Description |
|---|---|---|---|
compatibility.reloadEnvironmentVariables |
boolean | true |
Reload environment variables for new tabs/panes. |
compatibility.input.forceVT |
boolean | false |
Force legacy VT input encoding. Some application keys may stop working. |
compatibility.allowDECRQCRA |
boolean | false |
Support DECRQCRA (Request Checksum of Rectangular Area) escape sequence. |
compatibility.allowOSC52 |
boolean | true |
Allow VT applications to set clipboard contents via OSC 52. |
Drag and Drop
| Setting | Type | Default | Description |
|---|---|---|---|
pathTranslationStyle |
enum | "none" |
Transform dropped file paths: "none", "wsl", "cygwin", "msys2", "mingw". |
dragDropDelimiter |
string | " " |
Delimiter between multiple dropped files. |
Lifecycle
| Setting | Type | Default | Description |
|---|---|---|---|
closeOnExit |
enum or boolean | "automatic" |
Behavior on shell exit: "graceful" (close on clean exit), "always", "automatic" (graceful for Terminal-launched, always otherwise), "never". Booleans accepted: true=graceful, false=never. |
Nested Appearance
| Setting | Type | Default | Description |
|---|---|---|---|
unfocusedAppearance |
AppearanceConfig or null | -- | Override any appearance setting (colors, cursor, background image, opacity, etc.) when the pane is unfocused. |
Experimental (Per-Profile)
| Setting | Type | Default | Description |
|---|---|---|---|
experimental.retroTerminalEffect |
boolean | -- | Enable retro CRT terminal visual effect. |
experimental.pixelShaderPath |
string | -- | Path to an HLSL pixel shader. Overrides retroTerminalEffect. |
experimental.rightClickContextMenu |
boolean | false |
Show context menu on right-click. |
experimental.repositionCursorWithMouse |
boolean | false |
Click to move the text cursor on the current command line. |
experimental.rainbowSuggestions |
boolean | false |
Display command suggestions in rainbow colors. |
3.5 Color Schemes
Array of scheme objects in the schemes key. Each scheme defines:
| Property | Type | Description |
|---|---|---|
name |
string | Scheme name (referenced by profiles). Required. |
foreground |
Color | Default text color. |
background |
Color | Default background color. |
cursorColor |
Color | Cursor color (default: "#FFFFFF"). |
selectionBackground |
Color | Selection highlight color. |
black |
Color | ANSI color 0. |
red |
Color | ANSI color 1. |
green |
Color | ANSI color 2. |
yellow |
Color | ANSI color 3. |
blue |
Color | ANSI color 4. |
purple |
Color | ANSI color 5. |
cyan |
Color | ANSI color 6. |
white |
Color | ANSI color 7. |
brightBlack |
Color | ANSI color 8. |
brightRed |
Color | ANSI color 9. |
brightGreen |
Color | ANSI color 10. |
brightYellow |
Color | ANSI color 11. |
brightBlue |
Color | ANSI color 12. |
brightPurple |
Color | ANSI color 13. |
brightCyan |
Color | ANSI color 14. |
brightWhite |
Color | ANSI color 15. |
Colors use #RRGGBB or #AARRGGBB format.
Built-in schemes (shipped in defaults.json): Campbell, Campbell Powershell, Vintage, One Half Dark, One Half Light, Solarized Dark, Solarized Light, Tango Dark, Tango Light, Dark+, VSCode Dark Modern, VSCode Light Modern, CGA, IBM 5153, Dimidium, Ottosson.
3.6 Themes
Array of theme objects defining window chrome appearance:
Theme Object
| Property | Type | Description |
|---|---|---|
name |
string | Theme name. Must not be "light", "dark", or "system" (reserved). |
window |
WindowTheme | Window frame and application theme settings. |
tab |
TabTheme | Individual tab appearance. |
tabRow |
TabRowTheme | Tab row (bar) appearance. |
WindowTheme
| Property | Type | Default | Description |
|---|---|---|---|
applicationTheme |
enum | -- | "light", "dark", or "system". |
useMica |
boolean | false |
Apply Mica material backdrop across the entire window. |
frame |
ThemeColor | -- | Window frame color when focused (Windows 11 only). |
unfocusedFrame |
ThemeColor | -- | Window frame color when unfocused (Windows 11 only). |
experimental.rainbowFrame |
boolean | false |
Cycle frame through rainbow colors. Overrides frame/unfocusedFrame. |
TabTheme
| Property | Type | Description |
|---|---|---|
background |
ThemeColor | Active tab background color. |
unfocusedBackground |
ThemeColor | Inactive tab background color. |
showCloseButton |
enum | Tab close button visibility: "always", "hover", "never", "activeOnly". |
iconStyle |
enum | Tab icon appearance: "default", "hidden", "monochrome". |
TabRowTheme
| Property | Type | Description |
|---|---|---|
background |
ThemeColor | Tab row color when the window is focused. |
unfocusedBackground |
ThemeColor | Tab row color when the window is inactive. |
ThemeColor can be a #RRGGBB hex, #RRGGBBAA hex, "accent" (OS accent color), "terminalBackground" (active pane's background), or null.
The global theme setting references a theme by name. The built-in themes are: dark, light, system, legacyDark, legacyLight, legacySystem.
3.7 Actions
Array of action definitions in the actions key:
{
"id": "Terminal.OpenNewTab",
"name": { "key": "OpenNewTabCommandName" },
"icon": "\uE8A5",
"command": "newTab"
}
| Property | Type | Description |
|---|---|---|
id |
string | Stable identifier referenced by keybindings and newTabMenu entries. |
name |
string or object | Display name in the command palette. Object form: {"key": "ResourceName"} for localized strings. |
icon |
string | Path, URI, or emoji. |
command |
string or object | Short action name (e.g., "newTab") or object with "action" plus argument properties. |
iterateOn |
enum | Generate iterable commands: "profiles" or "schemes". |
Complete Action Reference (76 Actions)
Tab Management:
| Action | Arguments | Description |
|---|---|---|
newTab |
NewTerminalArgs | Open a new tab. |
duplicateTab |
-- | Duplicate the current tab. |
closeTab |
index (int or null) |
Close a tab (default: focused). |
closeOtherTabs |
index (int or null) |
Close all tabs except the specified one. |
closeTabsAfter |
index (int or null) |
Close all tabs after the specified one. |
nextTab |
tabSwitcherMode (enum) |
Move to the next tab. |
prevTab |
tabSwitcherMode (enum) |
Move to the previous tab. |
switchToTab |
index (int, required) |
Switch to tab by index (0-based). |
moveTab |
direction ("forward" or "backward", required) |
Reorder the current tab. |
tabSearch |
-- | Open the tab search dialog. |
openTabColorPicker |
-- | Open the tab color picker. |
openTabRenamer |
-- | Open the tab rename text box. |
renameTab |
title (string) |
Set the tab title. Omit to restore original. |
restoreLastClosed |
-- | Reopen the last closed tab or pane. |
Pane Management:
| Action | Arguments | Description |
|---|---|---|
splitPane |
split (direction), splitMode, size, NewTerminalArgs |
Split the pane. Directions: "auto", "up", "down", "left", "right". |
closePane |
-- | Close the focused pane. |
closeOtherPanes |
-- | Close all panes except the focused one. |
moveFocus |
direction (required) |
Move focus between panes. Directions: "left", "right", "up", "down", "previous", "nextInOrder", "previousInOrder", "first", "parent", "child". |
swapPane |
direction (required) |
Swap the focused pane with an adjacent one. Same directions as moveFocus. |
resizePane |
direction (required) |
Resize the pane boundary. Directions: "left", "right", "up", "down". |
movePane |
index (int, required) |
Move the focused pane to another tab (0-based). |
focusPane |
id (int) |
Focus a pane by its numeric ID. |
togglePaneZoom |
-- | Toggle pane zoom (maximize/restore within the tab). |
toggleSplitOrientation |
-- | Rotate split between horizontal and vertical. |
toggleReadOnlyMode |
-- | Toggle read-only mode on the focused pane. |
Window Management:
| Action | Arguments | Description |
|---|---|---|
newWindow |
NewTerminalArgs | Open a new Terminal window. |
closeWindow |
-- | Close the current window. |
quit |
-- | Close all windows and exit. |
toggleFullscreen |
-- | Toggle fullscreen mode. |
setFullScreen |
isFullScreen (boolean) |
Set fullscreen explicitly. |
toggleFocusMode |
-- | Toggle focus mode (hides tabs and title bar). |
setFocusMode |
isFocusMode (boolean) |
Set focus mode explicitly. |
toggleAlwaysOnTop |
-- | Toggle always-on-top. |
setMaximized |
isMaximized (boolean) |
Set maximized state. |
identifyWindow |
-- | Show the window's name/ID overlay. |
identifyWindows |
-- | Show name/ID overlays on all windows. |
openWindowRenamer |
-- | Open the window rename dialog. |
renameWindow |
name (string) |
Rename the current window. |
openSystemMenu |
-- | Open the system menu (Alt+Space equivalent). |
globalSummon |
desktop, monitor, name, dropdownDuration, toggleVisibility |
Summon the Terminal window globally. |
quakeMode |
-- | Special globalSummon for the _quake window. |
Clipboard and Selection:
| Action | Arguments | Description |
|---|---|---|
copy |
singleLine, withControlSequences, dismissSelection, copyFormatting |
Copy selected text. |
paste |
-- | Paste from clipboard. |
selectAll |
-- | Select all buffer text. |
markMode |
-- | Enter mark mode (keyboard-driven selection). |
toggleBlockSelection |
-- | Switch between block and line selection. |
switchSelectionEndpoint |
-- | Move the active selection endpoint. |
expandSelectionToWord |
-- | Expand selection to word boundaries. |
Scrollback:
| Action | Arguments | Description |
|---|---|---|
scrollUp |
rowsToScroll (int or null) |
Scroll up by N lines. |
scrollDown |
rowsToScroll (int or null) |
Scroll down by N lines. |
scrollUpPage |
-- | Scroll up one page. |
scrollDownPage |
-- | Scroll down one page. |
scrollToTop |
-- | Scroll to the top of the buffer. |
scrollToBottom |
-- | Scroll to the bottom of the buffer. |
scrollToMark |
direction ("previous", "next", "first", "last", required) |
Scroll to a shell-integration mark. |
clearBuffer |
clear ("all", "screen", "scrollback") |
Clear the terminal buffer. |
exportBuffer |
path (string) |
Export buffer contents to a file. If empty, opens a file picker. |
addMark |
color (Color) |
Add a manual mark to the scrollbar. |
clearMark |
-- | Clear the mark at the current position. |
clearAllMarks |
-- | Clear all marks. |
Application:
| Action | Arguments | Description |
|---|---|---|
openSettings |
target ("settingsUI", "settingsFile", "defaultsFile", "allFiles") |
Open the settings UI or file. |
openNewTabDropdown |
-- | Open the new tab dropdown menu. |
commandPalette |
launchMode ("action" or "commandLine") |
Open the command palette. |
find |
-- | Open the search dialog. |
findMatch |
direction ("next" or "prev", required) |
Navigate search results. |
toggleShaderEffects |
-- | Toggle pixel shader effects. |
openAbout |
-- | Open the About dialog. |
openCWD |
-- | Open the current working directory in File Explorer. |
searchWeb |
queryUrl (string, required) |
Search the web for selected text. %s is replaced with the selection. |
sendInput |
input (string, required) |
Send text/escape sequences to the shell. |
wt |
commandline (string, required) |
Execute a wt command line in the current window. |
multipleActions |
actions (array, required) |
Execute multiple actions sequentially. |
showSuggestions |
source (SuggestionSource), useCommandline (boolean) |
Open the suggestions UI. Sources: "commandHistory", "tasks", "all". |
experimental.colorSelection |
matchMode, foreground, background |
Color selected text. |
adjustFontSize |
delta (int, required) |
Change font size by delta points. |
resetFontSize |
-- | Reset font to default size. |
adjustOpacity |
opacity (int, -100 to 100), relative (boolean) |
Change window opacity. |
setColorScheme |
colorScheme (string, required) |
Apply a color scheme to the active pane. |
setTabColor |
color (Color or null) |
Set the tab color. Omit to reset. |
3.8 Keybindings
Array of { "keys": "<combo>", "id": "<action-id>" } entries:
{ "keys": "ctrl+shift+t", "id": "Terminal.OpenNewTab" }
The keys field supports multi-key chords: "ctrl+k, ctrl+f" (two consecutive key combinations). The KeyChordSegment pattern is:
[ctrl+][alt+][shift+][win+]<KeyName>
Where <KeyName> is any single character, a function key (f1-f24), a named key (enter, esc, tab, space, backspace, delete, home, end, pageup, pagedown, up, down, left, right, insert, menu, app, comma, period, plus, minus), a numpad key (numpad0-numpad9, numpad_add, numpad_subtract, numpad_multiply, numpad_divide, numpad_decimal, numpad_period, numpad_plus, numpad_minus), a browser key (browser_back, browser_forward, etc.), or an explicit virtual key / scan code: vk(nnn), sc(nnn).
To unbind a default: { "keys": "ctrl+shift+t", "id": null }.
3.9 New Tab Menu
Array of menu entries defining the structure of the new tab dropdown:
| Entry Type | Properties | Description |
|---|---|---|
"profile" |
profile (name or GUID), icon |
A single profile. |
"separator" |
-- | A visual separator line. |
"folder" |
name, icon, entries (array), inline ("never" or "auto"), allowEmpty (boolean) |
A nested folder. When inline is "auto" and the folder has only one entry, it is inlined. |
"action" |
id (action ID), icon |
An action button. |
"remainingProfiles" |
-- | All profiles not explicitly listed elsewhere. Use at most once (Issue #20124: duplicates cause a crash). |
"matchProfiles" |
name, source, commandline |
Profiles matching the given criteria. |
Warning
Including more than one
remainingProfilesentry causes an access violation inSettings.Model.dll(Issue #20124). Always use exactly oneremainingProfilesentry.
3.10 Dynamic Profile Sources
Built-in generators that auto-create profiles:
| Generator | Source ID | Notes |
|---|---|---|
| Windows PowerShell | (hard-coded) | Always present. GUID: {61c54bbd-c2c6-5271-96e7-009a87ff44bf}. |
| Command Prompt | (hard-coded) | Always present. GUID: {0caa0dad-35be-5f56-a8ff-afceeeaa6101}. |
| PowerShell Core | Windows.Terminal.PowershellCore |
Detects Store and MSI installs of pwsh.exe. |
| WSL | Windows.Terminal.Wsl |
Enumerates wsl --list --quiet. |
| Azure Cloud Shell | Windows.Terminal.Azure |
Uses AzureConnection. |
| Visual Studio | Windows.Terminal.VisualStudio |
Developer PowerShell and Developer Command Prompt. |
| SSH | Windows.Terminal.SSH |
Preview: reads %USERPROFILE%\.ssh\config and creates one profile per host alias. |
Each generator hashes a stable input (e.g., distro name for WSL) to produce the profile GUID, preventing duplicates across regenerations.
3.11 Fragment Extensions
Fragments let third-party installers contribute profiles or color schemes without editing the user's settings.json.
Locations (either):
%ProgramData%\Microsoft\Windows Terminal\Fragments\<publisher>\<app>\*.json%LocalAppData%\Microsoft\Windows Terminal\Fragments\<publisher>\<app>\*.json
Schema:
{
"profiles": [ /* same shape as user profiles */ ],
"schemes": [ /* same shape as user schemes */ ]
}
Fragment-installed profiles appear read-only in the Settings UI. Users can override individual properties in their settings.json (user layer wins).
3.12 Settings Migration
Terminal migrates settings format changes on load:
- Old
keybindingsentries withoutidare auto-rewritten with synthesized IDs. - Deprecated keys (
useTabSwitcher, older bell config,acrylicOpacity,fontFace,fontSize,fontWeight) are translated to their replacements. - Migrated settings are saved back to disk on the first clean exit.
When migration fails (invalid JSON, unknown critical key), Terminal refuses to load user settings and shows an error banner.
3.13 Defaults File
The baked-in defaults live in src/cascadia/TerminalSettingsModel/defaults.json. At commit 7a83c0f:
- 2 hard-coded profiles (Windows PowerShell, Command Prompt)
- 16 color schemes
- 6 themes (3 modern + 3
legacy*) - ~150 action definitions
- ~60 default keybindings
Access via Ctrl+Alt+, or the command palette. This file is read-only; edits are lost on update.
4. Deployment & Scaling
4.1 Distribution Channels
| Channel | Package Family | Cadence | Min Windows | Notes |
|---|---|---|---|---|
| Stable | Microsoft.WindowsTerminal_8wekyb3d8bbwe |
~6 weeks | 19041 | Recommended for production |
| Preview | Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe |
~6 weeks | 19041 | Feature-flagged; some APIs unstable |
| Canary (App Installer) | Microsoft.WindowsTerminalCanary_8wekyb3d8bbwe |
Nightly | Windows 11 | Auto-updates |
| Canary (Portable) | No identity | Nightly | 19041 | Unpackaged; uses .portable flag |
| Dev (side-loaded) | WindowsTerminalDev_8wekyb3d8bbwe |
Per-build | 19041 | VS deploy target |
All three Store packages coexist on a machine without conflict.
4.2 Enterprise MSIX Deployment
| Method | Command / Notes |
|---|---|
| Microsoft Store | Default. Use Store for Business for air-gapped organizations. |
| winget | winget install --id Microsoft.WindowsTerminal |
| Provisioned (per-machine) | Add-AppxProvisionedPackage -Online -PackagePath <msixbundle> |
| DISM | DISM /Online /Add-ProvisionedAppxPackage /PackagePath:<msixbundle> |
| Intune (LOB app) | Upload .msixbundle; target device or user groups. |
| Intune (remediation) | PowerShell script invoking winget install under SYSTEM. |
Tip
Use the provisioned install (
Add-AppxProvisionedPackage) for shared PCs and kiosk scenarios so that new user profiles get Terminal automatically at first login.
4.3 Pre-staging Settings via Fragment
Ship a per-machine fragment so every user inherits corporate defaults without touching their settings.json:
%ProgramData%\Microsoft\Windows Terminal\Fragments\Contoso\main\contoso.json
{
"schemes": [ /* corporate color scheme */ ],
"profiles": [
{
"guid": "{00000000-0000-0000-0000-deadbeef0001}",
"name": "Contoso PS",
"commandline": "powershell.exe -NoProfile -ExecutionPolicy RemoteSigned",
"colorScheme": "Contoso Dark",
"icon": "%ProgramData%\\Contoso\\brand.png",
"startingDirectory": "%USERPROFILE%"
}
]
}
Deploy via Intune Win32 app, MSI, or Group Policy Preferences. Terminal scans Fragments\ at each launch.
4.4 Portable ZIP Distribution
The portable ZIP excludes AppxManifest.xml and includes a .portable marker:
- If
.portableexists next toWindowsTerminal.exe, Terminal writes state to<root>\settings\instead of%LocalAppData%\Packages\.... - No MSIX identity means no App Execution Alias (
wt.exe). Use the full path or add the root toPATH.
4.5 MSIX Internals
CascadiaPackage is the MSIX authoring project:
Package.appxmanifest-- publisher identity, capabilities, dependencies.- Key capabilities:
runFullTrust(launch arbitrary shells),userDataSystem(starting-directory persistence). - Key declarations: App Execution Alias (
wt.exe),Windows.ProtocolActivation(wt://URIs),Windows.ShellExtension("Open in Terminal" in File Explorer).
4.6 Locking Down Customization
There is no first-class "admin locks setting X" feature. Three approximations:
- File ACLs --
icaclson the per-usersettings.jsonpath. Breaks the Settings UI save path. - Fragments + user training -- ship corporate settings in a fragment; brief users to minimize overrides.
- AppLocker / WDAC -- block
WindowsTerminal.exefrom launching unexpected child processes.
Note
Fine-grained Group Policy for Terminal settings is an open feature request with no ETA. Terminal does not ship its own ADMX template.
4.7 Rolling Back a Release
# Sideload a specific version
Add-AppxPackage <file>.msixbundle
# Block future Store updates
reg add "HKLM\Software\Policies\Microsoft\WindowsStore" /v AutoDownload /t REG_DWORD /d 2 /f
To remove Terminal entirely:
Get-AppxPackage -AllUsers Microsoft.WindowsTerminal | Remove-AppxPackage -AllUsers
4.8 Group Policy and MDM
Terminal does not provide its own ADMX template. Control it indirectly:
| Mechanism | Purpose |
|---|---|
| AppLocker / WDAC | Permit or block WindowsTerminal.exe, OpenConsole.exe, and child shells |
| Store App Installer policy | Control MSIX sideloading (HKLM:\Software\Policies\Microsoft\WindowsStore) |
| Default Terminal CSP | Set default console host on Windows 11 via MDM |
| WSL policy | Control WSL via .wslconfig and Group Policy for Optional Features |
| Store update GPO | Pause Store auto-updates. Terminal updates through the Store, not Windows Update. |
5. Operations
5.1 Settings Reset Procedure
- Close all Terminal windows.
- Navigate to the settings directory (see section 3.1).
- Rename
settings.jsontosettings.json.bak. - Relaunch Terminal. A fresh
settings.jsonis generated fromdefaults.json.
5.2 Persisted Window Layout
Set "firstWindowPreference": "persistedWindowLayout" to restore tabs, panes, and window positions across sessions. State is stored in <LocalState>\state.json.
Tip
Window layout persistence saves the profile, working directory, and pane arrangement. It does not preserve in-flight shell state (running commands, environment modifications, scrollback history).
5.3 Default Terminal Application (Windows 11)
On Windows 11, Terminal can be set as the default handler for all console applications:
- Settings > Privacy & Security > For developers > Terminal: select "Windows Terminal".
- Or via MDM:
./Device/Vendor/MSFT/Policy/Config/ConsoleHost/DefaultConsoleHostTerminal.
When set, all console applications (including those launched from Win+R, Task Scheduler, or Start Menu) open in Terminal instead of the legacy conhost.exe.
5.4 Notification Area Behavior
When minimizeToNotificationArea is true:
- Minimized windows move to the system tray.
- A Terminal icon appears in the notification area.
- Right-click the tray icon to access windows or quit.
- Set
alwaysShowNotificationIcontotrueto keep the icon visible at all times.
5.5 Shell Integration Protocol
Terminal implements the FinalTerm shell-integration dialect plus partial ConEmu and iTerm2 support:
| OSC | Effect |
|---|---|
0; / 2; |
Set window title |
4;i;rgb:... |
Change palette color i for the session |
7;file://<host>/<path> |
Report current working directory |
8;;url |
Start/end a clickable hyperlink region |
9;<text> |
ConEmu: show a notification |
9;4;<state>;<value> |
ConEmu: update taskbar progress (0=remove, 1=default, 2=error, 3=indeterminate, 4=warning) |
9;9;<path> |
ConEmu: report CWD |
133;A |
FinalTerm: begin prompt |
133;B |
FinalTerm: end prompt, begin command input |
133;C |
FinalTerm: command is executing |
133;D;<code> |
FinalTerm: command completed with exit code |
1337;CurrentDir=<path> |
iTerm2: report CWD |
1337;SetMark |
iTerm2: drop a mark on the scrollbar |
Capabilities that depend on shell integration:
| Feature | Required OSC |
|---|---|
| Scroll marks | OSC 133 prompts (or explicit addMark) |
scrollToMark / selectCommand / selectOutput |
OSC 133 prompt boundaries |
openCWD / CWD-aware duplicate tab |
OSC 7, OSC 9;9, or OSC 1337 |
| Quick Fix | OSC 133 D plus a Quick Fix provider |
| Taskbar progress bar | OSC 9;4 |
Note
Shell integration is opt-in. Users must source the appropriate snippet in their shell profile. A ready-made drop-in is available at
https://aka.ms/terminal-shell-integration.
PowerShell ($PROFILE):
$Global:__LastHistoryId = -1
function Global:__Terminal-Get-LastExitCode {
if ($? -eq $True) { return 0 }
elseif ($LASTEXITCODE -ne 0) { return $LASTEXITCODE }
else { return 1 }
}
function Global:Prompt() {
$gle = $Global:?
$LastHistoryEntry = Get-History -Count 1
$Result = ""
if ($Global:__LastHistoryId -ne -1) {
if ($LastHistoryEntry.Id -ne $Global:__LastHistoryId) {
$Result += "$([char]27)]133;D;{0}$([char]7)" -f (__Terminal-Get-LastExitCode)
}
}
$Result += "$([char]27)]133;A$([char]7)"
$Result += "$([char]27)]9;9;$([System.IO.Path]::GetFullPath($PWD))$([char]7)"
$Result += "PS $PWD> "
$Result += "$([char]27)]133;B$([char]7)"
$Global:__LastHistoryId = $LastHistoryEntry.Id
return $Result
}
bash (WSL, ~/.bashrc):
PS0=$'\e]133;C\a'
PS1=$'\e]133;A\a'"${PS1}"$'\e]133;B\a'
PROMPT_COMMAND='printf "\e]133;D;%s\a\e]7;file://%s%s\a" "$?" "$HOSTNAME" "$PWD"'
zsh (~/.zshrc):
precmd() {
printf '\e]133;D;%d\a' "$?"
printf '\e]7;file://%s%s\a' "$HOSTNAME" "$PWD"
}
preexec() { printf '\e]133;C\a' }
PROMPT=$'%{\e]133;A\a%}'"$PROMPT"$'%{\e]133;B\a%}'
5.6 Telemetry and Privacy
Terminal uses TraceLoggingProvider (ETW) via WIL macros. Events flow into the Windows Diagnostic Data pipeline.
Collected: app version, language, dynamic profile generation, feature usage counts (action invocations, command palette opens), non-fatal exceptions, render frame times, startup time.
Not collected: terminal contents, keystrokes, command lines, settings.json contents, clipboard data, usernames, or paths.
To suppress optional telemetry, set Windows Diagnostic Data to "Required diagnostic data" or lower. For full suppression on Enterprise SKUs:
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection" /v AllowTelemetry /t REG_DWORD /d 0 /f
Audit what Terminal emits locally:
# ETW providers: Microsoft.Windows.Terminal.App, .Control, .Renderer, Microsoft.Windows.Console.Host
wpr -start GeneralProfile
# Reproduce the scenario
wpr -stop trace.etl
# Analyze in Windows Performance Analyzer
5.7 State Files and Cache
| Purpose | Path |
|---|---|
| User settings | <LocalState>\settings.json |
| Window layout state | <LocalState>\state.json |
| Jumplist | <LocalState>\WindowsTerminalJumplist.json |
| Crash dumps (if enabled) | %LocalAppData%\CrashDumps\WindowsTerminal*.dmp |
| Logs | ETW only (no file logs) |
5.8 Crash Dump Configuration
To enable local crash dumps:
$path = "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\WindowsTerminal.exe"
New-Item -Path $path -Force
Set-ItemProperty -Path $path -Name DumpType -Value 2
Set-ItemProperty -Path $path -Name DumpCount -Value 10
Set-ItemProperty -Path $path -Name DumpFolder -Value "%LocalAppData%\CrashDumps"
5.9 ETW Tracing
logman create trace TermTrace -p Microsoft-Windows-Terminal-App -o C:\traces\term.etl -ow
logman start TermTrace
# Reproduce the issue
logman stop TermTrace
logman delete TermTrace
Analyze in Windows Performance Analyzer or PerfView.
6. Performance
6.1 AtlasEngine (GPU Renderer)
AtlasEngine is the default renderer for Windows Terminal, written in C++20 with Direct3D 11 + Direct2D/DirectWrite:
- Glyph atlas: each unique
(glyph, attributes, cellSize)tuple gets a tile in a GPU texture. Repeated glyphs reuse tiles, resulting in near-zero per-frame CPU work when text is unchanged. - Instanced quads: the cell grid is drawn as a single instanced draw call per frame.
- Damage tracking: only dirty cells are re-rasterized.
- DirectComposition: composes onto the XAML visual tree without flicker.
6.2 Rendering Configuration
| Setting | Effect | When to Use |
|---|---|---|
rendering.graphicsAPI: "direct3d11" |
Use Direct3D 11 backend (more performant) | Default; best for most GPUs |
rendering.graphicsAPI: "direct2d" |
Use Direct2D backend (more stable) | When experiencing D3D11 driver bugs |
rendering.disablePartialInvalidation: true |
Use FLIP_DISCARD swap chain, no dirty rectangles | When partial invalidation causes artifacts |
rendering.software: true |
Force WARP software rasterizer | Only when GPU drivers are broken |
Warning
Software rendering (
rendering.software: true) is dramatically slower than GPU rendering. Use it only as a diagnostic tool or workaround for broken GPU drivers.
6.3 Font and Text Performance
| Setting | Impact |
|---|---|
font.builtinGlyphs (default: true) |
Uses built-in box-drawing glyphs for crisper rendering than font fallback. Keep enabled. |
font.features / font.axes |
Complex DWrite features increase shaping cost. Disable ligatures ("liga": 0) in performance-sensitive scenarios. |
compatibility.textMeasurement |
"graphemes" is most correct but slightly more expensive. "console" is fastest (legacy behavior). |
6.4 Buffer and Scrollback
historySize (default: 9001) is per-profile, measured in lines. RAM consumption scales with historySize * visible_column_count. Very large values (unlimited/-1) can consume significant memory for wide terminals with color-intensive output.
The scrollback uses RLE-compressed rows: runs of identical cells are compacted. TUI applications that update single cells at a time (e.g., btop) generate more row fragmentation than line-oriented output.
6.5 Animation and Visual Effects
| Setting | Effect |
|---|---|
disableAnimations: true |
Skip XAML transitions. Small improvement on slow hardware. |
experimental.retroTerminalEffect |
CRT effect re-renders every frame. Disable for performance. |
experimental.pixelShaderPath |
Custom shaders run every frame. Complex shaders tank performance. |
6.6 Diagnosing Slowness
- Open Task Manager > Details. Compare CPU usage of
WindowsTerminal.exe(renderer) andOpenConsole.exe(backend) to isolate the bottleneck. - Capture a GPU trace:
wpr -start GeneralProfile -start GPUfor 30 seconds. - Disable experimental features (
retroTerminalEffect,pixelShaderPath). - Test software rendering -- if performance improves, update GPU drivers.
- For SSH/WSL latency, use
ServerAliveIntervalandControlMasterfor SSH multiplexing.
Tip
Issue #20113 documents a "slow for half a second then fast" regression related to render-batching heuristics interacting with certain GPU drivers. If you see this pattern, try toggling
rendering.disablePartialInvalidation.
7. Security
7.1 Attack Surface
Windows Terminal is a desktop application with no listening sockets and no inbound network surface. The attack surface is limited to:
- VT sequences from child processes -- an attacker with shell access can inject OSC sequences.
- Clipboard -- any process with clipboard access can stage malicious pastes.
settings.jsontampering -- a local attacker can execute arbitrary commands viastartupActions,elevate, or modifiedcommandlineon the default profile.- Fragments -- per-machine fragments in
%ProgramData%require admin to place but affect every user. - MSIX capabilities --
runFullTrustmeans a compromised Terminal process has the user's full rights.
Caution
An attacker who gains write access to
settings.jsoncan preload arbitrary commands viastartupActionsor inject profiles with"elevate": true. Restrict write access to the user'sLocalStatedirectory at the filesystem level.
7.2 Built-in Mitigations
| Mitigation | Setting | Description |
|---|---|---|
| Multi-line paste warning | warning.multiLinePaste: true |
Blocks the "copy from malicious webpage, paste executes command" vector. |
| Large paste warning | warning.largePaste: true |
Prompts for very large pastes. |
| Trim paste | trimPaste: true |
Strips trailing newlines to prevent forced execution of pasted lines. |
| OSC filtering | Various | Potentially dangerous OSCs (e.g., OSC 52 clipboard write) are gated by config or ignored by default. |
| Title suppression | suppressApplicationTitle: true |
Prevents remote hosts from spoofing the tab title. |
| Read-only mode | toggleReadOnlyMode action |
Prevents accidental input to a watched pane. |
| Admin shield | showAdminShield: true |
Visual indicator when running elevated. |
7.3 Security-Sensitive Settings
| Setting | Risk | Recommendation |
|---|---|---|
compatibility.allowOSC52 (default: true) |
VT applications can write to the system clipboard via escape sequences. | Set to false in untrusted environments. |
compatibility.allowDECRQCRA (default: false) |
Allows remote applications to read a checksum of screen content. | Keep false unless specific applications require it. |
compatibility.input.forceVT (default: false) |
Forces legacy VT input encoding. May expose the terminal to input-injection attacks that modern encoding prevents. | Keep false unless required for compatibility. |
experimental.pixelShaderPath |
Loads arbitrary HLSL compiled at runtime. A compromised config could render a shader that causes GPU hangs. | Disable in hardened environments. |
elevate: true (per-profile) |
Every launch triggers UAC. Blind acceptance becomes an escalation vector. | Avoid deploying profiles with elevate: true in managed environments. |
7.4 Known Security Considerations
- OSC 7 host trust (Issue #20072): Terminal honors whatever hostname the shell reports. An attacker over SSH could report a misleading hostname. Verify the host before using
openCWDover SSH. - OSC 8 hyperlinks: clickable in the terminal. Hovering shows the target URL. Exercise caution clicking links from untrusted shells.
- Pixel shaders:
experimental.pixelShaderPathcompiles HLSL at runtime. Can cause GPU hangs or visual exploits.
Warning
Security vulnerabilities should be reported via
[email removed]or the Microsoft Security Response Center (MSRC) portal athttps://msrc.microsoft.com. Do not file security bugs as public GitHub issues.
7.5 Hardening Checklist
- [ ] Set
compatibility.allowOSC52: falsein fleet-wide fragments for untrusted environments - [ ] Remove or avoid profiles with
elevate: true - [ ] Keep paste warnings enabled (
warning.multiLinePaste,warning.largePaste) - [ ] Set
autoMarkPrompts: truefor SOC visibility into prompt boundaries - [ ] Disable Azure Cloud Shell if not needed:
"disabledProfileSources": ["Windows.Terminal.Azure"] - [ ] Lock down
%LocalAppData%\Packages\Microsoft.WindowsTerminal_*\LocalStatepermissions - [ ] Prefer Store distribution for automatic security updates
- [ ] Do not deploy custom pixel shaders in managed environments
- [ ] Subscribe to GitHub release RSS feed for prompt patching
8. Developer Internals
8.1 Repository Structure
| Path | Purpose |
|---|---|
src/cascadia/ |
All Windows Terminal (Cascadia) application code. Each subdirectory is a WinRT component or app project. |
src/cascadia/TerminalApp/ |
Main application layer (84 files, 1.1M chars). TerminalPage, CommandPalette, NewTabMenu, AppCommandlineArgs. |
src/cascadia/TerminalControl/ |
Reusable TermControl WinRT XAML control. |
src/cascadia/TerminalCore/ |
Terminal state (text buffer, scrollback, selection, search). |
src/cascadia/TerminalSettingsModel/ |
Settings types, JSON loader, defaults.json, profile generators. |
src/cascadia/TerminalSettingsEditor/ |
Settings UI XAML pages. |
src/cascadia/TerminalConnection/ |
Connection back-ends (ConPTY, Azure, Echo). |
src/cascadia/WindowsTerminal/ |
Window management (17 files, 276K chars). wWinMain, AppHost, WindowEmperor, IslandWindow. |
src/cascadia/CascadiaPackage/ |
MSIX manifest, jumplist definitions, icons. |
src/cascadia/Remoting/ |
Cross-window communication (Monarch/Peasant model). |
src/cascadia/ShellExtension/ |
Windows Shell extension ("Open in Terminal" context menu). |
src/cascadia/WpfTerminalControl/ |
WPF control for .NET embedding. |
src/cascadia/fzf/ |
Fuzzy finder integration (MIT, from Junegunn Choi / Simon Hauser). |
src/host/ |
Console host, conhost.exe (92 files, 942K chars). |
src/server/ |
Console API server (45 files, 258K chars). ALPC-based request handling. |
src/terminal/ |
Shared VT parser, adapter, input translator. |
src/terminal/adapter/ |
VT sequence dispatch, ITermDispatch implementation (23 files). |
src/terminal/parser/ |
VT parser state machine. |
src/terminal/input/ |
Input encoding and translation. |
src/renderer/ |
Rendering engines: AtlasEngine (GPU), GDI, UIA, WDDM. |
src/buffer/ |
Text buffer primitives shared by host and Cascadia. |
src/types/ |
Common types (coords, rects, colors, viewport). |
src/til/ |
Terminal Implementation Library (custom containers, threading primitives). |
src/inc/ |
Shared headers (14 files, 67K chars). |
src/tsf/ |
Text Services Framework / IME support (6 files, 37K chars). |
src/propslib/ |
Properties library, registry settings (11 files, 79K chars). |
src/propsheet/ |
Console properties dialog (29 files, 262K chars). |
src/winconpty/ |
ConPTY API implementation (5 files, 31K chars). |
src/interactivity/ |
Input/output interaction layers (Win32, OneCore). |
src/tools/ |
Developer tools: ConsoleBench, ColorTool, echokey, fontlist, integrity, vtpipeterm, RenderingTests, and more. |
src/audio/ |
MIDI support. |
dep/ |
Build dependencies (telemetry, Console, NT, Win32K, vcpkg overlay). |
oss/ |
Vendored open-source components (Chromium numerics, stb, pcg, interval_tree, wyhash, fzf). |
doc/ |
Documentation and specs. STYLE.md, ORGANIZATION.md, EXCEPTIONS.md, WIL.md. |
doc/cascadia/ |
profiles.schema.json (109K chars, the authoritative settings schema). |
samples/ |
ConPTY sample applications (EchoCon, GUIConsole, MiniTerm, PixelShaders, ReadConsoleInputStream). |
tools/ |
Release engineering and test tools. OpenConsole.psm1, razzle.cmd. |
scratch/ |
Scratch/test island app (ScratchIslandApp). |
res/ |
Resources: fonts (Cascadia Code), icons, images. |
policies/ |
Group Policy ADMX templates (policies/en-US/). |
8.2 Key Files
| File | Significance |
|---|---|
OpenConsole.slnx |
Top-level Visual Studio solution. Open this to build anything. |
src/cascadia/TerminalSettingsModel/defaults.json |
Shipped defaults: every key binding, color scheme, and profile default. |
doc/cascadia/profiles.schema.json |
3,300+ line JSON schema, the contract for settings.json. |
src/cascadia/WindowsTerminal/main.cpp |
Process entry (wWinMain). Dispatches to WindowEmperor::HandleCommandlineArgs. |
src/cascadia/TerminalApp/AppCommandlineArgs.cpp |
Parses every wt.exe argument (CLI11-based). |
src/cascadia/TerminalApp/TerminalPage.xaml |
Top-level UI: tab/pane hierarchy, action dispatch. |
vcpkg.json |
C++ dependency manifest (manifest mode). |
.config/configuration.winget |
Developer box setup configuration. |
8.3 Build from Source
Clone
git clone --recursive https://github.com/microsoft/terminal.git
cd terminal
Build via PowerShell
Import-Module .\tools\OpenConsole.psm1
Set-MsBuildDevEnvironment
Invoke-OpenConsoleBuild
| Command | Effect |
|---|---|
Invoke-OpenConsoleBuild -Configuration Release -Platform x64 |
Release x64 build |
Invoke-OpenConsoleBuild -Target Rebuild |
Full rebuild |
Invoke-OpenConsoleBuild -Target Clean |
Clean |
Invoke-OpenConsoleTests |
Run unit tests |
Build via cmd
.\tools\razzle.cmd
bcz
Build in Visual Studio
- Open
OpenConsole.slnx. - Select x64 or x86 platform (no Any CPU -- native C++).
- Right-click CascadiaPackage and set as Startup Project.
- Set debug properties: "Application process" and "Background task process" to Native Only.
- Press F5.
Warning
Running
WindowsTerminal.exedirectly outside of VS deploy will not work. The app requires MSIX identity for many APIs and must come up through the packaged activation path. See Issues #926 and #4043.
Build Artifacts
Output goes to bin\<Platform>\<Configuration>\:
WindowsTerminal.exe-- the shell binaryOpenConsole.exe-- locally builtconhost.exeCascadiaPackage.msix-- the MSIX bundleTerminalApp.dll,TerminalControl.dll,TerminalSettingsModel.dll-- WinRT component DLLs
Local Deployment
Add-AppxPackage -Register .\bin\x64\Debug\CascadiaPackage\AppxManifest.xml
start shell:AppsFolder\WindowsTerminalDev_8wekyb3d8bbwe!App
8.4 WinRT Components
| Component | Purpose |
|---|---|
Microsoft.Terminal.Control |
Reusable TermControl XAML control |
Microsoft.Terminal.Core |
Pure terminal state (no UI, no XAML) |
Microsoft.Terminal.Settings.Model |
Settings types and JSON I/O |
Microsoft.Terminal.Settings.Editor |
Settings UI XAML pages |
Microsoft.Terminal.TerminalConnection |
ITerminalConnection + shipped implementations |
Microsoft.Terminal.UI |
Shared XAML resources |
All emit .winmd files that downstream apps can reference.
8.5 ConPTY API
The ConPTY (Pseudo Console) API enables modern terminals to host legacy Win32 console programs. The API surface consists of three functions:
CreatePseudoConsole(size, hInput, hOutput, flags, phPC)-- creates a pseudo console attached to input/output pipes.ResizePseudoConsole(hPC, size)-- resizes the pseudo console.ClosePseudoConsole(hPC)-- tears down the pseudo console.
After creating a ConPTY, attach it to a child process via UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE). The child's stdin/stdout/stderr flow through the ConPTY pipes.
OpenConsole.exe discovery: Windows Terminal ships OpenConsole.exe (built from the same source as conhost.exe) alongside its binary. At launch, Terminal looks for OpenConsole.exe side-by-side with the current process. If not found, it falls back to the system conhost.exe. Architecture detection selects x64, ARM64, or x86 variants as appropriate.
8.6 VT Sequence Support
The VT parser (src/terminal/parser/) implements:
- CSI (parameter-bearing) sequences
- OSC (string) sequences with BEL or ST terminators
- DCS (device control strings)
- Sixel (in development)
- 256-color and 24-bit (
38;2;r;g;b) SGR - Mouse reporting (modes 1000, 1002, 1003, 1006, 1015)
The script Build-SupportedSequenceIndex.ps1 scans the ITermDispatch interface and both adaptDispatch (ConHost) and terminalDispatch (Terminal) implementations to generate a compatibility matrix of supported sequences.
8.7 Code Patterns and Conventions
Language and Style
- C++20 with Microsoft extensions. Compiled
/W4 /WX(no warnings). - Unicode everywhere:
wchar_t,std::wstring, Windows "W" APIs. - STL containers preferred over home-grown. WIL (Windows Implementation Libraries) for handle management.
gsl::span,gsl::not_null: Guidelines Support Library for safer pointer handling.- No raw
new/deleteoutside RAII wrappers. Usestd::make_unique, WIL smart handles,com_ptr. - 4-space indent, LF line endings,
#pragma once. - PascalCase types, camelCase functions,
m_prefix for members,s_for statics,g_for globals.
Key Patterns
- C++/WinRT for WinUI interop. All Cascadia components are WinRT classes.
- XAML Islands for hosting WinUI 2 controls in a Win32 window.
winrt::auto_revokefor event handler lifetime management (prevents dangling event subscriptions).ThrottledFuncfor debouncing UI updates (prevents render thrashing during rapid state changes).til::namespace for custom containers and threading primitives (shared_mutex,latch,throttled_func).wil::(Windows Implementation Libraries) for resource management (unique_handle,com_ptr, error macros).
Exception Strategy
- Core libraries (buffer, renderer, parser) are designed to be exception-hostile; many constructors are
noexcept. - Cascadia (new code) uses exceptions freely.
- WIL helpers:
LOG_IF_WIN32_BOOL_FALSE,RETURN_IF_FAILED,THROW_IF_FAILED(seedoc/EXCEPTIONS.md).
XAML Conventions
- Use
XamlStyler(CI validates formatting viaXamlStyler.jsonat repo root). - Prefer
{ThemeResource}over{StaticResource}for theme-varying values. - Centralize styles in
CommonResources.xamlor page-levelResourceDictionary.
8.8 Testing
Test Suites
| Suite | Location | Type | Runs On |
|---|---|---|---|
UnitTests_* |
src/*/ut_* |
Native unit tests (TAEF) | Every PR |
LocalTests_* |
src/cascadia/ut_app/ etc. |
Requires XAML host | PR + CI with XAML support |
FeatureTests |
src/cascadia/ut_*/ |
End-to-end action tests | Nightly |
HostAndVTTests |
src/host/ut_* |
Console host + VT parser | Every PR |
| UIA Tests | src/cascadia/WindowsTerminal_UIATests/ |
UI Automation tests | CI |
| Host UIA Tests | src/host/ft_uia/ |
Console host UIA tests | CI |
| Fuzzer | src/terminal/parser/ft_fuzzwrapper/ |
VT parser fuzzing | Nightly |
| ConsoleBench | src/tools/ConsoleBench/ |
Benchmark tool | Manual |
Running Tests
Import-Module .\tools\OpenConsole.psm1
Set-MsBuildDevEnvironment
Invoke-OpenConsoleTests
# Filter by test name:
Invoke-OpenConsoleTests -Name *UnitTests_TerminalCore*
Tests use TAEF (te.exe), Microsoft's native test framework.
8.9 Contributing
- Read
CONTRIBUTING.mdin the repo root. - Browse issues labeled
help wantedon GitHub. - Sign the Microsoft Contributor License Agreement (CLA) -- a bot guides you on first PR.
- Fork, branch off
main, PR againstmain.
Pull Request Checklist
- [ ] Linked to an issue (or use
Spec:prefix for new features) - [ ] Unit tests added or updated
- [ ]
Resources.reswupdated for new user-visible strings - [ ]
defaults.jsonupdated if adding/renaming actions - [ ]
NOTICE.mdupdated if adding a dependency - [ ] CI green:
UnitTests_*,LocalTests_*, policy check, AzDO pipeline - [ ] CLA signed
Adding a New Action
- Add the action name and args struct to
ActionArgs.idlandActionArgs.hinTerminalSettingsModel. - Update
ActionAndArgs::FromJsonto deserialize it. - Implement the handler in
TerminalPage.cpp. - Add a default entry in
defaults.jsonwith aTerminal.*id. - Optionally bind it in default keybindings.
- Add a localized command-name string to
Resources.resw. - Add unit tests in
UnitTests_SettingsModeland action-level tests inUnitTests_Control.
Hosting TerminalControl in Your Own App
<Window xmlns:term="using:Microsoft.Terminal.Control">
<term:TermControl x:Name="Terminal" />
</Window>
auto settings = winrt::make<MyControlSettings>();
auto connection = winrt::make<MyConnection>();
Terminal().Initialize(settings, connection);
MyControlSettings implements IControlSettings (font, colors, cursor, padding). MyConnection implements ITerminalConnection (Start, WriteInput, Resize, Close). This is how Visual Studio integrates a Terminal pane.
8.10 Release Process
| Channel | Cadence | Gate |
|---|---|---|
| Preview | ~3 weeks | None (feature-flagged) |
| Stable | ~6 weeks | Promoted from a baked Preview |
| Canary | Nightly | None (automated from main) |
Version scheme: 1.x.y.z where 1 = product generation, x = feature train (bumped per Preview), y = build (CI-set), z = hotfix.
8.11 Potential Improvements
From source comments and open issues:
| Issue | Description |
|---|---|
| GH#12190, GH#12169 | Elevated window handoff issues with monarch/peasant model |
| GH#11561 | Window visibility during initialization |
| GH#10583 | Invisible border positioning |
| GH#19806 | Refactor IconPathConverter::IconWUX() to not set icon size as side-effect |
| GH#13792 | Full modifyOtherKeys support for Tab/Ctrl+I distinction |
| GH#17000 | Settings UI Rejuvenation (long-running modernization effort) |
Technical debt:
AppLogicsingleton initialization is split across many lazily-loaded helpers.NewTerminalArgs+ startup-action JSON represent two paths for the same data; consolidation is on the wish list.LocalTestsinitialization race (repaired in #19610/#14623) but the pattern remains fragile.- WinUI 3 migration is incremental -- the app is being lifted off WinUI 2 / XAML Islands.
9. Integration Points
9.1 ConPTY API (Terminal Embedding)
Any application can host a terminal pane using the ConPTY API. Create pipes, call CreatePseudoConsole, spawn a child process attached to the ConPTY, and read/write VT sequences on the pipes. See samples/ConPTY/ for complete C++ and C# examples (EchoCon, GUIConsole, MiniTerm).
9.2 Shell Extension
src/cascadia/ShellExtension/ implements the Windows Shell extension that adds "Open in Terminal" to the File Explorer context menu. Registered via the MSIX package manifest.
9.3 Fragment Extensions
Third-party applications can contribute profiles and color schemes by placing JSON files in the Fragments directory (see section 3.11). No code is required. Examples include Git for Windows, Ubuntu WSL, and oh-my-posh.
9.4 Remoting (Cross-Window Communication)
src/cascadia/Remoting/ implements the Monarch/Peasant model:
- Monarch process registers globally and handles cross-window commands.
- Peasant processes delegate operations like
wt -w <name>to the monarch. - Used for: tab moves between windows,
globalSummon,quakeMode,identifyWindows.
9.5 WPF Terminal Control
src/cascadia/WpfTerminalControl/ provides a .NET-compatible control for embedding terminal functionality in WPF applications. Used in the WpfTerminalTestNetCore test project.
9.6 Azure Cloud Shell Connection
AzureConnection in TerminalConnection establishes a WebSocket session to Azure Cloud Shell. Users authenticate through the Terminal UI. Disable this source via "disabledProfileSources": ["Windows.Terminal.Azure"].
9.7 Custom Pixel Shaders
Write an HLSL 5.0 pixel shader that processes the Terminal output texture:
Texture2D shaderTexture;
SamplerState samplerState;
cbuffer PixelShaderSettings : register(b0) {
float Time;
float Scale;
float2 Resolution;
float4 Background;
};
float4 main(float4 pos : SV_POSITION, float2 uv : TEXCOORD) : SV_TARGET {
return shaderTexture.Sample(samplerState, uv);
}
Set experimental.pixelShaderPath per profile. The samples/PixelShaders/ directory contains example shaders. Shaders run every frame and can significantly impact performance.
9.8 Custom Connection Back-ends
Implement ITerminalConnection in a WinRT component, then reference it via a fragment profile with "connectionType": "{your-guid-here}". This requires shipping a .winmd and registering an activatable class in the MSIX manifest. Most custom scenarios are better served by a ConPTY connection wrapping a proxy process.
9.9 Shell Integration Extensions
Shells can integrate with Terminal by emitting OSC escape sequences (see section 5.5). This enables prompt marks, scroll-to-mark, CWD-aware tab duplication, quick-fix suggestions, and taskbar progress. Custom shells (fish, nushell, xonsh) can source an OSC-emitting prompt snippet to gain these features.
Appendix A -- Action IDs
Every action ID from defaults.json, usable in keybindings and newTabMenu entries:
Application: Terminal.CloseWindow, Terminal.ToggleFullscreen, Terminal.ToggleFocusMode, Terminal.ToggleAlwaysOnTop, Terminal.OpenNewTabDropdown, Terminal.OpenSettingsUI, Terminal.OpenSettingsFile, Terminal.OpenDefaultSettingsFile, Terminal.OpenSettingsDirectory, Terminal.FindText, Terminal.FindNextMatch, Terminal.FindPrevMatch, Terminal.ToggleShaderEffects, Terminal.OpenTabColorPicker, Terminal.RenameTab, Terminal.OpenTabRenamer, Terminal.ToggleCommandPalette, Terminal.IdentifyWindow, Terminal.OpenWindowRenamer, Terminal.QuakeMode, Terminal.OpenSystemMenu, Terminal.Quit, Terminal.RestoreLastClosed, Terminal.OpenAboutDialog, Terminal.OpenTasks, Terminal.QuickFix, Terminal.Suggestions, Terminal.OpenCWD.
Tabs: Terminal.CloseOtherTabs, Terminal.CloseTabsAfter, Terminal.MoveTabForward, Terminal.MoveTabBackward, Terminal.OpenNewTab, Terminal.OpenNewWindow, Terminal.OpenNewTabProfile0 through Terminal.OpenNewTabProfile8, Terminal.DuplicateTab, Terminal.NextTab, Terminal.PrevTab, Terminal.SwitchToTab0 through Terminal.SwitchToTab7, Terminal.SwitchToLastTab, Terminal.MoveTabToNewWindow.
Panes: Terminal.CloseOtherPanes, Terminal.ClosePane, Terminal.SplitPaneUp, Terminal.SplitPaneDown, Terminal.SplitPaneLeft, Terminal.SplitPaneRight, Terminal.DuplicatePaneDown, Terminal.DuplicatePaneRight, Terminal.DuplicatePaneAuto, Terminal.ResizePaneDown, Terminal.ResizePaneLeft, Terminal.ResizePaneRight, Terminal.ResizePaneUp, Terminal.MoveFocusDown, Terminal.MoveFocusLeft, Terminal.MoveFocusRight, Terminal.MoveFocusUp, Terminal.MoveFocusPrevious, Terminal.MoveFocusPreviousInOrder, Terminal.MoveFocusNextInOrder, Terminal.MoveFocusFirst, Terminal.MoveFocusParent, Terminal.MoveFocusChild, Terminal.SwapPaneDown, Terminal.SwapPaneLeft, Terminal.SwapPaneRight, Terminal.SwapPaneUp, Terminal.SwapPanePrevious, Terminal.SwapPanePreviousInOrder, Terminal.SwapPaneNextInOrder, Terminal.SwapPaneFirst, Terminal.ToggleBroadcastInput, Terminal.TogglePaneZoom, Terminal.ToggleSplitOrientation, Terminal.ToggleReadOnlyMode, Terminal.EnableReadOnlyMode, Terminal.DisableReadOnlyMode, Terminal.MovePaneToTab0 through Terminal.MovePaneToTab8, Terminal.MovePaneToNewWindow, Terminal.RestartConnection, Terminal.OpenSnippetsPane.
Clipboard: Terminal.CopyToClipboard, Terminal.PasteFromClipboard, Terminal.SelectAll, Terminal.ToggleMarkMode, Terminal.ToggleBlockSelection, Terminal.SwitchSelectionEndpoint, Terminal.ExpandSelectionToWord, Terminal.ShowContextMenu.
Scrollback: Terminal.ScrollDown, Terminal.ScrollDownPage, Terminal.ScrollUp, Terminal.ScrollUpPage, Terminal.ScrollToTop, Terminal.ScrollToBottom, Terminal.ClearBuffer, Terminal.ExportBuffer.
Visual: Terminal.IncreaseFontSize, Terminal.DecreaseFontSize, Terminal.ResetFontSize.
Misc: Terminal.SearchWeb.
Appendix B -- Default Key Bindings
| Keys | Action |
|---|---|
alt+f4 |
Terminal.CloseWindow |
alt+enter / f11 |
Terminal.ToggleFullscreen |
ctrl+shift+space |
Terminal.OpenNewTabDropdown |
ctrl+, |
Terminal.OpenSettingsUI |
ctrl+shift+, |
Terminal.OpenSettingsFile |
ctrl+alt+, |
Terminal.OpenDefaultSettingsFile |
ctrl+shift+f |
Terminal.FindText |
ctrl+shift+p |
Terminal.ToggleCommandPalette |
win+sc(41) |
Terminal.QuakeMode |
alt+space |
Terminal.OpenSystemMenu |
ctrl+shift+period |
Terminal.Suggestions |
ctrl+shift+t |
Terminal.OpenNewTab |
ctrl+shift+n |
Terminal.OpenNewWindow |
ctrl+shift+1 through ctrl+shift+9 |
Terminal.OpenNewTabProfile0 through Terminal.OpenNewTabProfile8 |
ctrl+shift+d |
Terminal.DuplicateTab |
ctrl+tab / ctrl+shift+tab |
Terminal.NextTab / Terminal.PrevTab |
ctrl+alt+1 through ctrl+alt+8 |
Terminal.SwitchToTab0 through Terminal.SwitchToTab7 |
ctrl+alt+9 |
Terminal.SwitchToLastTab |
ctrl+shift+w |
Terminal.ClosePane |
alt+shift+- |
Terminal.DuplicatePaneDown |
alt+shift+plus |
Terminal.DuplicatePaneRight |
alt+shift+down/left/right/up |
Terminal.ResizePaneDown/Left/Right/Up |
alt+down/left/right/up |
Terminal.MoveFocusDown/Left/Right/Up |
ctrl+alt+left |
Terminal.MoveFocusPrevious |
ctrl+shift+c / ctrl+insert / enter |
Terminal.CopyToClipboard |
ctrl+shift+v / shift+insert |
Terminal.PasteFromClipboard |
ctrl+shift+a |
Terminal.SelectAll |
ctrl+shift+m |
Terminal.ToggleMarkMode |
menu |
Terminal.ShowContextMenu |
ctrl+shift+down/up |
Terminal.ScrollDown/Up |
ctrl+shift+pgdn/pgup |
Terminal.ScrollDownPage/UpPage |
ctrl+shift+home/end |
Terminal.ScrollToTop/Bottom |
ctrl+shift+k |
Terminal.ClearBuffer |
ctrl+plus / ctrl+numpad_plus |
Terminal.IncreaseFontSize |
ctrl+minus / ctrl+numpad_minus |
Terminal.DecreaseFontSize |
ctrl+0 / ctrl+numpad_0 |
Terminal.ResetFontSize |
Appendix C -- Built-in Color Schemes
Campbell, Campbell Powershell, Vintage, One Half Dark, One Half Light, Solarized Dark, Solarized Light, Tango Dark, Tango Light, Dark+, VSCode Dark Modern, VSCode Light Modern, CGA, IBM 5153, Dimidium, Ottosson.
Exact foreground/background/ANSI values for each scheme can be inspected in defaults.json or via the User Guide color reference.
Appendix D -- File Locations
| Purpose | Path |
|---|---|
| Settings (Stable) | %LocalAppData%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json |
| Settings (Preview) | %LocalAppData%\Packages\Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe\LocalState\settings.json |
| Settings (Canary) | %LocalAppData%\Packages\Microsoft.WindowsTerminalCanary_8wekyb3d8bbwe\LocalState\settings.json |
| Settings (Portable) | <install root>\settings\settings.json |
| Per-user fragments | %LocalAppData%\Microsoft\Windows Terminal\Fragments\<publisher>\<app>\*.json |
| Per-machine fragments | %ProgramData%\Microsoft\Windows Terminal\Fragments\<publisher>\<app>\*.json |
| Window layout state | <LocalState>\state.json |
| Jumplist | <LocalState>\WindowsTerminalJumplist.json |
| Crash dumps (if enabled) | %LocalAppData%\CrashDumps\WindowsTerminal*.dmp |
| Logs | ETW only (no file logs) |