dsh-launcher
September 5, 2026 · View on GitHub
DSHL — A Windows & macOS desktop launcher for DeepSeek-Harness that simplifies runtime installation, isolated instances, provider configuration, plugin management, and one-click launching—no terminal, Node.js, or source setup required.
What it does
dsh-launcher is a desktop launcher for AI harnesses that manages the entire lifecycle of your DSH environments—from setup and configuration to plugins, runtimes, and launching.
| Runtimes | Versioned DSH installs with a bundled Node 22 — a fresh Windows machine works out of the box. |
| Instances | Multiple isolated DSH environments (each its own $DSH_HOME), create / rename / clone / delete / switch. |
| Providers | API key in Windows Credential Manager, never on disk in plaintext. |
| Plugin Market | Registry browse + smart (LLM re-ranked) search + install / uninstall / hot enable-disable. |
| Launch | One button → dsh web boots → DSH renders in a launcher-owned window, logs streamed live. |
Features
- Out-of-the-box runtime — Node 22 is bundled into the installer; DSH is resolved through a 4-layer chain (settings override → bundled → managed
runtimes/<ver>/→ PATH). No Node, no pnpm, no source checkout required. - Managed runtimes — install / switch / remove / verify DSH versions side by side; each instance pins its own version.
- Multi-instance isolation — every instance gets an isolated
$DSH_HOME; plugins and config never leak between instances. - Smart Plugin Market — port of
dsh-market+smart-plugin-marketin Rust: registry fetch (China npm-mirror fallback), smart search withResult ⊆ Registryvalidation, hot enable/disable via thecordis.patch.ymllayer (survivesdsh pluginreconciliation). - Diagnostics — bundle-stack + duplicate-entry + orphan-patch-target + load-order analysis with fix suggestions.
- DSH in-app window — DSH renders inside the launcher (Option B / dsh-tauri port), not a browser tab; closing the window stops the harness.
- Bidirectional theme sync — light/dark/system, one lamp: toggling in the launcher or in DSH keeps both in step.
- Process-tree hardening — Windows Job Object (
KILL_ON_JOB_CLOSE) + recursivetaskkill /T /Ffallback + a pre-launch zombie sweep. 10 consecutive stop/start cycles leave zero survivors. - Launch history — SQLite-backed sessions with start/stop timestamps and crash/exit status.
Install
Download (recommended)
Grab the latest dsh-launcher_<version>_x64-setup.exe from Releases, run it, done. The installer ships a bundled Node runtime, so there's nothing else to install.
⚠️ Releases are currently unsigned. Windows SmartScreen may warn on first run — click "More info → Run anyway". (Code signing is on the roadmap,
P5.)
Build from source
Requirements: Node ≥ 22, pnpm ≥ 10, Rust (MSVC toolchain), WebView2 (built into Win 11).
pnpm install # frontend deps
cargo build --workspace # compile all Rust crates
pnpm build # tauri build → NSIS setup.exe
# artifact: apps/desktop/src-tauri/target/release/bundle/nsis/*-setup.exe
Quick start
- Install and launch dsh-launcher.
- Settings → Provider — paste a DeepSeek API key (stored in Windows Credential Manager).
- Home — pick an instance, click Launch.
DSH boots in its own window; the Activity pane streams stdout/stderr live. Stop from the same button or by closing the window.
Repository layout
dsh-launcher/
├── apps/desktop/ Tauri 2 app
│ ├── src/ React 19 + TS frontend (Vite, Tailwind v4, Zustand)
│ └── src-tauri/ Rust shell: commands/, state/, tauri.conf.json, vendor/node
├── crates/
│ ├── launcher-core/ framework-agnostic core: paths/settings/instance/provider/process/runtime/history/market
│ └── dsh-adapter/ DSH-specific adapter (RuntimeAdapter impl): runtimes/theme/diagnostics
├── tui/ dsh-tauri reference mirror (Option B mechanism)
├── scripts/ dev helpers (icon generation, …)
└── docs: README.md · plan.md · architecture.md · TODO.md · CONTRIBUTING.md · LICENSE
Language boundary (by design): TypeScript owns the UI; Rust owns the system (process, fs, network, secrets, SQLite). All system actions go through typed Tauri IPC — see CONTRIBUTING.md.
Data directory
Installed (default) everything lives under %LOCALAPPDATA%/AIHarnessLauncher/. In portable (green) mode the root is the folder the exe sits in — drop the exe (plus bundled resources) anywhere and every byte stays next to it, so the whole launcher is movable on a USB stick.
<root>/
├── settings.json app settings (DSH path override, theme, last instance)
├── providers.json provider metadata (API key is in Credential Manager, never here)
├── launcher.db SQLite launch history
├── runtimes/ managed DSH versions + bundled node
├── instances/<id>/ instance.json + workspace/ (= that instance's $DSH_HOME)
├── cache/ registry + download cache
└── logs/launcher.log app log (+ crash-*.txt on panic)
Environment variables
| Variable | Purpose |
|---|---|
AHL_HOME | Override the data root (default %LOCALAPPDATA%/AIHarnessLauncher; dev/testing) |
AHL_PORTABLE | Set to a truthy value (1, yes, on, …) to force portable mode: data root = the exe's own directory |
DSH_CLI_BIN | Override the DSH CLI entry (…/apps/cli/lib/bin.js) |
Portable (green) mode
Create an empty portable file (or .portable) next to the launcher exe, and the launcher switches to portable mode on the next start: runtimes/, instances/, settings.json, cache/, logs/ and launcher.db all live beside the exe. Remove the marker to go back to the per-user install layout. The mode is surfaced in Settings → Data storage. API keys stay in Windows Credential Manager and never travel with the folder.
Architecture
See architecture.md for the full product architecture and plan.md for the phased plan (Phase 0–7) and the productization plan (P0–P6) with acceptance gates.
Roadmap
Tracked in TODO.md. Milestones:
- v0.4 — out-of-the-box on a clean machine (✅ done)
- v0.6 — no-scar stop/start + green CI (in progress)
- v0.7 — signed installer + in-app auto-update
- v1.0 — signed + auto-update + out-of-the-box + CI-guarded stable
Contributing
Pull requests welcome — read CONTRIBUTING.md first (branch/commit conventions, PR flow, code & test standards).
License
MIT © 2026 dsh-launcher contributors.