A Guide to DeepSeek Harness (DSH) Remote Access: 4 Plugins for Agent Completion Alerts
TL;DRRemote DSH is four jobs, not one plugin: access (dsh-zen-remote), notifications (@xmanrui/dsh-im), mobile control (dsh-in-hand), and desktop fallback (meow-smooth). By default, approvals and model questions push; a normal turn finish does not; a subagent finish never does. Pick one mobile UI and split notification channels.
By Cameron Voss · Updated October 29, 2026
At 3 p.m. you hand an agent a forty-minute job and leave. Three questions follow: can I see it, will it call me, can I answer from the phone? Each has a different failure mode.
What are the four stages?
DSH is the DeepSeek Harness agent. The four plugins below were tested on dsh 0.2.1-rc.2, with @deepseek-ai/dsh-tools and dsh-session at the same version and @deepseek-ai/cordis 4.0.5.
Scroll horizontally to see all columns.
| Stage | Plugin | Job |
|---|---|---|
| Door | dsh-zen-remote 2.2.5 · MIT | PWA access, loopback gateway, pairing, Web Push |
| Bell | @xmanrui/dsh-im 5.4.0 · MIT | Chat approvals, task delivery, reconnect catch-up |
| Hand | dsh-in-hand 1.7.8 · Apache-2.0 | Standalone mobile UI for sessions and approvals |
| Chair | meow-smooth 0.8.1 · MIT | Desktop in-page alerts and mobile polish |
Two choices matter. Pick one mobile UI: dsh-zen-remote and dsh-in-hand both provide one, and running both duplicates entries and alerts. Split notification channels: Web Push for urgent approvals and questions, IM for receipts and confirmations. Overlap them and the phone rings twice.
How does the door work?
The gateway listens on 127.0.0.1:3088, not a public interface. A reverse proxy such as nginx, Caddy, Cloudflare Tunnel, or Lucky terminates TLS and forwards to that loopback port. dsh web stays on 127.0.0.1:3080.
Install from Plugins → Add plugin, or run:
dsh plugin --profile web add dsh-zen-remote
The default role: host runs sessions, opens the gateway, and sends push. role: client mirrors shared sessions on a second desktop.
- Forward only to
127.0.0.1:3088; do not expose the gateway. - From mobile data, open
https://<your-domain>/lan-gate/admin. Expect 403. A readable page means the proxy droppedX-Forwarded-*headers. - Generate an 8-digit code (10 minutes, one use, role-bound), enter it on the phone, and add the page to the home screen.
A desktop-app code will not redeem as a web-app code, and a rejected attempt does not consume it. A paired desktop is trusted; a remote terminal runs as the server user, outside the sandbox and approval flow. Treat the code as machine access.
When does DSH notify you?
dsh-zen-remote is quiet by default. It pushes when a tool is waiting for approval and when the model calls ask_user_question. A normal turn finish does not push. A subagent finish never pushes.
Enable pushTurnEnd or DSH_PUSH_TURN_END=1 to hear about completed turns; add pushSummary for the final reply. Approval events wait through a DSH_PUSH_APPROVAL_GRACE_MS window (default 5000 ms) so a machine responder can answer first.
How do approvals work in chat?
@xmanrui/dsh-im is an IM bridge, not a notification plugin. It connects WeChat, Feishu, DingTalk, WeCom, QQ, Slack, Telegram, Discord, WhatsApp, and Matrix.
- Approvals happen in chat. Reply approve, reject, yes, or no. The first submission wins; there is no permanent approval.
- Results can be pushed to a channel with
botId+targetIdthroughctx.dshIm.send()or an HTTP POST. - After a reconnect it resends text results and terminal states. Explicit failures retry at most three times.
Caveats: Web-initiated approvals need a bound two-way private chat; iMessage, email, and AI Office do not approve; WeChat splits final text at 1,800 characters.
What does the phone UI show?
dsh-in-hand is a PWA for the narrow screen: sessions, subagents, goal turns, workflows, background tasks, pending approvals, and streaming replies. It is not desktop parity. Configuration, plugin panels, and file management stay on the computer. If you only need a glance, use the mobile view inside dsh-zen-remote; if you handle approvals on the move, use the standalone UI. Pick one.
What breaks or can't be fixed?
Two deployment gotchas. The plugin settings panel is blank over the tunnel because DSH exposes settings RPC only to loopback connections; fix it from a local browser. A plugin relay can work, but it exposes the full admin surface, including credentials, so put authentication in front. dsh-mnemon defaults to remoteAccess: read-only. To change it, edit cordis.patch.yml; the patch replaces the whole config rather than deep-merging, so restate every field and verify:
HOME=/data/dsh/home DSH_HOME=/data/dsh dsh --profile web --dump-config
Five limits: the task can still be wrong, the host process can die, the tunnel can fail, mobile approval is low-context, and remote access does not save tokens. Silence is not progress.
Two other plugins do not run on this version: @eternalloveone/dsh-palm 1.6.4 (its peer range excludes 0.2.1-rc.2) and dsh-notifier 0.13.1 (pins dsh-session to 0.1.7-*). dsh-remote-web 0.7.4 works but is PolyForm-Noncommercial-1.0.0.
Which order should you install?
- Door: install
dsh-zen-remote, pass the 403 check, pair one device. - Bell: connect one
dsh-imchannel, test an approval, then add delivery targets. - Hand: install
dsh-in-handonly if you need it, and turn off the other mobile entry point.
Restart dsh web after each step.
Frequently asked
Is DSH remote access one plugin?
No. Remote DSH is four jobs: access, notification, mobile control, and desktop fallback. dsh-zen-remote handles access, @xmanrui/dsh-im handles notifications and chat approvals, dsh-in-hand is the standalone mobile UI, and meow-smooth is the desktop fallback.
Why is my phone silent after a DSH run finishes?
By default dsh-zen-remote pushes only tool approvals and ask_user_question. A normal turn finish does not push. Enable pushTurnEnd or set DSH_PUSH_TURN_END=1. A subagent finish never pushes.
Is it safe to expose DSH to the internet?
Only through a reverse proxy that terminates TLS, with the DSH gateway still on 127.0.0.1:3088, a role-bound one-time pairing code, and a 403 result from the /lan-gate/admin self-check. A pairing code is machine access.
Four plugins decide how you reach DSH. One key decides what the run costs. Once the channel is open, the next step is a model endpoint that can run the work.
See the DeepSeek Coding PlanOne-off and monthly options, while stock lasts. Access is delivered as a key after payment.