Multi-window wall for the DSH Web UI: run and monitor N conversations side-by-side in one screen, with auto-discovery, per-window controls, and an authenticated LAN gateway for phone/tablet access.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-multi-chat
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:daetz-coder/dsh-multi-chat
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 中文
Run N conversations in DeepSeek Harness at once, watch every Agent's live progress side-by-side, and check in from your phone or tablet. One browser tab goes from "one conversation at a time" to "a panoramic multi-conversation cockpit."
Install a multi-window wall into the official DeepSeek Harness (DSH) Web UI: a grid that shows N running DSH conversation instances simultaneously (each instance runs its own task), so every Agent's live progress, chat, and output are visible at a glance — no more hopping between endless tabs and windows.
✨ What it does
| Capability | Description |
|---|---|
| 📺 Multi-window | One-click entry from the sidebar; the chat area becomes a window grid showing every task side-by-side, one pane per port |
| 🔍 Auto-discovery | Scans a port range to auto-find running DSH instances; manual management is also supported |
| ➕ One-click new window | Launch a brand-new DSH instance right inside the wall to grow your conversation matrix |
| 📱 Phone access | The "Phone access" button starts a built-in authenticated LAN gateway — open the URL on your phone, enter the token, and watch progress |
| 🛑 Window controls | Maximize, refresh, open in a new tab, stop an instance, and switch column count (auto/1/2/3/4/6) |
Multi-chat = multi-port. Start N
dsh web --port <n>instances (each running one conversation/task), open the wall from any of them, and you see all of them side-by-side.
📸 Screenshots
🖥️ Windows · Two chats side-by-side — two running DSH instances laid out together, each pane a full official conversation UI with live online status dots and per-window controls (maximize / refresh / new tab / remove):

📱 iPad · Two chats on mobile — on the same LAN, open the token-authenticated gateway URL on an iPad to watch two Agents' live progress on one tablet screen:

🖥️ Windows · Three-chat panorama — a 3-column grid of three running instances, all Agents on one screen, upgrading you from "one conversation at a time" to "a panoramic multi-conversation cockpit":

