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.

License: MIT Platform Tauri 2 React 19 Rust


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.

RuntimesVersioned DSH installs with a bundled Node 22 — a fresh Windows machine works out of the box.
InstancesMultiple isolated DSH environments (each its own $DSH_HOME), create / rename / clone / delete / switch.
ProvidersAPI key in Windows Credential Manager, never on disk in plaintext.
Plugin MarketRegistry browse + smart (LLM re-ranked) search + install / uninstall / hot enable-disable.
LaunchOne 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-market in Rust: registry fetch (China npm-mirror fallback), smart search with Result ⊆ Registry validation, hot enable/disable via the cordis.patch.yml layer (survives dsh plugin reconciliation).
  • 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) + recursive taskkill /T /F fallback + 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

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

  1. Install and launch dsh-launcher.
  2. Settings → Provider — paste a DeepSeek API key (stored in Windows Credential Manager).
  3. 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

VariablePurpose
AHL_HOMEOverride the data root (default %LOCALAPPDATA%/AIHarnessLauncher; dev/testing)
AHL_PORTABLESet to a truthy value (1, yes, on, …) to force portable mode: data root = the exe's own directory
DSH_CLI_BINOverride 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.