KhanZou
Deepseek-Harness-as-Desktop
Turn DeepSeek Harness into a Codex-style desktop app: native WebView2 shell, system tray, auto-start, Windows toasts, and a Desktop settings tab with a one-of-N skin center.
- Stars
- 2
- Language
- JavaScript
- Created
- Aug 13, 2026
- Updated
- Aug 14, 2026
Introduction
DeepSeek Harness as Desktop
Turn DeepSeek Harness into a Codex-style desktop app: a native WebView2 shell, system-tray residency, auto-start on logon, real Windows toasts, and a set of DSH plugins that add a desktop settings tab, a standalone card-based skin center, reusable right/bottom panels, a Git graph, file/SCM browsing, a mini terminal, and per-turn token statistics.
Features
- 🖥️ Native WebView2 shell (
DshDesktop.exe, C# WinForms + WebView2, x64) — embeds the DSH Web UI in a standalone app window. - 🚀 One-click launch — the exe detects the backend (
127.0.0.1:3080); if it is not running, it startscorepack pnpm dsh webin the background automatically. - 🧭 System tray residency — closing/minimizing hides to tray and keeps running in the background; tray menu Open / Exit. Exit stops the backend only if this exe started it.
- 🔁 Launch at logon — optional HKCU
Runkey registration. - 🔔 Real Windows toasts — task-completion notifications appear in the Action Center (AUMID-registered unpackaged toast), with tray-balloon fallback.
- ✨ Interactive toasts — completion notifications show a bounded answer preview (title maps the turn-end reason, tools are listed); a quick-reply input + Reply button sends typed text back to the same session via the official DSH
session.promptchannel; sandbox permission escalations show Allow once / Reject buttons answered through the official DSHrespondchannel. A COM activator (INotificationActivationCallback) reads in-toast text input. - ⚙️ Desktop settings tab — a Desktop section in Settings manages close-button behavior, auto-start, and notifications. Localized (zh/en), follows the DSH language switcher.
- 🧩 Unified desktop framework — one plugin (
dsh-desktop-framework) merges the former settings/panels frameworks and the right-panel tabs: any plugin can add Settings tabs/items declaratively (registerTab/registerItem/get/set/subscribe) and register right/bottom panel tabs (registerPanel), with persistence and cross-plugin sync (see docs/settings-framework.md and docs/panels-framework.md). - 🎨 Standalone skin center — a separate Skin Center Settings tab (its own plugin,
dsh-skin-gallery) shows modern preview cards: each card paints a mini app-window mockup with the real theme tokens (plus the skin'saccentwhen provided), shows name/author/description, marks the current skin with a ✓ badge, and supports filter chips (All / Built-in / Skins). Click a card to apply; the choice persists (activeSkin) and the UI auto-refreshes. - 📐 Right/bottom panels framework — part of
dsh-desktop-framework: renders a right column and a bottom bar with tabs, one-click collapse/expand rails, drag-to-resize, and persisted state. Any plugin can register tabs (see docs/panels-framework.md). - 📁 Files & SCM panel — a Files tab (file tree + text/image preview) and a Changes tab (git status with stage/unstage/discard) in the right panel.
- 💻 Mini terminal — a Terminal tab in the bottom panel: run commands in the harness directory (
cdsupported), backed by the desktop client. - 🖼️ Multi-type viewers — the right panel is a multi-tab workspace: open Markdown (GitHub-style), code/text, images (zoom), videos (seeking), PDFs, web pages and 3D models (WebGL STL/OBJ) in closable tabs; drag the left edge to resize.
- 🔗 Conversation links — URLs and file paths in chat output become clickable links: left-click to choose how to open, right-click for Open in desktop / Open with system default / Copy link.
- ⚙️ Per-type open preference — an Open files settings tab chooses per file type whether to open in the desktop client, the system default app, or ask each time.
- 🌿 Git Graph view — a fourth conversation view tab (beside Chat / Trajectory) with a branch selector, checkout, and a commit-history swimlane graph.
- ⚡ Live token stats — a compact per-turn line under each completed answer showing TPS, LLM wall time, input/output tokens and cache-hit tokens (when the provider reports them).
- 🔌 Plugin-only architecture — everything is distributed as DSH plugins (
dsh-plugin).
Repository layout
Deepseek-Harness-as-Desktop/
├── dsh-desktop-window/ # Host plugin + desktop client
│ ├── lib/index.js # DSH host plugin: window launch, turn/end toast, skin manifest
│ └── shell/ # DshDesktop.exe + source + WebView2 SDK + toast scripts + whale.ico
├── dsh-desktop-settings/ # Client plugin: Desktop settings tab (close behavior, auto-start, notify)
├── dsh-desktop-framework/ # Unified desktop framework: settings + panels + Files/Changes/Terminal
├── dsh-skin-gallery/ # Standalone card-based skin center (own Settings tab)
├── dsh-git-graph/ # Git Graph conversation view (branch selector + commit swimlanes)
├── dsh-live-stats/ # Per-turn token statistics line
└── docs/ # skin-compatibility, settings-framework, panels-framework
Requirements
- Windows 10/11 (x64)
- Node.js 22.19+ or 24+ and corepack-enabled pnpm
- Microsoft Edge WebView2 Runtime (preinstalled on most systems)
- A DeepSeek Harness checkout
Path assumptions: the desktop app and plugins are relocatable — they derive config, data, and script paths from their own location. The only machine-specific path is the DeepSeek Harness checkout, which defaults to
D:\deepseek harnessand can be changed per-install via theserverWorkDirkey inconfig.json, or per-launch with--workdir.
Quick start
-
Prepare the harness (one time):
git clone https://github.com/deepseek-ai/deepseek-harness.git "D:\deepseek harness" cd /d "D:\deepseek harness" corepack pnpm install corepack pnpm run build -
Place the app anywhere — copy the
dsh-desktop-windowfolder anywhere (e.g.D:\dsh-desktop-window) and double-clickdsh-desktop-window\shell\DshDesktop.exe(or build it fromProgram.cs— see below). It starts the backend if needed and opens the DSH UI in a native window. -
Install the plugins into the web profile. All six plugins ship in this repository ? each one is a folder under the repo root (
dsh-desktop-window/,dsh-desktop-settings/,dsh-desktop-framework/,dsh-skin-gallery/,dsh-git-graph/,dsh-live-stats/). Point eachaddat its folder (copy the folder anywhere, or use the paths inside this repo):cd /d "D:\deepseek harness" corepack pnpm dsh plugin --profile web add D:\dsh-desktop-window corepack pnpm dsh plugin --profile web add D:\dsh-desktop-settings corepack pnpm dsh plugin --profile web add D:\dsh-desktop-framework corepack pnpm dsh plugin --profile web add D:\dsh-skin-gallery corepack pnpm dsh plugin --profile web add D:\dsh-git-graph corepack pnpm dsh plugin --profile web add D:\dsh-live-statsRestart the desktop app. Then:
- Settings → Desktop — close behavior, auto-start, notifications.
- Settings → Skin Center — pick a skin from modern preview cards (mini app-window mockups painted with the real theme); the UI refreshes.
- Session header ◧ ◨ ▤ buttons — collapse/expand the right panel and the bottom terminal.
- Conversation tabs — Chat / Trajectory / Git Graph.
- After each answer, a live token stats line appears under the turn.
The host plugin (
dsh-desktop-window) is optional but recommended: it sendsturn/endtoasts and keepsskins.jsonfresh for the skin center. The desktop app disables its own auto-open viaDSH_DESKTOP_AUTO=0when it starts the backend itself.
Configuration
Stored in D:\dsh-desktop-window\config.json:
| Key | Values | Description |
|---|---|---|
closeBehavior | tray (default) / exit | Close-button behavior |
autoStart | true / false | Launch at logon (HKCU Run) |
notifyOnComplete | true / false | Toast on task (turn) completion |
activeSkin | skin id or "" | Persisted skin-center selection ("" = DSH default) |
apiPort | 3980 | Local config API port |
serverWorkDir | D:\deepseek harness | Harness checkout to start as the backend; overrides the compiled default (--workdir arg wins) |
panelRightOpen / panelBottomOpen | true / false | Persisted panel open state (panels framework) |
panelRightWidth / panelBottomHeight | px | Persisted panel sizes (panels framework) |
The Desktop settings tab writes these through the exe's local HTTP API
(127.0.0.1:3980, CORS-open):
| Endpoint | Description |
|---|---|
GET /api/config | Read config |
POST /api/config {key,value} | Update config |
GET /api/skins | Skin manifest (default + installed skins) |
POST /api/notify {title,message} | Send a real Windows toast |
GET/POST /api/settings {key,value} | Generic key-value settings (framework backend) |
GET /api/fs/list?dir= | List a directory (files + folders, sizes) |
GET /api/fs/read?path= | Read a text file (or image preview as data URL) |
GET /api/git/branches?dir= | List branches + current |
GET /api/git/log?dir=&branch=&limit= | Commit log (hash, parents, author, date, subject) |
GET /api/git/status?dir= | Porcelain status (branch + changes) |
POST /api/git/checkout {dir,branch} | Checkout a branch |
| `POST /api/git/stage | unstage |
GET /api/shell/cwd | Current terminal working directory |
POST /api/shell/exec {dir,command} | Run a command (cmd.exe); cd updates the cwd |
Skin center & skin compatibility
The Skin Center (its own Settings tab, dsh-skin-gallery, ordered after
all native settings tabs) is a one-of-N card picker: the DSH built-in default
plus every installed skin plugin. Each card paints a mini app-window mockup
with the actual theme tokens (no hardcoded colors) — sidebar, chat bubbles,
input bar and a brand-colored send button — using the skin's accent color
when the manifest provides one, and falls back to the current theme otherwise.
The current skin is marked with a ✓ badge, cards lift on hover, and the grid
supports filter chips (All / Built-in / Skins). Picking a skin persists
activeSkin and reloads the UI; on every boot only the selected skin stays
mounted.
Third-party skins are not bundled. To make a skin appear in the picker it
must provide a skin.json next to its package and be registered with
dsh plugin --profile web add. See
docs/skin-compatibility.md for the full
convention.
Recommended skins
- 深海女仆工坊 / Abyssal Maid Atelier by Small-tailqwq — dual-maid backdrop, navy lace UI, chibi sidebar (CC BY-NC-SA 4.0). Install:
git clone https://github.com/Small-tailqwq/dsh-deep-whale "D:\dsh-deep-whale" corepack pnpm dsh plugin --profile web add D:\dsh-deep-whale\maid-atelier
Panels (right column + bottom terminal)
dsh-desktop-framework renders the panel shells and registers the
Files/Changes/Terminal tabs and the header toggle buttons. The right panel
shares the left sidebar's fill (--dsw-specific-sidebar-fill), and panel
buttons/tabs reuse the app's native button tokens, so they follow the theme. Use the ◧ / ◨ and ▤ buttons in
the session header (next to the mode selector) to one-click collapse/expand
the right panel and the bottom terminal. Collapsed panels become slim rails on
the right/bottom edges — click them to expand again. Drag the panel edges to
resize; widths/heights and open state persist. Other plugins can add their own
tabs (see docs/panels-framework.md).
Viewers & file opening
The right panel is a multi-tab workspace (dsh-desktop-framework). Files opened
from the Files tab or from conversation links render in closable tabs:
| Type | Viewer |
|---|---|
| Markdown | GitHub-style rendered document |
| Code / text | monospace with word wrap |
| Image | image viewer with zoom (wheel / +/- buttons) |
| Video | HTML5 player (seeking via byte-range) |
| built-in Chromium PDF viewer | |
| HTML | rendered web page in an iframe (relative css/js/img served by the desktop client) |
| Web | iframe |
| 3D (STL/OBJ) | WebGL viewer — drag to rotate, wheel to zoom |
Web pages come in three forms and all render in an iframe: local .html files
(served by DshDesktop.exe via /serve/ so relative assets resolve next to
the file), pages on a local port (http://127.0.0.1:<port>), and public
internet URLs. HTML files default to opening in the desktop viewer; change it
per type in the Open files settings tab.
Left-click a conversation link to pick Open in desktop / Open with system
default / Copy link; right-click shows the same actions as a context menu. The
Open files settings tab controls the default per type (ask / desktop /
system). Opening with the system default app or browser is handled by the
desktop client (DshDesktop.exe) through its local API.
CLI (testing)
dsh-desktop-framework ships a dependency-free Node CLI for exercising the
plugin and the desktop client API without the UI:
cd D:\dsh-desktop\dsh-desktop-framework
node cli.js check # health-check web (3080) + desktop api (3980)
node cli.js raw <path> [range] # fetch /api/fs/raw (byte-range aware)
node cli.js open <path> # open with the system default app
node cli.js open-url <url> # open in the default browser
node cli.js settings [k [v]] # read/update the desktop settings store
node cli.js type <path> # viewer kind for a file name
node cli.js samples [dir] # write sample md/stl/pdf test files
Build the shell from source
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo /target:winexe /platform:x64 ^
/win32icon:dsh-desktop-window\shell\whale.ico ^
/resource:dsh-desktop-window\shell\whale.ico,DshDesktop.whale.ico ^
/out:dsh-desktop-window\shell\DshDesktop.exe ^
/r:dsh-desktop-window\shell\Microsoft.Web.WebView2.Core.dll ^
/r:dsh-desktop-window\shell\Microsoft.Web.WebView2.WinForms.dll ^
/r:System.dll /r:System.Core.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll /r:System.Web.Extensions.dll ^
dsh-desktop-window\shell\Program.cs
Localization
All UI plugins register zh/en dictionaries through the DSH client locale
service and follow the language switcher of the harness. Toast messages are
bilingual.
Changelog
See CHANGELOG.md.
License & third-party notices
- Our code: MIT (LICENSE).
Microsoft.Web.WebView2.Core.dll/WinForms.dll/WebView2Loader.dll: the Microsoft Edge WebView2 SDK (MIT), redistributed per its license.whale.ico: DeepSeek's official whale logo (derived from the harness repoapps/web/public/favicon.svg); used here only to identify the DeepSeek Harness app.- Third-party skins (e.g., Abyssal Maid Atelier) keep their own licenses and are not bundled.