# Windows Terminal A series of 4 article(s), in reading order. # Windows Terminal > A complete guide to Windows Terminal. Discover how to install, customize profiles, use backgrounds, and configure settings for WSL, Docker, and multi-tab startup actions. --- ![Windows Terminal](/img/v2/windows_terminal_tips.webp) **TL;DR** This article covers customizing Windows Terminal through its `settings.json`: setting a background image per profile, adding a new profile to open a shell inside a specific WSL distribution or Docker container, setting the default profile and starting directory, and using `startupActions` to automatically open multiple tabs (e.g. Ubuntu plus a DOS prompt) on launch. For people who like working in a console, Windows Terminal can be seen as a successor of the old DOS console; you know the *black screen* where you can type commands like `dir` or `mkdir`. Windows Terminal is a multi-tab software so instead of having multiple windows, you just have multiple tabs but the killer feature for me is the possibility to have a DOS console in one tab, a Powershell one in a second tab, one or more tabs for Linux and, why not, [a tab for an SSH connection](/blog/windows-terminal-ssh-profile). And instead of tabs, you can also display several consoles side by side; see [Windows Terminal - Split Panes](/blog/windows-terminal-split-panes). And that feature is really comfortable! Using the same window, you can have multiple active consoles and f.i. share your Linux history between tabs. Pretty cool! ## Customize your profile On my computer this is how my Ubuntu console looks like. I'm using Windows Terminal and [PowerLevel10k](/blog/powerlevel10k_sandbox): ![Windows Terminal with an Ubuntu console](./images/windows_terminal.webp) But to make the interface geekier, I'm using a wallpaper instead of, just, a black screen. If you want to, proceed like this: 1. Click on the `+` button and choose `settings` 2. 3. In the opened editor, unfold the `list` of `profiles` and retrieve the one you wish to customize (in my case `Ubuntu`) In my case, my profile has these settings: **settings.json** ```json { "backgroundImage": "c:/Users/Christophe/Backgrounds/ubuntu.jpg", "backgroundImageOpacity": 0.3, "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}", "hidden": false, "name": "Ubuntu", "source": "Windows.Terminal.Wsl", "startingDirectory": "\\\\wsl$\\Ubuntu\\home\\christophe\\repositories", "tabTitle": "Ubuntu" } ``` As you can see, I've downloaded some nice background picture and saved it in my `Backgrounds` folder then I use Linux notation to refer it. ## Installation Windows Terminal is part of Windows 11, so you already have it if you're running that OS. If you're running an older version of Windows, you can install Windows Terminal using the Windows Store, or, a third possibility, if you can't, you can download [the latest release from GitHub](https://github.com/microsoft/terminal/releases). ## Add a new profile To add a new profile, let's say a console inside one of your Docker containers (yes! it's possible), see the `list` array in the JSON content: just copy/paste a profile to use it for your newer one. For example, I'll create a new profile so I can immediately open my blog in a Docker container (since, of course, my blog has his Docker image): **settings.json** ```json { "profiles": { "list": [ { "commandline": "wsl.exe -d Ubuntu docker-compose exec docusaurus /bin/sh", "backgroundImage": "c:/Users/Christophe/Backgrounds/blog.jpg", "backgroundImageOpacity": 0.3, "tabColor": "#2496ED", "guid": "{d77a8e47-3017-4745-9300-d338d849ee20}", "icon": "ms-appdata:///roaming/pen.png", "name": "Docker - Blog", "startingDirectory": "\\\\wsl$\\Ubuntu\\home\\christophe\\repositories\\blog" } ] } } ``` > **Your settings:** > > * `commandline`: to start a Linux subsystem, start your command by `wsl.exe -d` followed by the distribution name like `wsl.exe -d Debian` f.i. Of course, that distribution needs to be on your machine. You can complete the command line by a parameter: the command to run on the startup like, f.i. `docker-compose` or `ls` or anything else. > * `backgroundImage`: Optional. You should type here, in a Linux notation, the path to where you've saved the image to use for the background, > * `backgroundImageOpacity`: Optional. Between `0` and `1`; in fact, it'll depend on the image you'll choose, > * `guid`: You should, every time, generate a new GUID. To do this, just run `uuidgen` in a Linux console, then copy/paste the obtained value inside `{...}`, > * `icon`: Optional. In order to customize the icon, grab any icon from the Internet and save the image in the `%USERPROFILE%\AppData\Local\Packages\Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe\RoamingState` folder. The notation to use then is `ms-appdata:///roaming/your_image_name.png` ![The blog profile](./images/blog.webp) ![The blog console](./images/blog_opened.webp) ## Set the default profile Take a look at the list of profiles defined in your `settings.json` file, each profile has its own `guid`. Just copy/paste the guid of the profile of your choice to the `defaultProfile` root node. ## Set the default folder for Ubuntu Directly opening the desired directory is done by setting the `startingDirectory` node in a profile. Let's say we wish to open the user home folder by starting a new Ubuntu shell: **settings.json** ```json { "profiles": { "list": [ { "name": "Ubuntu", "source": "Windows.Terminal.Wsl", "startingDirectory": "\\\\wsl$\\Ubuntu\\home\\christophe\\" } ] } } ``` You just need to specify the `startingDirectory` node and set it to `\\wsl$\Ubuntu\home\christophe\` ## Open multiple tabs during the startup process Windows Terminal has a `startupActions` property which allows you to specify actions to be performed during the startup process. Let's imagine I wish to launch two tabs; the default one (nothing to foresee) and a second tab. To make things easier to maintain, I'll use a profile: **settings.json** ```json "startupActions": "; new-tab --profile \"DOS Command Prompt\"", ``` So now I need to create a profile called `DOS Command Prompt`: **settings.json** ```json { "profiles": { "list": [ { "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", "hidden": false, "name": "DOS Command Prompt" }, ] } } ``` And tadaaa, now by starting Windows Terminal, my default terminal will be open (Ubuntu in my case) and, in a second tab, I'll also open a DOS console. ## Going further This covers the basics, but Windows Terminal has much more to offer. I've written dedicated, deeper-dive articles on a few of these topics: [using a background image](/blog/windows-terminal-background), [splitting a window into several panes](/blog/windows-terminal-split-panes), and [adding a one-click SSH profile](/blog/windows-terminal-ssh-profile). --- # Use a background image in your Windows Terminal console > Customize your Windows Terminal! Follow this simple, step-by-step guide to set a cool background image in your console and ditch the old, boring black screen. --- ![Use a background image in your Windows Terminal console](/img/v2/windows_terminal_customization.webp) **TL;DR** Tired of the boring black console? This quick guide shows you how to easily customize your Windows Terminal by setting a background image. Follow a few simple steps to navigate the settings, choose your favorite image, and adjust its appearance to give your terminal a fresh, personalized look. If we're talking about the MS DOS console, everyone has in mind a very austere black screen with a fixed-width font. The display was monochrome, white on black. Not very sexy nor exciting, is it. Fortunately, we're no longer in the 1980s and 2000s, and since then, even under Windows, we've been able to do so much more cooooool! Let's see how to easily do things like this: ![My console](./images/console.webp) Here's the result: ![Nice no?](./images/full_image.webp) I'm using [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701); a free tool coming from Microsoft. I really like it because just like a web browser, I can work with tabs. One of the most powerful things is we can use it for the old Windows Command prompt (MS Dos), for Powershell, for Linux (Ubuntu, Debian, ...), for [SSH terminal](/blog/windows-terminal-ssh-profile) and much more. *The [Windows Terminal](/blog/windows-terminal) article covers profiles and `settings.json` in general; here we only look at the appearance.* But, for this article, let's concentrate on the appearance of the terminal. First, let's generate (using [Recraft.ai](/blog/ai-image-generation) f.i.) a nice image or go to [unsplash.com](https://unsplash.com/) if you want to reuse an existing one. Click on this link to download the [JackJack background image](./images/wallpaper.webp), the meerkat. Start an instance of Windows Terminal and, as illustrated on the image below, click on the down arrow and select `Settings`. ![Accessing the settings page](./images/settings.webp) On the left side, select your desired profile then on the right side, scroll down until you see the `Appearance` accordion and click on it. Scroll down until the background image area then click on `Background image path`. Click on the `Browse` button and retrieve your geeky background image. Click on the `Save` button and voilà! You can also, for sure, have two tabs: one with a console and the second one with the Settings page opened so, from now, by updating a setting like the `Background image -> Background image opacity` or the `Transparency -> Background opacity` you can see the changes immediately on your first tab — the same result already shown at the top of this article. That was for the background image. If you wish to learn how I did for the global look\&feel, I'm using Powerlevel 10k: read my previous [Customize your Linux prompt with Powerlevel 10k](/blog/powerlevel10k_sandbox) blog post. Looking for more Windows Terminal customization? See my articles on [splitting the window into several panes](/blog/windows-terminal-split-panes) and [adding a one-click SSH profile](/blog/windows-terminal-ssh-profile). --- # Windows Terminal - Split Panes > Learn how to split panes in Windows Terminal for efficient multitasking; shortcuts, configuration tips, and workflow examples. --- ![Windows Terminal - Split Panes](/img/v2/windows_terminal_splitted_panes.webp) **TL;DR** This article demonstrates how to configure Windows Terminal for efficient multitasking using split panes. It details two methods: hardcoding command lines within new profiles or reusing existing, potentially hidden, profiles to build complex workspace layouts. The guide also covers useful keyboard shortcuts, pane zooming, and broadcasting input to multiple panes simultaneously. In this article, we'll show how to create a Windows Terminal profile with three (or more) split panes so you can monitor multiple consoles at the same time. I often need this when working on a large project composed of several repositories: a backend application, a consumer application, a shared library, and a proof-of-concept that ties them all together. Instead of opening separate terminal windows, I prefer a single window with split panes. This also lets me run the same command in all panes (for example, to run tests), monitor logs, or push changes to Git—all from one window. And when I need to focus on one pane, I can zoom in on it and hide the others temporarily. We'll use Windows Terminal. It ships with Windows 10 and later and is the default terminal for Windows. If you don't have it, you can download it here: [Windows Terminal on Microsoft Store](https://www.microsoft.com/store/productId/9N0DX20HK701). If you're not yet familiar with profiles and `settings.json`, my [Windows Terminal](/blog/windows-terminal) introduction is a good starting point. *Two other profile tricks worth combining with panes: [Windows Terminal - Adding a SSH profile](/blog/windows-terminal-ssh-profile), so one of your panes opens straight on a remote server, and [Use a background image in your Windows Terminal console](/blog/windows-terminal-background) to tell your panes apart at a glance.* There are two approaches: 1. We can "hardcode" the command line. 2. We can reuse existing profiles. Let's see both. ## Open Windows Terminal Settings The first step is to open the Windows Terminal settings. You can use one of these methods: 1. Click the `+` button to open a new tab, then select **Settings** from the dropdown menu. 2. Press `Ctrl + ,` in Windows Terminal. 3. Right-click the title bar and select **Settings**. 4. Run `wt -p` from PowerShell or CMD. ![Getting access to Windows Terminal Settings](./images/windows_terminal_access_to_settings.webp) In the **bottom-left** corner, click **Open JSON file**. This will open the `settings.json` file in your default editor (for example, VS Code). ![Open JSON file link](./images/windows_terminal_open_json_file.webp) ## Create a new profile and hardcode the command line Inside `settings.json`, add a new profile object to the `profiles.list` array. Copy and paste the code below as a new entry in the `list` array, adjusting it to your needs (profile name, icon, command line, etc.). ```json { "name": "My complex project - Workspace", "icon": "🐍", "commandline": "wt.exe nt -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_1 ; sp -H -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_2 ; sp -V -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_3", "hidden": false }, ``` > **-p 'Ubuntu 24.04':** > > In the suggested command line above, I've used `-p "Ubuntu 24.04"` because that is the name of an existing profile in my Windows Terminal. You will likely use something else. This will create a new profile named `My complex project - Workspace` with three split panes, each running a different WSL Ubuntu instance in a specific directory (project\_1, project\_2, project\_3). Go back to Windows Terminal, display the list of profiles, and you will see the new one. Click it to start. > **Due to the use of the `wt.exe nt` command, Windows Terminal will open a new window with the specified layout.:** The first pane will be the main one, and the other two will be split horizontally and vertically, as illustrated below. ![Three panes in Windows Terminal](./images/windows_terminal_three_splitted_panes.webp) If you need four panes, you can add another `sp` command in the `commandline` property. ```json { "name": "My complex project - Workspace", "icon": "🐍", "commandline": "wt.exe nt -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_1 ; sp -H -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_2 ; sp -V -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_3 ; sp -V -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_4", "hidden": false } ``` ![Four panes in Windows Terminal](./images/windows_terminal_four_splitted_panes.webp) Or, if you want a layout with the screen divided into four quadrants (two on top and two at the bottom), you can use this command line: ```json { "name": "My complex project - Workspace", "icon": "🐍", "commandline": "wt.exe nt -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_1 ; sp -H -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_3 ; sp -V -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_4 ; mf up ; sp -V -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_2", "hidden": false } ``` ![Four panes in a grid Windows Terminal](./images/windows_terminal_four_splitted_panes_grid.webp) If you prefer a vertical layout: ```json { "name": "My complex project - Workspace", "icon": "🐍", "commandline": "wt.exe nt -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_1 ; sp -V -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_2 ; mf left ; sp -H -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_3 ; mf right ; sp -H -p \"Ubuntu 24.04\" wsl.exe -d Ubuntu-24.04 --cd ~/repositories/project_4", "hidden": false }, ``` ![Vertical four panes in Windows Terminal](./images/windows_terminal_vertical_four_splitted_panes.webp) There are many ways to create layouts—see the full `wt` command reference here: [Windows Terminal Command Line Arguments](https://learn.microsoft.com/en-us/windows/terminal/command-line-arguments?tabs=windows). ## Create a workspace profile and reuse existing profiles As you can see, using a hard-coded command line quickly becomes complex to maintain. We can do better by reusing existing profiles. In the example below, I'm creating six profiles, one for each subproject. In each profile, I'm setting the working directory (see the `commandline` attribute) and a specific background (image, opacity, and stretch mode — see [Use a background image in your Windows Terminal console](/blog/windows-terminal-background) if you want more details on these properties). Then, I will set the `hidden` attribute to `true` so the profile will not be displayed in the list of profiles. ```json { "name": "Core API", "commandline": "wsl.exe -d Ubuntu-24.04 --cd ~/repositories/core-api", "tabTitle": "Core API", "hidden": true, "backgroundImage": "c:/Users/Christophe/backgrounds/core_api.jpg", "backgroundImageOpacity": 1, "backgroundImageStretchMode": "fill", "guid": "{ab98421f-2e2e-4ae0-9065-5385ee28c930}" }, { "name": "Facade", "commandline": "wsl.exe -d Ubuntu-24.04 --cd ~/repositories/facade", "hidden": true, "tabTitle": "Facade", "backgroundImage": "c:/Users/Christophe/backgrounds/facade.jpg", "backgroundImageOpacity": 1, "backgroundImageStretchMode": "fill", "guid": "{c2f1edf0-a7c6-427e-bc29-f74549363ec7}" }, { "name": "POC Facade", "commandline": "wsl.exe -d Ubuntu-24.04 --cd ~/repositories/poc-facade", "tabTitle": "POC Facade", "hidden": true, "backgroundImage": "c:/Users/Christophe/backgrounds/poc_facade.jpg", "backgroundImageOpacity": 1, "backgroundImageStretchMode": "fill", "guid": "{1b82632f-68a2-4611-b03e-ff0d0ff2ff08}" }, { "name": "Shared Lib", "commandline": "wsl.exe -d Ubuntu-24.04 --cd ~/repositories/shared", "tabTitle": "Shared Lib", "hidden": true, "backgroundImage": "c:/Users/Christophe/backgrounds/shared_lib.jpg", "backgroundImageOpacity": 1, "backgroundImageStretchMode": "fill", "guid": "{71b426b6-6404-4e12-a549-4546f59683e7}" }, { "name": "API Runtime", "commandline": "wsl.exe -d Ubuntu-24.04 --cd ~/repositories/api-runtime", "tabTitle": "API Runtime", "hidden": true, "backgroundImage": "c:/Users/Christophe/backgrounds/api_runtime.jpg", "backgroundImageOpacity": 1, "backgroundImageStretchMode": "fill", "guid": "{c2a595be-9ae2-4038-9f59-a3d4e60eeb4c}" }, { "name": "POC Databases", "commandline": "wsl.exe -d Ubuntu-24.04 --cd ~/repositories/poc-databases", "tabTitle": "POC Databases", "hidden": true, "backgroundImage": "c:/Users/Christophe/backgrounds/poc_databases.jpg", "backgroundImageOpacity": 1, "backgroundImageStretchMode": "fill", "guid": "{3b64affc-5130-441c-9653-1e25d78f3209}" }, ``` > **GUID is no longer needed in newer versions of Windows Terminal:** > > In the code above, I've used a legacy one for illustration. I've kept the `guid` attribute because older versions of Windows Terminal require it. > > If you have a recent version, you can drop the `guid` line; it is no longer required. > > If you need to specify that attribute and are wondering *How can I generate a GUID string?*, there is a Linux command for that. Simply type `uuidgen` in your console. Each time you run it, you will get a new, valid GUID. Okay, that was to define profiles I will reuse in my workspace. Now, add this final profile: ```json { "name": "My complex project - Workspace", "icon": "🐍", "commandline": "wt.exe nt -p \"Core API\" ; sp -H -p \"Shared Lib\" ; sp -V -p \"API Runtime\" ; sp -V -p \"POC Databases\" ; mf up ; sp -V -p \"Facade\" ; sp -V -p \"POC Facade\"", "guid": "{521ac4e0-056d-460c-b2b4-69dd727c8836}" }, ``` If you save this file and go back to Windows Terminal, clicking the `+` button will display the list of profiles: ![The workspace in Windows Terminal](./images/windows_terminal_workspace.webp) By clicking on it, you will now have a new terminal with 6 different panes, each clearly identified by its background image: ![Having up to six profiles](./images/windows_terminal_six_profiles.webp) **Bonus** ### Toggle zoom for a pane This one is my favorite. You can zoom in and out of a pane by pressing `Ctrl` + `Shift` + `P` and then selecting **Toggle pane zoom**. Repeat the action to restore the view. This is very useful when you want to focus on a specific pane without closing the others. ### Keyboard shortcuts to manage panes Here is a list of useful keyboard shortcuts to manage panes in Windows Terminal: > **`+` and `-` refer to the keys on the main keyboard, not the numeric keypad.:** **Pane shortcuts** * * * * ### Control panel actions You can broadcast input to all panes by toggling the **Toggle broadcast input to all panes** option from the **Command Palette** menu (which you can open by pressing `Ctrl` + `Shift` + `P`). So, toggle this option, and you will see the cursor change to indicate that broadcasting is active. Now, whatever you type in one pane will be sent to all panes. ![Broadcast input to all panes](./images/panes_broadcasting.gif) Toggle the option again to disable broadcasting. For example, you can clear the screen in all panes at once by typing `clear`, or you could push your changes to Git in all repositories by typing `git add . && git commit -m 'wip' && git push` just once. --- # Windows Terminal - Adding a SSH profile > Adding a SSH profile to Windows Terminal to quickly connect to your servers without typing the full SSH command each time. --- ![Windows Terminal - Adding a SSH profile](/img/v2/adding_ssh_profile_to_windows_terminal.webp) **TL;DR** This guide demonstrates how to streamline server connections by creating a dedicated SSH profile directly within the Windows Terminal settings. Users simply need to add a new empty profile, configure the command line with their specific SSH instruction, and optionally customize the appearance with icons or background images. This setup enables immediate access to remote servers through the Terminal dropdown menu, eliminating the need to manually type connection commands. In this article, we'll see how to create a new SSH profile in [Windows Terminal](/blog/windows-terminal) so we no longer even need to remember how to connect to the server; we just need to open the profile and that's all. For illustration purposes, I'll use my hosting server at PlanetHoster, but you can use the same technique for any SSH server you want to connect to. ## The Result Once the profile is created (covered below), connecting to the server is one click from the dropdown menu next to the `+` button: ![The new SSH profile in Windows Terminal](./images/windows_terminal_ssh_profile.webp) Select it, and a new console opens, already connected via SSH. ## Why It Works * No more retyping the `ssh planethoster` command — the profile carries it for you. * The server is reachable straight from the Terminal dropdown menu, alongside your other profiles. * Fully customizable — an icon, a background image, its own color scheme, whatever helps you spot it at a glance. ## Installation ### Open Windows Terminal Settings To open the Windows Terminal settings, you can use the following methods: 1. Click on the `+` button to open a new tab, then select "Settings" from the dropdown menu. 2. Press `Ctrl + ,` while in Windows Terminal. 3. Right-click on the title bar and select "Settings". 4. Use the command `wt -p` in PowerShell or CMD. ![Getting access to Windows Terminal Settings](./images/windows_terminal_access_to_settings.webp) ### Add a profile for any SSH connection In a recent article, we've seen how to create an SSH profile and be able to run a command like `ssh planethoster` (or anything else). If you missed it, please read [How to connect to your hosting server using SSH](/blog/connect-using-ssh-to-your-hosting-server). So, right now, to connect to your hosting server, you only need to run `ssh planethoster` in a Windows Terminal console (PowerShell, CMD or WSL). Let's see how to create a Windows Terminal profile that will directly open a console connected to your hosting server: 1. Open the Settings of Windows Terminal, 2. In the left menu, select "Add a new profile", 3. Click on "New empty profile", 4. In the "Name" field, type "SSH - PlanetHoster" (or anything else you want), 5. In the "Command line" field, type `ssh planethoster` (or the alias you defined in your `~/.ssh/config` file), 6. Optionally, choose an icon for your profile by clicking on the "Browse" button or paste here an emoji like "⚡", 7. Finally, click on the "Save" button at the bottom right. The change is immediate: by clicking on the down arrow next to the `+` button, you'll see your new profile — exactly the result shown at the top of this article. ## More Demos ### Adding a background image (optional) Go back to the Settings, select your newly created profile (`SSH - PlanetHoster` in our example) and scroll down to the "Appearance" section and click on it to expand it. In the "Background image path" field, click on the "Browse" button and select an image file on your computer (for example a `.jpg` or a `.webp` file). Adjust any other settings you want (for example the "Background image opacity" slider to make the image more or less visible). Click on the "Save" button at the bottom right. ![The SSH profile with a background image](./images/windows_terminal_ssh_profile_with_background.webp) ## Conclusion From now on, whenever you want to connect to your hosting server, just open Windows Terminal and select your SSH profile. A new console will open, automatically connected to your server via SSH. Close the console to end the session when you're done. Additionally, pay attention to any other settings you can customize in the profile, such as font size, color scheme, and more, to enhance your experience. You can also define the home directory to open when the profile starts. Want to go further? Combine this SSH profile with [split panes](/blog/windows-terminal-split-panes) to monitor several remote servers side by side in a single window. ---