Lsnsh / deepseek-harness-desktop

Listed

DeepSeek Harness thrid-party desktop version (macOS)

mainOther View source

Installation

pnpm run runtime # assemble the bundled runtime (downloads Node v24.19.0 + prod-installs @deepseek-ai/dsh)

This command is generated from the GitHub repository address. Inspect the upstream README and source before running it; pin a release or commit when reproducibility matters.

README

Maintainer-authored documentation snapshot.

View on GitHub โ†—
Commit b7cd694Synced Aug 18, 2026

๐Ÿณ DeepSeek Harness Developer Preview

All-in-one native desktop client ยท bundles Node.js runtime + deepseek-harness

release ci check-upstream license

What is this

DeepSeek Harness Developer Preview is a native desktop client (all-in-one architecture) for DeepSeek Harness:

  • ๐Ÿ“ฆ No Node.js install needed โ€” ships its own Node.js LTS runtime (v24.19.0)
  • ๐Ÿš€ Ready to run โ€” bundles the latest @deepseek-ai/dsh; starts dsh web on launch
  • ๐Ÿ–ฅ๏ธ Native feel โ€” Tauri 2 native window, system tray, native menus
  • ๐Ÿ”” Session notifications โ€” native notification when a session turn completes; click to return to the window
  • ๐Ÿ”„ Auto-update โ€” distributed via GitHub Releases; silent startup check plus a manual menu item

โš ๏ธ This is a community-maintained third-party desktop client, not affiliated with DeepSeek. For development and research use only. Currently in beta (Developer Preview) and supports macOS (Apple Silicon) only.

Features

CapabilityDetails
Bundled runtimeNode.js LTS v24.19.0 + full @deepseek-ai/dsh production closure (~66 MiB compressed archive with size pruning; see below)
Local-firstSessions and settings live on your machine (default ~/.dsh); the service binds 127.0.0.1
Single instanceLaunching again focuses the existing window instead of starting a second server
Tray residentClosing the window hides to the tray; the background service keeps running
Auto-updateSilent check 3s after startup; "Check for Updatesโ€ฆ" menu item; signed update manifests
Session notificationsPolls the session store; notifies on turn/end with reason completed/error
Plugin managerManage dsh-plugin topic plugins from GitHub: list/search/install/remove; pre-install manifest verification (dsh.bundle/dsh.client), install confirmation, and an audit log at ~/.dsh/desktop-audit.log
External linksGUI links open in the system browser; the window only ever visits the local service
Error fallbackA dedicated error page when the bundled service fails to start; logs under the system log dir

Download & install

Grab the DMG from the Releases page (Apple Silicon builds).

macOS builds are unsigned/un-notarized: on first launch allow the app in System Settings โ†’ Privacy & Security, or right-click โ†’ Open.

Development

pnpm install                        # install dependencies
pnpm run runtime                      # assemble the bundled runtime (downloads Node v24.19.0 + prod-installs @deepseek-ai/dsh)
DSH_DESKTOP_PRUNE=1 pnpm run runtime  # same, but prune dead weight first (node strip, .map/.d.ts, node-pty cross-platform prebuilds, OTel esm/esnext builds, READMEs/tests): ~97 MiB -> ~66 MiB
pnpm run smoke                      # boot the assembled runtime exactly like the shell and GET the root
pnpm run tauri:dev                  # development mode
pnpm run tauri:build                # release build (.dmg)
pnpm run check:upstream             # check for a newer @deepseek-ai/dsh on npm
pnpm run verify:update              # verify the updater-latest manifest + update URL after a release

Layout

