DSH Plugin Store
Back to home

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
Web UI
GitHub repo

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 starts corepack pnpm dsh web in 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 Run key 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.prompt channel; sandbox permission escalations show Allow once / Reject buttons answered through the official DSH respond channel. 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's accent when 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 (cd supported), 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 harness and can be changed per-install via the serverWorkDir key in config.json, or per-launch with --workdir.

Quick start

  1. 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
    
  2. Place the app anywhere — copy the dsh-desktop-window folder anywhere (e.g. D:\dsh-desktop-window) and double-click dsh-desktop-window\shell\DshDesktop.exe (or build it from Program.cs — see below). It starts the backend if needed and opens the DSH UI in a native window.

  3. 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 each add at 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-stats
    

    Restart 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 sends turn/end toasts and keeps skins.json fresh for the skin center. The desktop app disables its own auto-open via DSH_DESKTOP_AUTO=0 when it starts the backend itself.

Configuration

Stored in D:\dsh-desktop-window\config.json:

KeyValuesDescription
closeBehaviortray (default) / exitClose-button behavior
autoStarttrue / falseLaunch at logon (HKCU Run)
notifyOnCompletetrue / falseToast on task (turn) completion
activeSkinskin id or ""Persisted skin-center selection ("" = DSH default)
apiPort3980Local config API port
serverWorkDirD:\deepseek harnessHarness checkout to start as the backend; overrides the compiled default (--workdir arg wins)
panelRightOpen / panelBottomOpentrue / falsePersisted panel open state (panels framework)
panelRightWidth / panelBottomHeightpxPersisted panel sizes (panels framework)

The Desktop settings tab writes these through the exe's local HTTP API (127.0.0.1:3980, CORS-open):

EndpointDescription
GET /api/configRead config
POST /api/config {key,value}Update config
GET /api/skinsSkin 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/stageunstage
GET /api/shell/cwdCurrent 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:

TypeViewer
MarkdownGitHub-style rendered document
Code / textmonospace with word wrap
Imageimage viewer with zoom (wheel / +/- buttons)
VideoHTML5 player (seeking via byte-range)
PDFbuilt-in Chromium PDF viewer
HTMLrendered web page in an iframe (relative css/js/img served by the desktop client)
Webiframe
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 repo apps/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.