Windows Setup

Windows Terminal Profiles: Custom Dev Environments Guide

Tech Setup5 min read
TS

Tech Setup

Published September 11, 2026 · Editorial policy

Windows Terminal Profiles: Custom Dev Environments Guide

Windows Terminal is arguably the best productivity tool Microsoft has shipped for developers in years. Yet, many Tier-1 engineers still use it out of the box with the default PowerShell profile, manually SSHing into remote boxes, activating virtual environments, or opening multiple windows for different projects.

The real power of Windows Terminal lies in its profiles configuration. By treating your terminal profiles as code, you can spin up isolated, context-aware development environments with a single keystroke.

In this guide, we will move past basic customization and look at how to architect advanced Windows Terminal profiles tailored for modern software engineering workflows.


Anatomy of a Windows Terminal Profile

Windows Terminal stores its configuration in a JSON file named settings.json. Every tab or pane you open is an instance of a "profile."

To access your settings, open Windows Terminal, press Ctrl+, (or click the dropdown arrow in the title bar and select Settings), and click the Open JSON file button in the bottom-left corner of the settings UI.

A profile object in the profiles.list array looks like this:

{
    "guid": "{07b52c9e-de8c-46ef-8285-a35919028888}",
    "name": "Node.js Backend",
    "commandline": "pwsh.exe -NoLogo",
    "startingDirectory": "C:\\Projects\\backend-api",
    "icon": "C:\\Icons\\node.png",
    "colorScheme": "One Half Dark",
    "font": {
        "face": "JetBrainsMono Nerd Font",
        "size": 11
    }
}

Key Properties to Master

  • guid: A unique identifier (UUID v4) for the profile. Generate a new one for every custom profile you create.
  • name: The display name shown in the dropdown menu.
  • commandline: The executable and arguments to run when the profile launches. This is your primary hook for setting up environments.
  • startingDirectory: Where the terminal drops you upon launch. Setting this to %USERPROFILE% or a specific repo path saves countless cd commands.
  • hidden: Set to true if you want to keep a profile defined without cluttering the UI dropdown.

Step 1: Setting Up Global Defaults

Before creating isolated project environments, clean up your global settings. Developers working on high-performance machines shouldn't waste vertical space or deal with sluggish rendering.

Navigate to the profiles.defaults object in your settings.json file. Any property defined here applies to all profiles unless explicitly overridden.

"profiles": {
    "defaults": {
        "font": {
            "face": "Cascadia Code PL",
            "size": 11,
            "weight": "SemiBold"
        },
        "cursorShape": "bar",
        "cursorBlink": true,
        "useAcrylic": false,
        "scrollbarState": "hidden",
        "padding": "12, 12, 12, 12"
    },
    "list": [
        // Your profiles go here
    ]
}
  • cursorShape: "bar": Essential for Vim users or anyone who prefers the standard IDE text cursor.
  • useAcrylic: false: Acrylic (transparency) looks modern, but it introduces GPU rendering overhead and can drop frames when scrolling through heavy build logs. Keep it disabled for maximum throughput.
  • scrollbarState: "hidden": Modern terminals rely on mouse wheels or keyboard shortcuts for scrolling. Hiding the scrollbar reclaims precious horizontal pixels.

Step 2: Crafting Context-Aware Dev Profiles

Let’s build three distinct, highly practical profiles that solve common Tier-1 developer bottlenecks:

  1. WSL 2 Ubuntu Engine (for Linux-first development).
  2. Isolated Kubernetes/Docker Admin Console.
  3. Client-Specific Secure SSH Gateway.

Profile 1: The WSL 2 Ubuntu Powerhouse

Most enterprise web development happens inside Linux. Instead of opening a generic WSL tab and navigating to your project, hardcode the distribution, starting directory, and startup script.

{
    "guid": "{2c4932d4-7b70-4f81-9b19-21c12345678a}",
    "name"
: "Ubuntu (Dev Workspace)",
    "commandline": "wsl.exe -d Ubuntu-22.04 --cd ~",
    "startingDirectory": "\\\\wsl.localhost\\Ubuntu-22.04\\home\\username\\projects",
    "colorScheme": "Campbell Powershell",
    "bellStyle": "none"
}

Pro Tip: Notice the UNC path used in startingDirectory (\\\\wsl.localhost\\...). Windows Terminal natively supports interacting directly with the WSL filesystem via standard Windows paths, allowing your file dialogs and IDE integrations to hook in seamlessly.

Profile 2: The Isolated Kubernetes Admin Console

If you manage multiple clusters, you want a terminal profile that automatically sets your KUBECONFIG environment variable, opens on a specific administrative namespace, and changes the color scheme so you immediately know you are in a production-adjacent environment.