โ”œโ”€โ”€ scripts/                  # runtime assembly & tooling
โ”‚   โ”œโ”€โ”€ download-node.mjs     # download + verify the bundled Node binary
โ”‚   โ”œโ”€โ”€ assemble-runtime.mjs  # prod-install @deepseek-ai/dsh โ†’ resources/runtime
โ”‚   โ”œโ”€โ”€ smoke.mjs             # boot + probe the assembled runtime
โ”‚   โ”œโ”€โ”€ check-upstream.mjs    # npm upstream check (used by the scheduled workflow)
โ”‚   โ”œโ”€โ”€ verify-update.mjs     # post-release check: updater-latest manifest + update URL
โ”‚   โ”œโ”€โ”€ gen-icons.sh          # app / tray icons
โ”‚   โ””โ”€โ”€ gen-signer-key.sh     # updater signing keypair
โ”œโ”€โ”€ resources/                # build artifacts (git-ignored): runtime/ + runtime.tar.gz
โ”œโ”€โ”€ src-tauri/                # Tauri 2 shell (Rust)
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ lib.rs            # entry, menus, window lifecycle
โ”‚       โ”œโ”€โ”€ server.rs         # spawn/supervise dsh web, wait for readiness, navigate
โ”‚       โ”œโ”€โ”€ tray.rs           # system tray
โ”‚       โ”œโ”€โ”€ updater.rs        # auto-update (silent startup + manual menu)
โ”‚       โ””โ”€โ”€ notify.rs         # session-completion notifications (store polling)
โ”œโ”€โ”€ public/error.html         # startup-failure fallback page
โ”œโ”€โ”€ index.html                # splash page
โ””โ”€โ”€ .github/workflows/        # CI / upstream check / release

How it works

  1. scripts/assemble-runtime.mjs prod-installs @deepseek-ai/dsh with npm in a temp dir (real directories, no symlinks), then bundles it with the downloaded Node binary as resources/runtime.tar.gz. Release builds set DSH_DESKTOP_PRUNE=1 to prune dead weight first (strip the node binary + re-sign, drop .map/.d.ts, node-pty cross-platform prebuilds, READMEs/tests): the archive goes from ~97 MiB to ~66 MiB (gzip -9).
  2. Release builds ship the archive as a Tauri resource.
  3. On first launch the app extracts the archive into a cache dir keyed by a content hash (stale versions are cleaned up automatically).
  4. Rust spawns dsh --profile web --port 0 with the bundled Node (OS-assigned port), reads the readiness line dsh web: http://127.0.0.1:<port> from stdout, polls the root, then navigates the window.
  5. Navigation is confined to the local service origin; external links leave via the system browser.
  6. A background thread polls ~/.dsh/sessions/**/session.jsonl.zstd every 2s and posts a notification on a fresh turn/end (reason completed/error).

Update signing

Auto-update needs a minisign keypair:

pnpm run signer-key
  • The private key lives at ~/.tauri/dsh.key โ€” never commit it;
  • Paste the public key into src-tauri/tauri.conf.json โ†’ plugins.updater.pubkey;
  • CI signs update packages with the TAURI_SIGNING_PRIVATE_KEY / TAURI_SIGNING_PRIVATE_KEY_PASSWORD secrets.

Release flow

  1. Bump the version in package.json and src-tauri/Cargo.toml (must carry a -beta suffix) and update CHANGELOG.md / CHANGELOG-zh.md; commit and push.
  2. Trigger the release workflow manually (optionally overriding the version).
  3. The workflow builds on macOS (Apple Silicon, macos-latest), signs, and publishes a pre-release vX.Y.Z-beta.N with the latest.json update manifest attached.
  4. Clients pick the manifest up at startup and via "Check for Updatesโ€ฆ".
  5. After the release, verify the update pointer end-to-end: pnpm run verify:update (fetches updater-latest/latest.json, validates the darwin-aarch64 entry, and probes the update package URL for HTTP 200/302).

Upstream sync

.github/workflows/check-upstream.yml checks npm daily for a newer @deepseek-ai/dsh:

  • New version โ†’ opens/updates a dependency-bump PR; merge after CI passes;
  • Or run manually: gh workflow run check-upstream.yml.

Roadmap

  • macOS: development / CI / deployment / auto-update full loop
  • Notification click navigates to the finished session
  • Windows / Linux support
  • dsh plugin management (MVP: list/search/install/remove from the GitHub dsh-plugin topic, with pre-install manifest verification + audit log)
  • Smaller bundle (prune the runtime closure)

Credits

License

MIT

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

DocumentationDetected

Repository information

Language
Rust
License
MIT
Latest release
v0.1.0-beta.10
Last updated
Aug 16, 2026, 1:40 PM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.