DPMux Docs
Everything you need to install, customize, and automate DPMux.
Install
- Download DPMuxSetup.exe (~110 KB).
- Run it. The installer downloads the latest release, verifies its SHA-256, and installs
to
%LOCALAPPDATA%\DPMux— per-user, no administrator prompt, no wizard. - DPMux launches automatically with Start-menu and Desktop shortcuts created, and the
dpmuxcommand available in any new terminal.
Requirements: Windows 10/11, x64. SmartScreen may warn on first run because the installer is not code-signed — choose More info → Run anyway.
# silent install / scripted install
> DPMuxSetup.exe --silent
# install from a different update channel
> DPMuxSetup.exe --url https://example.com/latest.json
Updates
DPMux updates itself like a browser: it checks the update channel on launch and every 4 hours, downloads new versions in the background, verifies them, and stages them next to the running version. When an update is ready you'll see a "Restart to update" toast — or apply it yourself:
> dpmux check-updates # check + download now
> dpmux update-status # idle | downloading | ready | uptodate ...
> dpmux update-restart # apply a staged update
Versions install side by side (app-1.0.1, app-1.0.2, …); the previous
version is kept so a bad update can be rolled back by deleting the newest folder. Set
DPMUX_UPDATE_URL to point an install at a different channel.
Workspaces, panes & surfaces
- Workspaces are the items in the left sidebar — one per task. Each shows its live title, a preview of recent output, working directories, an optional status pill and progress bar, and a notification ring when something needs you.
- Groups are named collections of workspaces — switch with the header dropdown.
- Panes split a workspace into tiles (right/down/left/up, drag the dividers to resize). Splitting never restarts the shells already running.
- Surfaces are tabs inside a pane — each one a terminal or a browser. Close the last surface and the pane closes; close the last pane and the workspace closes.
Sessions are restored on restart: layout, titles, working directories, and browser URLs come back (shells restart fresh — scrollback isn't checkpointed).
Keyboard shortcuts
Defaults below — every one is rebindable. Plain Ctrl combos still reach the shell (Ctrl+R history search etc.), matching Windows Terminal conventions.
| Action | Shortcut |
|---|---|
| New workspace | Ctrl+Shift+T |
| Close surface / pane / workspace | Ctrl+Shift+W |
| Split right / down | Ctrl+Shift+D / Ctrl+Shift+E |
| New browser surface | Ctrl+Shift+L |
| Next / previous workspace | Ctrl+Tab / Ctrl+Shift+Tab |
| Jump to workspace 1–9 | Ctrl+Alt+1…9 |
| Focus pane directionally | Alt+←↑↓→ |
| Resize pane | Ctrl+Shift+←↑↓→ |
| Find in terminal | Ctrl+Shift+F |
| Command palette | Ctrl+Shift+P |
| Toggle sidebar | Ctrl+Shift+B |
| New group | Ctrl+Shift+N |
| Rename workspace | Ctrl+Shift+R |
| Copy / paste | Ctrl+Shift+C / Ctrl+Shift+V (right-click pastes) |
| Font zoom | Ctrl+= / Ctrl+- / Ctrl+0 |
| Fullscreen | F11 |
Pane resize and font zoom need a terminal focused — while a browser pane has focus those keys belong to the page.
Configuration
Everything lives in %APPDATA%\DPMux\settings.json (create it via the command
palette: Open settings file). Changes are hot-reloaded — save the file and the app
re-themes live. Kebab-case keys, Ghostty-style:
{
"theme": "catppuccin-mocha",
"font-family": "JetBrains Mono",
"font-size": 14,
"line-height": 1.2,
"cursor-style": "bar", // block | bar | underline
"cursor-blink": true,
"scrollback-lines": 50000,
"window-padding-x": 10,
"window-padding-y": 8,
"background": "#11111b",
"accent-color": "#89b4fa",
"palette": { "1": "#ff5555" },
"keybind": ["ctrl+shift+o=split-right", "ctrl+shift+w=unbind"],
"shell": "pwsh.exe",
"shell-args": ["-NoLogo"],
"working-directory": "D:\\projects"
}
Layering, later wins: defaults → your Ghostty config → settings.json →
DPMUX_PIPE/DPMUX_SHELL env vars. Inspect the result with
dpmux get-config; force a reload with dpmux reload-config.
pipe-name changes need a restart; everything else applies live.
Themes & colors
Built-in themes: tokyo-night (default), catppuccin-mocha,
dracula, gruvbox-dark, nord, one-dark.
Names match Ghostty's, so a Ghostty theme = line maps directly.
Override any part of a theme with background, foreground,
cursor-color, selection-background, accent-color (the UI
accent: rings, selection, progress bars), and per-slot ANSI colors via palette
(indexes 0–15, object or 16-element array).
Custom keybinds
Ghostty syntax — "combo=action" entries in the keybind array. Later
entries win; unbind removes a default.
"keybind": [
"ctrl+shift+o=split-right",
"f5=reload-config",
"ctrl+shift+w=unbind"
]
Actions: new-workspace, close-surface,
split-right/down/left/up, new-browser-surface, command-palette,
find, toggle-sidebar, new-group, rename-workspace,
next-workspace, previous-workspace, workspace-1…workspace-9,
focus-pane-left/right/up/down, resize-pane-left/right/up/down, copy,
paste, zoom-in/out/reset, fullscreen, reload-config,
unbind.
Combo syntax: modifiers ctrl, alt, shift,
meta/win; keys like t, f5, left,
esc, plus, page_up.
Ghostty config inheritance
If ~/.config/ghostty/config (or %APPDATA%\ghostty\config) exists,
DPMux reads its appearance keys automatically: font-family (repeats become a
fallback list), font-size, theme, background,
foreground, cursor-color, cursor-style,
cursor-style-blink, selection-background, window-padding-x/y,
and palette = N=#rrggbb lines. Ghostty keybind lines are not
imported (different action names). Opt out with "use-ghostty-config": false.
The dpmux CLI
Installed automatically (since 1.0.3) — open any terminal and run dpmux. Inside a
DPMux terminal, commands target the calling workspace/surface by default, so a script or agent
can address its own tab without ids. Outside, they target the active workspace, or use
--workspace/--pane/--surface with an id, title, or 1-based index.
# set up a labelled dev workspace with a browser beside it
> dpmux new-workspace --title "dev server" --cwd D:\proj --command "npm run dev"
> dpmux split-pane --dir right --url http://localhost:3000
# type into terminals, read what they printed
> dpmux send-text "git status" --workspace "dev server"
> dpmux capture-pane --lines 50
# everything responds with JSON when you add --json
> dpmux list-workspaces --all --json
dpmux help prints full usage; dpmux capabilities lists every command
the app accepts, including tmux-compat aliases (new-window, send-keys,
kill-pane, capture-pane, …).
Command reference
| Area | Commands |
|---|---|
| Workspaces | list-workspaces current-workspace new-workspace close-workspace rename-workspace focus-workspace move-workspace mark-read mark-unread set-status set-progress |
| Groups | list-groups new-group rename-group focus-group close-group |
| Panes | list-panes split-pane close-pane focus-pane resize-pane flash-pane |
| Surfaces | list-surfaces new-surface close-surface focus-surface respawn |
| Terminal I/O | send-text send-keys capture-pane |
| Notifications | notify notification-list notification-clear |
| Browser | navigate browser-back browser-forward browser-reload browser-eval browser-screenshot |
| App | ping version capabilities dump activate screenshot events get-config reload-config check-updates update-status update-restart |
Under the hood this is a named pipe (\\.\pipe\dpmux-<user>) speaking JSON
lines — {"id":1,"cmd":"new-workspace","args":{…}} — so any language can drive DPMux
directly. dpmux events subscribes the connection to a live event stream
(notification.created, workspace.created, …). Socket commands never steal
focus unless you pass --focus.
Notification rings
Rings are explicit — DPMux never guesses from output. Trigger them three ways:
1. From the CLI (or an agent hook)
> dpmux notify --title build "tests are green — ready for review"
2. With escape sequences from any program
# OSC 9 (simple), OSC 777 (title + body), OSC 99 (kitty) all work
> printf '\x1b]9;build finished\x07'
> printf '\x1b]777;notify;Build;tests are green\x07'
3. From PowerShell
> Write-Host "`e]9;deploy needs approval`a" -NoNewline
Effects: pulsing ring + unread marker on the workspace, a blue flash on the originating
pane, the message shown under the workspace title, plus a desktop notification and taskbar
flash when the window is in the background. Everything clears when you view the workspace.
Add sidebar status with dpmux set-status "deploying" --color "#9ece6a" and
dpmux set-progress 0.7.
Browser panes
Any pane can hold browser surfaces (Ctrl+Shift+L, or split-pane --url …).
They're full Chromium webviews: address bar with search, back/forward, DevTools, and popups
open as sibling tabs. Drive them from scripts:
> dpmux navigate http://localhost:3000
> dpmux browser-eval "document.title"
> dpmux browser-screenshot page.png
Where things live
| Path | What |
|---|---|
%LOCALAPPDATA%\DPMux\ | The app: launcher (DPMux.exe), versioned app-x.y.z folders, bin\dpmux.cmd CLI shim, Uninstall.exe |
%APPDATA%\DPMux\settings.json | Your configuration (hot-reloaded) |
%APPDATA%\DPMux\session.json | Saved layout/session (restored on launch) |
\\.\pipe\dpmux-<user> | The automation socket (override: DPMUX_PIPE) |
Env vars inside every DPMux terminal: DPMUX_PIPE, DPMUX_WORKSPACE_ID,
DPMUX_PANE_ID, DPMUX_SURFACE_ID, TERM_PROGRAM=DPMux.
Uninstall
Use Settings → Apps & features → DPMux, or run
%LOCALAPPDATA%\DPMux\Uninstall.exe --uninstall (add --silent to skip the
prompt). This removes the app, shortcuts, PATH entry, and registry entries. Your settings and
sessions in %APPDATA%\DPMux are kept — delete that folder too for a full wipe.
FAQ
Does plain Ctrl+C / Ctrl+R / Ctrl+W reach my shell?
Yes. App shortcuts use Ctrl+Shift (Windows Terminal convention); plain Ctrl combos go to the shell untouched.
Which shell does DPMux use?
PowerShell 7 if installed, otherwise Windows PowerShell. Override with
"shell"/"shell-args" in settings.json (cmd, nushell, git-bash, WSL via
wsl.exe — anything with a console works).
Why does splitting a pane not restart my process?
Panes are repositioned, never recreated — running shells, scrollback, and browser pages survive splits, closes, and resizes.
Can I run two independent instances?
Yes — set DPMUX_PIPE=some-name before launching. That instance gets its own
socket and an isolated settings/session directory under
%APPDATA%\DPMux\instances\.
The `dpmux` command isn't found
Open a new terminal (PATH changes don't reach existing ones), and launch DPMux at least once after installing or updating to 1.0.3+ — the launcher provisions the CLI shim. Inside DPMux's own terminals the CLI is always available, no PATH setup needed.
Running `dpmux` opened another DPMux window instead of the CLI
That was a 1.0.2/1.0.3 bug (the app launcher could shadow the CLI shim on PATH, and a second instance could slip past the single-instance lock). Fixed in 1.0.4 — update via Check for updates in the command palette and restart. If a stray extra window is open, just close it.
Is this the same as tmux on Linux?
No — DPMux is a Windows GUI terminal inspired by cmux.
The CLI borrows tmux verbs (send-keys, capture-pane, split-window…)
so existing muscle memory and scripts adapt easily.
Is the source available?
Not currently — DPMux is proprietary and free to use. The update channel (dpmux-updates) is public so installs can verify and fetch releases.