A VS Code extension + native C++ wrapper that gives every VS Code instance its own separate taskbar button with a colored badge overlay — similar to how TortoiseGit marks Explorer windows.
Each workspace launched through the wrapper gets a unique Windows AppUserModelId (AUMID) and an isolated user-data directory, so Windows treats them as independent applications on the taskbar.
- Colored Badge Overlays — each workspace gets a deterministic color from a 64-color palette, or you can pick your own
- Badge Styles — circle, square, or rounded-square
- Badge Text — optional short label (e.g.
Pfor production,Dfor dev) - Per-Workspace Settings — configure
badgeColor,badgeText,badgeStyleat the workspace or folder level - Instance Isolation — the C++ wrapper creates a separate
--user-data-dirwith junctions so settings and extensions stay shared - Automatic AUMID — each workspace hash gets
VSCode.Workspace.<hash>, producing a separate taskbar button - Auto-apply on Startup — badge is applied within 100 ms of activation
- You place the compiled C++ wrapper (
code.exe) in your PATH instead of the real VS CodeCode.exe - The wrapper checks whether a real VS Code process is already running:
- No VS Code running → launches VS Code directly (passthrough), preserving the default AUMID and full jump list (Recent, Tasks)
- VS Code already running → launches an isolated instance with
--user-data-dir,--new-window, and a workspace-specific--app-user-model-id
- The VS Code extension activates in every instance, generates a colored badge PNG (via
sharp), and calls the wrapper's--set-overlaycommand to apply the badge viaITaskbarList3
This means the first window you open behaves exactly like stock VS Code — full jump list, recent files, pinned tasks. Every additional window launched through the wrapper gets its own taskbar button with a colored badge.
When you open a folder from the terminal, Start Menu, or "Open with Code" context menu, the wrapper intercepts the call, detects a running VS Code, and applies isolation automatically.
| First launch (no Code.exe running) | Subsequent launches |
| ---------------------------------- | --------------------- |
| Passthrough | Isolated launch |
| No --user-data-dir | --user-data-dir |
| No custom AUMID | --app-user-model-id |
| Full jump list | Separate button |
- Windows 10 or later
- VS Code 1.85 or later
- Install the extension from the VS Code Marketplace
- Badge overlays appear automatically — no additional setup needed
- For instance separation (separate taskbar buttons per workspace), run the command "Taskbar Separator: Install Wrapper" from the Command Palette (Ctrl+Shift+P), or accept the prompt shown on first activation
The install command copies the native wrapper to %APPDATA%\VSCode-TaskbarSeparator\, adds it to your user PATH, and patches VS Code shortcuts and "Open with Code" context menu entries.
Tip: If VS Code is pinned to the taskbar, unpin and re-pin it after installing the wrapper so the pin picks up the new shortcut target.
To reverse all changes, run "Taskbar Separator: Uninstall Wrapper" from the Command Palette.
# Build the extension
npm install
npm run compile
# Build the C++ wrapper
cd cpp
cmake -B build -G "Visual Studio 17 2022"
cmake --build build --config Release
# Output: cpp/build/Release/code.exeBuilding from source requires Node.js 16+, MSVC 2022, and CMake 3.10+.
When you run code . from a terminal, click VS Code in the Start Menu, or use "Open with Code" in Explorer, the wrapper intercepts the call, finds the real VS Code via the registry, and decides whether to pass through or isolate based on whether VS Code is already running.
Transparency: The wrapper passes all arguments through to the real
Code.exe. Isolation flags (--user-data-dir,--new-window,--app-user-model-id) are only added for secondary instances.
- Creates a per-workspace directory under
%APPDATA%\VSCode-TaskbarSeparator\workspaces\<hash>\ - Junctions
User/→%APPDATA%\Code\User(shared settings, keybindings, snippets) - Junctions
extensions/→%APPDATA%\Code\extensions(shared extensions) - Symlinks or copies
Local State(Chromium encryption key) - All other directories (Cache, logs, Session Storage, etc.) are fresh per-instance
- Cleans up non-persistent instance directories after VS Code exits
- Secondary instances have their own recent files and session state (not shared with the main instance)
- The first instance retains the default AUMID with full jump list support
- The wrapper's passthrough path does not wait for VS Code — it exits immediately
- The wrapper's isolated path waits for VS Code to exit before cleaning up the instance directory
Configure per-workspace in .vscode/settings.json or VS Code settings UI.
| Setting | Type | Default | Scope | Description |
|---|---|---|---|---|
taskbarSeparator.badgeColor |
string | "" (auto) |
resource | Badge color in #RRGGBB or #RRGGBBAA. Empty = auto-generated from workspace path |
taskbarSeparator.badgeStyle |
string | "circle" |
window | Badge shape: circle, square, rounded-square |
taskbarSeparator.badgeText |
string | "" |
resource | Optional text on badge (single character recommended) |
taskbarSeparator.badgeBadgeIconPath |
string | "" |
resource | Path to custom badge .ico file. Empty = generated badge |
Scope notes:
resourcesettings can be set per-folder in a multi-root workspacewindowsettings apply to the entire VS Code window
When badgeColor is empty (the default), the extension generates a deterministic color from the workspace path using FNV-1a hashing into a 64-color golden-angle palette. This means:
- The same workspace always gets the same color
- Different workspaces almost always get visibly distinct colors
- Colors include 80% alpha for a subtle overlay effect
Minimal — auto color:
{}No configuration needed. The extension auto-generates a deterministic color.
Custom color and label:
{
"taskbarSeparator.badgeColor": "#FF0000",
"taskbarSeparator.badgeStyle": "circle",
"taskbarSeparator.badgeText": "P"
}Rounded square with text:
{
"taskbarSeparator.badgeColor": "#3178C6",
"taskbarSeparator.badgeStyle": "rounded-square",
"taskbarSeparator.badgeText": "TS"
}| Command | Title |
|---|---|
taskbarSeparator.applyBadge |
Apply Taskbar Badge |
taskbarSeparator.removeBadge |
Remove Taskbar Badge |
taskbarSeparator.showSettings |
Open Taskbar Separator Settings |
taskbarSeparator.setupWrapper |
Install Wrapper (Instance Separation) |
taskbarSeparator.removeWrapper |
Uninstall Wrapper |
Access via Command Palette (Ctrl+Shift+P).
- Check the "Taskbar Separator" output channel (View → Output → select "Taskbar Separator") for error messages
- Ensure the C++ wrapper
code.exeis found — it should be in the extension'sbin/directory or%APPDATA%\VSCode-TaskbarSeparator\ - Verify the extension is active: Command Palette → "Apply Taskbar Badge"
- Ensure you launched VS Code through the wrapper, not directly
- Verify the
.icofile path exists and is readable - Use an absolute path or workspace-relative path
- Windows only — relies on Win32 APIs (
ITaskbarList3,IPropertyStore, junctions) - "New Window" not separated — VS Code's built-in "New Window" command spawns a process directly from its own binary, bypassing the wrapper. These windows stack with the main instance. Use the wrapper (terminal
code, Start Menu, or context menu) to open separate instances. - Jump list on secondary instances — secondary (isolated) instances have their own AUMID, so their taskbar context menu won't show the main instance's recent files. The first instance has full jump list support.
- Startup delay — badge generation via
sharpadds a brief delay (~100ms)
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Create a Pull Request
MIT - See LICENSE file for details
- Inspired by TortoiseGit taskbar icon separation
- Uses Sharp for image processing
If you encounter issues:
- Check the troubleshooting section
- Open an issue on the GitHub repository
- Include your OS version, PowerShell version, and the output from the "Taskbar Separator" output channel