{
    "guid": "{9d8123ef-456a-4871-bcde-9876543210ab}",
    "name": "K8s Prod - Us-East-1",
    "commandline": "pwsh.exe -NoLogo -Command \"$env:KUBECONFIG='C:\\Users\\Dev\\.kube\\configs\\prod-us-east.yaml'; kubectl config use-context prod-cluster; cls\"",
    "startingDirectory": "C:\\Infrastructure",
    "colorScheme": "Vintage",
    "tabTitle": "⚠️ PROD K8s"
}

By leveraging PowerShell (pwsh.exe) within the commandline property, you can chain initialization commands before handing control over to the developer.

Profile 3: The Dedicated SSH Jumpbox

Stop typing ssh user@jumpbox.internal -i ~/.ssh/id_rsa every morning. Bake the connection directly into a profile.

{
    "guid": "{4e567890-ab12-34ef-5678-90abcdef1234}",
    "name": "AWS Jumpbox",
    "commandline": "ssh -i C:\\Users\\Dev\\.ssh\\jumpbox_rsa ubuntu@ec2-54-213-42-11.compute-1.amazonaws.com",
    "colorScheme": "One Half Dark",
    "tabTitle": "AWS-Jump"
}

When you close the SSH session (exit), Windows Terminal can automatically close the tab by adding "closeOnExit": true to this specific profile object.


Step 3: Advanced Color Schemes and Visual Cues

Context switching is a developer's primary cognitive tax. If you have five tabs open (Local Frontend, Local Backend, Staging SSH, Production Logs, and Database CLI), executing a destructive command in the wrong tab can ruin your day.

Use color schemes to establish visual safety boundaries.

Add custom color schemes to the schemes array in your settings.json:

"schemes": [
    {
        "name": "Danger Zone (Prod)",
        "black": "#000000",
        "red": "#ff5555",
        "green": "#50fa7b",
        "yellow": "#f1fa8c",
        "blue": "#bd93f9",
        "purple": "#ff79c6",
        "cyan": "#8be9fd",
        "white": "#bbbbbb",
        "brightBlack": "#555555",
        "brightRed": "#ff6e6e",
        "brightGreen": "#69ff94",
        "brightYellow": "#ffffa5",
        "brightBlue": "#d6acff",
        "brightPurple": "#ff92df",
        "brightCyan": "#a4ffff",
        "brightWhite": "#ffffff",
        "background": "#2a0808", // Deep reddish-black warning background
        "foreground": "#f8f8f2"
    }
]

Reference this scheme in any high-risk profile using "colorScheme": "Danger Zone (Prod)". Your brain will immediately recognize the altered background color before you hit Enter.


Step 4: Keybindings for Rapid Environment Swapping

Profiles are useless if you have to click through three menus to reach them. You need custom keybindings to launch your most-used environments instantly.

Scroll down to the actions array in your settings.json and map your profiles to memorable hotkeys.

"actions": [
    {
        "command": {
            "action": "newTab",
            "profile": "Node.js Backend"
        },
        "keys": "ctrl+shift+n"
    },
    {
        "command": {
            "action": "newTab",
            "profile": "Ubuntu (Dev Workspace)"
        },
        "keys": "ctrl+shift+u"
    },
    {
        "command": {
            "action": "splitPane",
            "split": "auto",
            "profile": "AWS Jumpbox"
        },
        "keys": "alt+shift+j"
    }
]

Useful Keybinding Combinations for Devs

  • ctrl+shift+n: Opens your primary backend profile in a new tab.
  • alt+shift+j: Splits the current pane automatically, launching an SSH jumpbox side-by-side with your working code.
  • ctrl+alt+up/down/left/right: Navigate between split panes without taking your hands off the keyboard.

Step 5: Automating Multi-Pane Layouts on Startup

Why open profiles one by one when you can launch an entire multi-pane development layout with a single command or shortcut?

Windows Terminal supports Startup Actions. You can configure your terminal to open a specific layout every time you cold-boot the application.

Add or edit the startupActions property at the root level of your settings.json:

{
    "startupActions": "new-tab -p \"Ubuntu (Dev Workspace)\" ; split-pane -p \"Node.js Backend\" -H"
}

Breaking Down the Command:

  • new-tab -p "...": Creates an initial tab using the specified profile name.
  • ;: Chains commands sequentially.
  • split-pane -p "..." -H: Splits the current window horizontally (-H) or vertically (-V) and loads a second profile into the new pane.

If your standard morning routine involves opening an editor tab, a database log tail, and a server monitor, codify it into a single startup string.


Summary Checklist for Tier-1 Setup

  1. Isolate Configs: Keep project directories explicitly mapped in startingDirectory.
  2. Visual Safety: Use distinct colorSchemes for production, staging, and local environments to prevent catastrophic command execution.
  3. Command Chaining: Utilize the commandline property to run pre-flight environment variables (like KUBECONFIG or AWS_PROFILE) before dropping into the shell.
  4. Muscle Memory: Bind heavy-use profiles to ctrl+shift+[key] shortcuts.

By treating your terminal configuration as an extension of your codebase, you eliminate micro-friction from your daily routine, keeping your focus where it belongs: writing clean, production-grade software.