dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Run DeepSeek Harness on your Mac. Control it from your phone.
DSH Remote gives DeepSeek Harness a focused, mobile-first workspace over your private Tailscale network. Start tasks away from your desk, follow the Agent live, handle approvals, and read the result without exposing Harness to the public internet.
The mobile UI ships in Simplified Chinese.
You need:
git clone https://github.com/Zouu-X/dsh_remote.git dsh-remote
cd dsh-remote
./macos/launch-agent/setup.sh
The setup checks the Mac environment, installs project dependencies, builds the mobile app, installs the user LaunchAgent, configures Tailscale Serve, and prints the phone URL. If Node.js or Tailscale is missing and Homebrew is available, it offers the standard installation path.
The setup prints the exact command for your Mac. It looks like:
npx @deepseek-ai/dsh web --trusted-host <your-mac>.<your-tailnet>.ts.net
Keep Harness running. DSH Remote follows it automatically and becomes available whenever Harness is listening on 127.0.0.1:3080.
Open the URL printed by setup:
https://<your-mac>.<your-tailnet>.ts.net
Add it to the home screen for an app-like launch experience.
DSH Remote keeps the sensitive part of the stack on your Mac:
127.0.0.1:3080.127.0.0.1:3090.DSH Remote is designed for a personal Mac and a private, single-user tailnet. You can restrict access to specific phone devices with the included allowlist manager.
By default, devices already authenticated to your tailnet can reach the Remote Host. To allow only selected devices:
# Find the phone's Tailscale node ID.
tailscale status
# Add the phone to the allowlist.
macos/launch-agent/devices.sh add <tailscale-device-id>
# Inspect the active allowlist.
macos/launch-agent/devices.sh list
Changes take effect immediately after the LaunchAgent restarts. Removing the final allowed device is refused so an edit cannot silently widen access. To intentionally return to tailnet-wide access, run:
macos/launch-agent/devices.sh allow-all
The installed user LaunchAgent starts at login and waits for Harness. When Harness starts, DSH Remote comes online; when Harness stops, the Remote Host follows it down. With the default auto wake policy, macOS stays awake only while a Harness session is running.
Useful commands:
# Confirm both local services.
lsof -nP -iTCP:3080 -sTCP:LISTEN
lsof -nP -iTCP:3090 -sTCP:LISTEN
# Check the local Remote Host.
curl http://127.0.0.1:3090/api/health
# Inspect Tailscale Serve.
tailscale serve status
# Follow logs.
tail -f ~/.dsh-remote/logs/remote-host.err.log
To uninstall the LaunchAgents:
macos/launch-agent/uninstall.sh
Use this path when you want to control each step yourself.
corepack pnpm install
corepack pnpm -r build
DSH_TS_HOST=$(tailscale status --json | python3 -c 'import json,sys; print(json.load(sys.stdin)["Self"]["DNSName"].rstrip("."))')
echo "$DSH_TS_HOST"
npx @deepseek-ai/dsh web --trusted-host "$DSH_TS_HOST"
In another terminal:
macos/launch-agent/install.sh
macos/launch-agent/configure-tailscale-serve.sh
tailscale serve status
install.sh reads environment variables directly or from the ignored file macos/launch-agent/launch-agent.env.
| Variable | Default | Purpose |
|---|---|---|
DSH_REMOTE_HARNESS_URL | http://127.0.0.1:3080 | Harness HTTP base URL |
DSH_REMOTE_PORT | 3090 | Remote Host listen port |
DSH_REMOTE_STATIC_DIR | <repo>/apps/mobile-web/dist | Built mobile app directory |
DSH_REMOTE_STATE_FILE | ~/.dsh-remote/host-state.json | Persistent Mac Host identity |
DSH_REMOTE_ALLOWED_DEVICE_IDS | empty | Comma-separated Tailscale device IDs; empty allows the tailnet |
DSH_REMOTE_IDENTITY_PROVIDER | tailscale | Resolve Tailscale peer identity; none accepts loopback only |
DSH_REMOTE_SECRET_STORE | mac-keychain | Store the Remote Host device private key in Keychain |
DSH_REMOTE_CAFFEINATE | auto after install | Keep the Mac awake while sessions are active |
DSH_REMOTE_HARNESS_POLL_SECONDS | 15 | Harness availability polling interval |
DSH_REMOTE_NODE | detected during install | Node binary used by the LaunchAgent |
To let the LaunchAgent manage Harness as well:
DSH_INSTALL_HARNESS_SUPERVISOR=1 macos/launch-agent/install.sh
Manual Harness management remains the default so Harness upgrades and credentials stay under your control.
Phone PWA
│ HTTPS/WSS over the private tailnet
▼
Tailscale Serve on the Mac
│ TLS termination + PROXY protocol
▼
Remote Host · 127.0.0.1:3090
│ principal resolution, capability checks, idempotency, event envelopes
▼
DeepSeek Harness Adapter
│ allowlisted HTTP/WS translation
▼
DeepSeek Harness · 127.0.0.1:3080
The mobile UI depends on an AgentHostTransport, not on Harness internals. All upstream DeepSeek Harness calls are centralized in one adapter, while the protocol, domain models, authentication policy, client transport, and host process remain separate packages.
The Remote Host exposes only:
host.describeworkspace.list, workspace.createsession.list, session.search, session.create, session.history, session.promptagent-preset.list, agent-preset.selectsession.models, session.select-modelapproval.respond, question.respondSettings, credentials, local path pickers/openers, and preset mutation methods are not remotely available.
| Path | Responsibility |
|---|---|
apps/mobile-web | React/Vite mobile PWA |
packages/remote-protocol | Versioned RPC and event envelopes |
packages/remote-domain | Host, workspace, task, approval, question, and event-history models |
packages/remote-client | AgentHostTransport and the direct tailnet transport |
packages/remote-host | Loopback HTTP/WebSocket host and identity boundary |
packages/auth-core | Principals, roles, capabilities, and remote method policy |
packages/adapter-deepseek | The only package that speaks the Harness wire protocol |
macos/launch-agent | Guided setup, LaunchAgent templates, access management, and diagnostics |
tools | Connectivity and Remote Host checks |
corepack pnpm install
corepack pnpm typecheck
corepack pnpm test
corepack pnpm build
Run the development servers:
corepack pnpm dev:mobile
corepack pnpm dev:host
Run the Remote Host self-check after building and starting Harness:
node tools/remote-host-check/check.mjs --base http://127.0.0.1:3090
DSH Remote is an independent community project and is not affiliated with or endorsed by DeepSeek.