DPMux Docs

Everything you need to install, customize, and automate DPMux.

Install

  1. Download DPMuxSetup.exe (~110 KB).
  2. Run it. The installer downloads the latest release, verifies its SHA-256, and installs to %LOCALAPPDATA%\DPMux — per-user, no administrator prompt, no wizard.
  3. DPMux launches automatically with Start-menu and Desktop shortcuts created, and the dpmux command 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.

ActionShortcut
New workspaceCtrl+Shift+T
Close surface / pane / workspaceCtrl+Shift+W
Split right / downCtrl+Shift+D / Ctrl+Shift+E
New browser surfaceCtrl+Shift+L
Next / previous workspaceCtrl+Tab / Ctrl+Shift+Tab
Jump to workspace 1–9Ctrl+Alt+1…9
Focus pane directionallyAlt+←↑↓→
Resize paneCtrl+Shift+←↑↓→
Find in terminalCtrl+Shift+F
Command paletteCtrl+Shift+P
Toggle sidebarCtrl+Shift+B
New groupCtrl+Shift+N
Rename workspaceCtrl+Shift+R
Copy / pasteCtrl+Shift+C / Ctrl+Shift+V (right-click pastes)
Font zoomCtrl+= / Ctrl+- / Ctrl+0
FullscreenF11

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-1workspace-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

AreaCommands
Workspaceslist-workspaces current-workspace new-workspace close-workspace rename-workspace focus-workspace move-workspace mark-read mark-unread set-status set-progress
Groupslist-groups new-group rename-group focus-group close-group
Paneslist-panes split-pane close-pane focus-pane resize-pane flash-pane
Surfaceslist-surfaces new-surface close-surface focus-surface respawn
Terminal I/Osend-text send-keys capture-pane
Notificationsnotify notification-list notification-clear
Browsernavigate browser-back browser-forward browser-reload browser-eval browser-screenshot
Appping 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

PathWhat
%LOCALAPPDATA%\DPMux\The app: launcher (DPMux.exe), versioned app-x.y.z folders, bin\dpmux.cmd CLI shim, Uninstall.exe
%APPDATA%\DPMux\settings.jsonYour configuration (hot-reloaded)
%APPDATA%\DPMux\session.jsonSaved 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.