English | 中文
A Windows desktop launcher: double-click the icon to start
dsh web, with no black console window at any point, plus a splash screen that shows the logo, the full product name, a progress bar and the live startup steps.
⚠️ This is a third-party, unofficial tool and is not affiliated with DeepSeek. The whale logo comes from the official DSH frontend (favicon.svg) and remains DeepSeek's copyright. DSH itself must be installed separately (npx @deepseek-ai/dsh web).
┌──────────────────────────────────────────┐
│ │
│ 🐋 │ ← DSH whale logo
│ │
│ DeepSeek Harness │ ← full product name
│ dsh · local AI coding workbench │
│ │
│ ████████████████████████░░░░░░░░░░░░░ │ ← progress bar (middle)
│ │
│ Waiting for the service… │ ← gray step text (lower middle)
│ │
└──────────────────────────────────────────┘
- No console window — the launcher is a WinExe; the dsh service is started windowless through a detach shim and writes its output to a log file
- Visible startup — logo, product name, progress bar and step-by-step status text (check environment → locate install → start service → wait for ready → open browser)
- Opens the browser for you — parses the tokenized URL dsh prints
(
dsh web: http://127.0.0.1:port/?token=...), so you never copy it by hand - Outlives the launcher — dsh runs detached; quitting the launcher never interrupts the service
- Tray resident — open UI / copy URL / view log / restart service / stop service and quit
- Reuses a running DSH — if
dsh webis already listening (for example the session you started from PowerShell), it just opens the UI instead of starting a second server - Failures are visible — when startup fails, the splash stays open and shows the reason in red (Node.js not found, port already in use, process exited, …)
- High-DPI aware — the DPI-aware manifest keeps the UI crisp at 150% scaling
| Requirement | Notes |
|---|---|
| Windows 10 / 11 | WinForms + .NET Framework 4.x (ships with Windows) |
| Node.js | runtime for dsh |
| DSH | anything that makes npx @deepseek-ai/dsh web work |
| PowerShell 5.1+ | only for building / installing shortcuts (ships with Windows) |
Option 1 — download the prebuilt exe (easiest)
Grab DSH-Launcher.exe from Releases and
double-click it (Node.js and DSH must already be installed on the machine).
Option 2 — build from source
git clone https://github.com/codeWang-J/dsh-launcher.git
cd dsh-launcher
pwsh -File build.ps1 # generate icons + compile DSH-Launcher.exe
pwsh -File install-shortcuts.ps1 # create desktop / Start menu shortcutsThen double-click DeepSeek Harness on the desktop.
The repository ships no prebuilt exe (source only) and no generated icons;
build.ps1generates the icons fromassets/dsh-logo.svgand compiles. If icon generation fails (for example whensharpcannot be found), the build still continues — just without a custom icon.
| How to start | Where |
|---|---|
| Desktop shortcut | DeepSeek Harness on the desktop |
| Start menu | Start menu → DeepSeek Harness |
| Directly | DSH-Launcher.exe |
Startup flow: the progress bar and gray text advance step by step → service ready → the browser opens automatically → the splash fades out and the whale icon appears in the tray.
Tray menu (right-click the tray icon):
| Item | Effect |
|---|---|
| Open DSH UI | reopen the browser UI (double-clicking the tray icon does the same) |
| Copy URL | copy the tokenized URL to the clipboard |
| View startup log | open this run's dsh log |
| Restart DSH service | stop the current service and start it again |
| Stop service and quit | kill the dsh process tree, then exit the launcher |
| Quit launcher (keep service) | close the launcher only; the service keeps running |
Closing the splash (“×” or
Esc) minimizes it to the tray; it does not interrupt startup. Quitting the launcher does not stop the service — use “Stop service and quit” for that.
What if DSH is already running?
If something is already serving dsh web on the port, the launcher reuses it and just opens the UI
instead of starting a second server. The tray's “stop / restart” then acts on that process, whose
PID is resolved by looking up the port owner.
Copy launcher.ini.example to launcher.ini (the real file is .gitignored so local paths never
get committed):
| Key | Default | Meaning |
|---|---|---|
workspace |
the workspace folder next to the launcher's parent |
session working directory |
profile |
web |
profile to boot; web = browser UI |
host / port |
127.0.0.1 / 3080 |
listen address and port |
node |
empty (auto-detect) | path to Node.js |
entry |
empty (auto-detect) | dsh's lib/bin.js; picks the highest version in the npm / npx caches |
openbrowser |
true |
open the browser once the service is ready |
timeout |
180 |
seconds to wait for readiness |
extraargs |
empty | extra arguments passed to dsh |
datadir |
<launcher>\runtime |
where logs and pid files live |
Command-line flags override the ini: --port, --host, --profile, --workspace, --node,
--entry, --restart, --no-open, --timeout, --preview (demos the splash without starting
anything).
| Step | How |
|---|---|
| The launcher itself | compiled as a WinExe (GUI subsystem) — it has no console at all |
| Starting dsh | src/bootstrap.cjs detaches it: detached + windowsHide, stdout/stderr redirected to a log file, the shim exits immediately |
| Opening the browser | handed to the default browser via ShellExecute |
| Port lookup / stopping | netstat and taskkill are both invoked with CreateNoWindow |
There is no pipe between the launcher and the service, so quitting or crashing the launcher can neither affect dsh nor trigger broken-pipe errors.
├─ src\
│ ├─ DSHLauncher.cs launcher source (C# / WinForms / .NET Framework 4.x)
│ ├─ bootstrap.cjs detach shim: runs dsh as a windowless background process
│ └─ app.manifest DPI awareness + OS compatibility manifest
├─ assets\
│ └─ dsh-logo.svg official DSH logo (input for icon generation)
├─ tools\
│ └─ render-assets.js generates png / ico from the svg (needs sharp)
├─ build.ps1 build: generate icons + compile
├─ install-shortcuts.ps1 create / remove shortcuts (-Remove to remove)
├─ push-to-github.ps1 one-command push (for machines where git is not on PATH)
├─ launcher.ini.example configuration template
└─ runtime\logs\ runtime logs (ignored, not committed)
Start with the logs: runtime\logs\launcher.log (what the launcher did, and why it failed) and
runtime\logs\dsh-web-*.log (dsh's own output).
| Message on the splash | What to do |
|---|---|
| Node.js not found | node is not on PATH — set node= to the full path in launcher.ini |
| DSH install directory not found | the npx cache was cleaned: run npx @deepseek-ai/dsh web once, or point entry= at ...\@deepseek-ai\dsh\lib\bin.js |
| Startup failed: port in use | change port=, or stop whatever holds the port |
| Could not open the browser | the splash shows the URL — copy it into a browser manually |
| Blurry icons / text | make sure the exe is a current build (build.ps1); older builds had no DPI manifest |
- Only the
webprofile has a complete flow (other profiles can be booted withprofile=, but there is no browser handoff) - Single instance: launching it again just brings up the running launcher and opens the UI
- “Stop service and quit” kills the dsh process tree — if your current session runs on that service, the session ends with it
MIT.
Note: the DSH whale logo used by the UI and icons comes from the official DeepSeek Harness frontend assets and remains DeepSeek's copyright; it is not covered by this project's MIT license. DSH itself is installed separately and governed by its own license.