The "I just want to double-click it" desktop client for DeepSeek Harness.
No terminal. No dsh web. No "wait, why isn't Node.js installed?!" β
dsh-desktop bundles everything, boots the server for you, and politely
cleans up after itself when you close the window.
DeepSeek Harness ships as a CLI. Its UI lives behind dsh web, which means you
need a terminal, a browser tab, and a few seconds of existential dread about
whether the server is still running somewhere.
If you'd rather double-click a thing than type a command β with a taskbar entry, and a server that disappears when you close the window β this is the missing piece you've been looking for.
- One-click launch β starts
dsh webautomatically when it's not running - Reuses existing servers β if
dsh webis already up, it just connects. It never murders servers it didn't start (it's polite like that) - Zero dependencies β Node.js, the
dshCLI andpnpmare bundled inside the installer. Your machine can stay pristine - Clean lifecycle β the server's process tree is terminated on exit. No zombies, no orphans, no "what's eating my RAM"
- Single-instance guard β launching twice just focuses the existing window. No duplicate servers fighting over a port
- Configurable port β set
DSH_PORT(default3080) and it does what you say - Port settings UI β change the server port and scan for occupied ports right from the dsh settings page (the "Web UI Plugins" section); on startup, if the port is taken by another program, the app offers a free one
- Cross-platform β Windows / macOS / Linux, take your pick
The packaged installers need NOTHING. Node.js, dsh, pnpm β all bundled.
Install, double-click, done. That's it. Go make a coffee.
Only if you're a source-runner (we see you, tinkerers):
- Node.js >= 22.12
- The
dshCLI installed globally:
npm install -g @deepseek-ai/dshgit clone https://github.com/linuxlemon256/dsh-desktop.git
cd dsh-desktop
npm install
npm start| Environment variable | Default | Description |
|---|---|---|
DSH_PORT |
3080 |
TCP port of the dsh web server (passed to dsh web --port when set) |
DSH_SKIP_PLUGIN_INSTALL |
unset | Set to 1 to skip the automatic IDE workbench installation |
The dsh web profile supports third-party plugins that add IDE-like features
to the harness UI. The app auto-installs the IDE workbench on first launch
(when the web profile lacks it) β clone, start, done. Set
DSH_SKIP_PLUGIN_INSTALL=1 if you'd rather keep things vanilla. First launch
takes a bit longer while the plugin is installed; that's it spending your
patience budget, spend it well.
A full workbench inside the harness β no separate IDE needed. Yes, really:
- File explorer (lazy-loading directory tree) + CodeMirror editor
- Real terminal (xterm.js + node-pty)
- Git panel with VSCode-style diffs (stage / commit / revert)
- Embedded browser, background task view, split-pane layout
Manual install (equivalent to what the app does, if you enjoy typing):
dsh plugin --profile web add dsh-better-sidebarSee dsh-better-sidebar (MIT).
A one-command install (Apache-2.0) that adds:
- Explorer panel: file tree, filename search, git changes (stage/unstage/discard)
- Preview panel: multi-tab preview of 10+ formats (markdown, code, pdf, office, imagesβ¦)
- Task board, git graph, skin center, live stats, and more
npm install -g pnpm
dsh plugin --profile web add @linxin666/dsh-web-ui-allpnpm β₯ 11 is a bit paranoid: it may report
ERR_PNPM_IGNORED_BUILDS(native deps likessh2/node-ptyare blocked by default). If that happens, open~/.dsh/profiles/web/pnpm-workspace.yaml, set everyallowBuildsentry totrue, and run thedsh plugin ... addcommand again β it must succeed once (exit code 0) for the plugin to register.
After installing, restart the app and open a project session (a session with a working directory). The panels are shy β they only show up when there's a project to look at.
npm run prepare:resources # bundle node + dsh + pnpm into resources/ (needed before building)
npm run build:win # NSIS installer (Windows)
npm run build:mac # DMG (macOS β requires a macOS machine)
npm run build:linux # AppImage (Linux β requires a Linux machine)Output goes to dist/. For official multi-platform release assets, push a
v* tag and the release workflow builds all
three platforms on GitHub Actions and attaches the files (plus SHA256SUMS.txt)
to the release. CI does the heavy lifting; you do the tagging.
- On startup, the app probes
http://127.0.0.1:3080for a runningdsh webserver. - If nothing responds within 1.5s, it spawns
dsh webusing its bundled runtime (or yourPATHas a fallback), passing--port <DSH_PORT>when configured. - It polls the port until the server is healthy (60s timeout) and loads the UI in an Electron window. If the server crashes during startup, the app retries (up to 3 times) and shows one clear error dialog instead of a hung window.
- When the window is closed, the child process tree is terminated β only if this app started it. An externally running server is left untouched.
See docs/deepseek-harness-integration.md for the full architecture and how this project is derived from DeepSeek Harness.
dsh-desktop/
βββ .github/ # Issue & PR templates
βββ docs/ # DeepSeek Harness integration docs (δΊζ¬‘εΌεθ―΄ζ)
βββ scripts/ # prepare-resources.mjs β bundles the runtime
βββ src/main.js # Electron main process (the whole app)
βββ package.json
βββ LICENSE # MIT
βββ THIRD_PARTY_NOTICES.md # Upstream license attribution
-
Auto-restartβ done in 2.0.3dsh webwhen it crashes while the window is open -
Settings UI (port)β done in 2.0.3: the dsh settings page's "Web UI Plugins" section hosts a port card (change port, scan occupancy) - Settings UI (auto-start)
-
Faster installerβ done in 2.0.x: bundled runtime is pruned (.d.ts/.map/ sources / docs / tests stripped), NSIS usesuseZip(direct extraction, no temp staging) β install time cut ~3.5x
Contributions are welcome! Please read CONTRIBUTING.md first, and check SECURITY.md before reporting a vulnerability.
MIT β see LICENSE.
This project is a secondary development of DeepSeek Harness (MIT, Β© 2026 DeepSeek). Attribution details in THIRD_PARTY_NOTICES.md.