dsh-installer
One-click installers for DeepSeek Harness (dsh) on macOS and Windows
- Stars
- 0
- Language
- Batchfile
- Created
- Aug 31, 2026
- Updated
- Sep 1, 2026
Introduction
dsh-installer
One-click entry scripts for DeepSeek Harness (dsh), aimed at people who are not comfortable with the command line.
Each script launches the Web UI when dsh is already installed, and otherwise runs the setup first — Node.js, pnpm, the dsh CLI, and any optional plugin bundles — in an interactive terminal, with a language selection first (Chinese by default).
Files
| File | Platform | Purpose |
|---|---|---|
dsh.command | macOS (also Linux via bash) | Combined entry — launch, or install first when dsh is missing |
dsh.bat | Windows | Combined entry — launch, or install first when dsh is missing |
Usage
macOS
- Double-click
dsh.command.- First run may be blocked by Gatekeeper: right-click → Open instead, or run
chmod +x dsh.commandfirst.
- First run may be blocked by Gatekeeper: right-click → Open instead, or run
- If
dshis missing or broken, the script picks a language (default Chinese) and walks through the install. - Afterwards it starts the Web UI at
http://127.0.0.1:3080.
Windows
- Double-click
dsh.bat. - If
dshis missing, the script picks a language (default Chinese) and installs. Node.js is installed via winget when missing (you may be asked to re-run once so the new PATH takes effect). - Afterwards it starts the Web UI.
What the scripts do
- Fast path — if
dshis on PATH and passes a smoke check, launchdsh webimmediately. - Language selection — Chinese by default, English optional.
- Node.js check — requires
22.19+or24+. Installed automatically via Homebrew (macOS) or winget (Windows) when missing or too old. - npm global prefix — on macOS, if the global prefix is not writable, the script offers a password-free user-local prefix (
~/.npm-global) instead of requiringsudo. - pnpm — installed globally (
dsh plugin adddelegates to pnpm). @deepseek-ai/dsh— installed globally, providing thedshcommand.- Optional plugins — a loop lets the user enter package names (npm name, tarball path, or
github:spec) installed into thewebprofile; empty input finishes.
Self-update
Both scripts check for a newer release of this installer and update themselves:
- Never blocks a launch. A background check (throttled to once per day, short timeout) fetches the latest GitHub release tag into
~/.dsh-installer/update_state(or%USERPROFILE%\.dsh-installer\update_stateon Windows) and finishes on its own. - Prompts on the next run. At startup, the script reads that cached state; if a newer version exists, it prints a 3–5 second prompt (defaulting to "no", so an unattended run is never interrupted).
- Applies safely. On "yes" it downloads the new script to
dsh.command.new/dsh.bat.new; the following run validates and swaps that file in at the very top, then re-executes. Failed or invalid downloads are removed, and the currently running copy is never overwritten mid-execution. - No re-nagging. A "no" answer records that version as already seen, so the prompt does not return until a newer release appears.
Releasing
Each release must keep two things in sync so the self-update can compare versions:
- Bump
DSH_INSTALLER_VERSIONat the top of bothdsh.commandanddsh.bat. - Tag the release
v<same-version>(e.g.v0.1.1) and publish it as a GitHub release — the check readsreleases/latest.
Example:
gh release create v0.1.1 --title v0.1.1 --notes "..."
License
MIT