🚀 30-second quick start
# 1. Install (npm / npx, no manual patch needed)
npx dsh-multi-chat install
# 2. Start a few instances
npx dsh-multi-chat start --ports 3080,3081,3082
# 3. Open any instance and click "Multi-window" in the sidebar footer → done 🎉
Why this approach
- No official logic is touched: the plugin only registers two additive list slots (
conversation.viewring entry,sidebar.footer.actionsidebar shortcut) and five read-only JSON routes (/multi/api/ports,/multi/api/status,/multi/api/stop,/multi/api/create,/multi/api/link). No existing slot is replaced, no line is rewritten, and no core session/agent/tool logic is touched. - The UI is the official UI: the wall is a view in the official view ring rendered inside the chat panel (not a popup). Theme, type scale, icons, and controls all use the official
--dsw-*tokens and official primitives (Button/Input/Menu/StateDot). - Recursion guard: the wall never embeds its own port; embedded pages carry a
?multi-wall=embedflag and register no wall UI, preventing infinite "wall-in-wall" recursion. - Minimal footprint: one declarative client plugin package — it ships its own
dsh.bundle.patch+cordis.patch.yml, so DSH mounts it as a bundle layer automatically.
Directory layout
plugin/dsh-client-ui-multi-wall/ # spec-compliant client plugin package (node half + browser half)
lib/ # built artifacts (lib/index.js + lib/client.js + types)
src/ # source (mirrors the official monorepo packages/client/ui-multi-wall)
patches/multi-wall.yml # optional `--patch` overlay (usually not needed; the plugin auto-mounts via dsh.bundle)
scripts/
install-plugin.ps1 # pack + install into profile (DSH auto-mounts the bundle) + prompt restart
start-multi.ps1 / stop-multi.ps1 # start/stop multiple dsh web instances (-Remote can carry an authenticated gateway)
gateway.mjs # token-authenticated / optional-TLS reverse-proxy gateway (phone/remote access)
gateway-hidden.vbs # no-window launcher: starts gateway.mjs hidden (no console flash)
gateway-start.ps1 / gateway-stop.ps1 # one-shot silent start/stop of the gateway
bin/dsh-multi-chat.mjs # cross-platform npx CLI (install/start/stop/gateway)
harness-src/ # official deepseek-harness source (dev/build reference)
Install & enable (Windows)
# 1) Pack and install into the web profile. The plugin declares dsh.bundle.patch,
# so DSH auto-mounts its bundle layer — no manual patch edit.
.\scripts\install-plugin.ps1
# 2) Restart dsh web and open any instance
dsh web --port 3084
# Browser: http://127.0.0.1:3084 — a "Multi-window" button appears in the sidebar footer
Or manual:
cd plugin/dsh-client-ui-multi-wall && npm pack # produce a tarball
dsh plugin --profile web add <tarball> # DSH adds the package to the bundle layer stack automatically
Uninstall (one command, nothing manual to clean up):
dsh plugin --profile web remove @deepseek-ai/dsh-client-ui-multi-wall
Usage
- Start several instances:
.\scripts\start-multi.ps1 -Ports "3080,3081,3082,3084"(or manualdsh web --port <n>). - Open any instance and click the "Multi-window" shortcut in the sidebar footer (or the "Multi-window" tab at the top of the chat area).
- Inside the wall view: auto-discovery (own port excluded), column switching (auto/1/2/3/4/6, horizontally filled by default), click title to maximize, ⟳ refresh one, ↗ open in a new tab, ✕ remove from view, refresh all, and live online status dots. The layout is persisted to
localStorage. - To exit the wall, click the "Exit" button in the toolbar's top-right to switch back to the chat view in one click.
Phone / remote access (built-in authenticated gateway)
The official dsh web deliberately forbids --host 0.0.0.0 (it would expose remote code execution to the network). This plugin ships a built-in token-authenticated intranet gateway: click the "Phone access" button and it automatically starts a gateway for the current instance (listening on 0.0.0.0, reverse-proxying to 127.0.0.1:<this instance's port>), returning a LAN URL + login token.
Click "Phone access" → you get:
Available on your phone on the same network: http://10.105.7.204:9477 token: 2efb23eade16
Open that URL on your phone and enter the token to reach the full DSH UI. The gateway's security model:
- HMAC-signed HttpOnly/SameSite session cookie (12h default),
?token=for script convenience, per-IP rate limiting on failed logins - All proxied requests rewrite Host/Origin to the loopback target, so the official
/apibrowser-trust fence (the DNS-rebinding defense) treats it as a local request — no restart /--trusted-hostneeded - WebSocket upgrades and SSE streams pass through unchanged
- When the intended port hits a Windows excluded range or is already bound, it automatically falls back to an OS-assigned free port
A standalone
scripts/gateway.mjs(with optional TLS) is also available for advanced manual use.
Distribution & install
The repo bundles a cross-platform CLI, dsh-multi-chat (bin/dsh-multi-chat.mjs), installable through any of the three channels below. Its install command probes $DSH_HOME (default ~/.dsh) and idempotently appends the enable patch (same behavior as install-plugin.ps1).
Channel 1: npm / npx (recommended, easiest)
# After publishing to npm, one line installs on any machine
npx dsh-multi-chat install
# Or run a single command straight from npx (no install needed)
npx dsh-multi-chat start --remote --token <token> --ports 3080,3081
npx dsh-multi-chat gateway --target 127.0.0.1:3080 --token <token>
Publishing (maintainer): npm publish (unscoped public package dsh-multi-chat).
Channel 2: GitHub Release
Download the source zip/tarball from Releases, unpack it, and cd in:
node bin/dsh-multi-chat.mjs install # pack + dsh plugin add + append enable patch
node bin/dsh-multi-chat.mjs start --ports 3080,3081
Tagging a release makes GitHub auto-generate the source zip/tarball assets; you can also attach a
npm pack-produced.tgzas an offline install bundle.
Channel 3: direct git install
git clone https://github.com/daetz-coder/dsh-multi-chat.git
cd dsh-multi-chat
node bin/dsh-multi-chat.mjs install # install the plugin
node bin/dsh-multi-chat.mjs start --ports 3080,3081
node bin/dsh-multi-chat.mjs gateway --target 127.0.0.1:3080 --token <token>
Running straight from this repo (development)
node bin/dsh-multi-chat.mjs install
node bin/dsh-multi-chat.mjs start --ports 3080,3081
node bin/dsh-multi-chat.mjs stop
node bin/dsh-multi-chat.mjs gateway --target 127.0.0.1:3080 --token <token>
🔍 Discovery & ecosystem
This plugin follows the official DeepSeek Harness client plugin spec:
- Be found in the GitHub plugin ecosystem: adding the
dsh-plugintopic to this repo makes it searchable on the officialdsh-plugintopic page (the officially recommended third-party discovery path). - Bilingual technical docs: under
plugin/dsh-client-ui-multi-wall/there isREADME.md(English),README.zh.md(Chinese), andREADME.i18n.yaml(bilingual consistency record), matching the structure of officialpackages/client/*plugins. - Purely additive, no core touching: registers only the
conversation.view/sidebar.footer.actionlist slots +/multi/api/*read-only routes, changing no official core logic.
Where it lives in the official monorepo
packages/client/ui-multi-wall is a spec-compliant client plugin package (separate host/client tsconfig, tsdown clientBundle, zh/en locales, invariant companion, HMR-safe tests) wired into packages/bundle/web-app's dsh.client roster and the tsconfig.client.json aggregate. To build:
cd harness-src
pnpm install
pnpm --filter @deepseek-ai/dsh-client-ui-multi-wall bundle # produces lib/client.js
npx vitest run packages/client/ui-multi-wall # 14 tests
License
MIT
Links
More in this category
zhu1090093659/dsh-web-ui#packages/dsh-web-ui-all★ 3649
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
omdsh-dev/DSH-better-sidebar★ 1731
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
ccch1mneyyy/dsh-TUI★ 1646
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/dsh-at-file★ 288
Codex-style `@file` mentions: search workspace files in the composer and attach their contents to prompts.
huiliyi37/dsh-tianshu-tui★ 194
A terminal UI (TUI) for DeepSeek Harness.
Nagi-ovo/dsh-visualize★ 161
In-conversation generative UI: the model renders interactive HTML cards into the chat stream, with streaming preview and sandboxed rendering.