Use DSH from your phone anywhere: a self-hosted relay plus a desktop host plugin form a token-authenticated tunnel (order-preserving HTTP reverse proxy + WebSocket bridging) with QR pairing, an admin console for device/token management, and an injected mobile adaptation layer (full-width chat, full-screen settings sheet, sidebar drawer).
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:JochenYang/dsh-remote#path:/dsh-remote
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
dsh-remote — Mobile Remote (Desktop Host Side)
简体中文 | English
Operate DeepSeek Harness from a phone browser as if it were the desktop: a self-hosted
relay-servershuttles traffic (HTTP reverse proxy + WebSocket frame bridging) with zero changes to the dsh core or frontend, and injects a mobile adaptation layer automatically.
Architecture
Phone browser ──HTTPS──> relay-server ──WS frames──> dsh-remote (plugin) ──HTTP/WS──> local dsh web server
│ │ └────────── downstream event streams ──────────┘ (127.0.0.1:<port>)
└── pairing: 6-digit code + challenge-response ──┘
Features
- Full tunnel: every phone request under
/d/<deviceId>/*is reverse-proxied to the local dsh web server; SSE/blob streams are re-chunked frame-by-frame in order;/events/muxand/events/hostare bridged bidirectionally. - Trust-header stripping:
origin/sec-fetch-*/refererare removed before forwarding so tunneled traffic passes dsh's/apiHost fence (otherwise every API call gets a 403). - Settings unlock: the dsh web client gates its settings mirror on the page hostname, which never qualifies behind a relay. The plugin rewrites the single ui-settings client bundle in transit, restoring the model catalog, plugin config sections and every other settings surface (describe answers are redacted upstream; secret material never rides the wire).
- Mobile adaptation layer: a responsive stylesheet injected into tunnel
HTML (
≤720pxfull-width chat / full-screen settings sheet / clamped dropdowns;≤1024pxoverlay sidebar drawer). Desktop and GUI traffic never crosses the plugin, so it stays pixel-identical. - Pairing UX: 6-digit pairing code + QR code; code refresh waits for the relay's reply before answering; copy feedback; expired codes flagged in red.
- Session control: one click revokes every paired phone session.
Requirements
- DSH (DeepSeek Harness)
desktop with the
webprofile (the plugin mounts its webServer). - Node.js ≥ 22 (the agent uses the native global
WebSocket). - A deployed self-hosted relay (see relay-server).
Install
Download dsh-remote-<ver>.tgz from Releases, then:
# Install into the dsh web profile, then restart DSH
dsh plugin --profile web add ./dsh-remote-<ver>.tgz
Or build from source (inside this directory):
pnpm install
pnpm build # host-side esbuild bundle
pnpm build:client # settings-page client bundle
pnpm pack # produces dsh-remote-<ver>.tgz
dsh plugin --profile web add ./dsh-remote-<ver>.tgz
Configuration
Open Settings → Phone Connection:
| Option | Description |
|---|---|
| Relay URL | the relay's HTTPS address (e.g. https://relay.example.com) |
| Relay token | the HOST_TOKEN configured at relay deploy time |
| Auto-connect on startup | register with the relay as soon as DSH starts |
Settings persist at <dshHome>/storages/dsh-remote/config.json. Once online the
panel shows a 6-digit pairing code (10-minute TTL) and a QR code; pair by
scanning, or by entering the code at <relay>/pair on the phone.
How It Works
- Uplink: phone request → relay → this plugin → local dsh web server, with the response streamed back frame-by-frame (frame order = stream order).
- Downstream: the two dsh event streams (
/events/mux,/events/host) are WebSockets; the relay forwardsws-open/ws-frame/ws-closeframes and the plugin mirrors them onto an equivalent local WebSocket. - Keepalive: 30s ping/pong, 90s silence kill; reconnects back off exponentially (1s→60s).
Wire formats, handshake flow and security parameters: docs/PROTOCOL.md (carry the file along when publishing standalone).
Development
pnpm build # host-side build (esbuild, no type checking)
pnpm typecheck # host-side type gate
pnpm typecheck:client # settings-page client type gate
pnpm pack # pack the tgz
The tsconfig
@deepseek-ai/*type mappings point at a localdeepseek-harnesscheckout (../../deepseek-harness). CI only runs build +node --check.
Security
HOST_TOKENis the relay's single trust boundary; the plugin adds no second auth layer and keeps the token local.- Pairing codes live 10 minutes with one-shot 60s challenges; codes and tokens are never logged.
- To the local dsh server, tunneled traffic reads as the loopback client it physically is; the trust boundary lives in the relay's phone-session auth.
License
MIT © 2026 JochenYang
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-remote-web-ui★ 8707
Remote control of a dsh web workspace from phone or PC: QR-code pairing through a token-gated channel, SSE real-time sync, and separate mobile and full desktop GUI modes.
zhu1090093659/dsh-web#packages/dsh-ssh★ 8707
SSH ops panel for DSH: web terminal, SFTP transfer with progress, local port forwarding, and one-command cluster execution across hosts; agents share the same host config.
saya-ch/dsh-mobile★ 449
Access DeepSeek Harness from the Android app or a mobile browser with secure LAN and remote connections, persistent device pairing, and a customizable mobile interface.
liguobao/ds-harness-remote★ 327
Multi-device remote access for DeepSeek Harness: continue an active session from your phone, tablet, browser, or another computer over an end-to-end encrypted channel (Noise IK + adaptive relay/WebRTC transport), with device authorization, ApiProxy-only remote capabilities, and read-only file preview via dsh-file-viewer — no shell, remote desktop, or write access.
ZSeven-W/dsh-ios★ 322
A live iOS Simulator or USB-connected iPhone inside the conversation: 22 agent tools for booting, building, driving the UI by accessibility identity or OCR text, list-row actions and SwiftUI preview hot reload, plus a streaming sidebar panel you can tap and drag on.
wenbin-wb/dsh-bridge★ 195
Remote and mobile access for DeepSeek Harness: provides LAN QR code connection, Cloudflare/custom tunnels, WeChat, QQ, Feishu, Telegram bot integration, and security authentication.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.