GuideOctober 29, 20265 min read

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.

Comparison of four DSH remote access plugins: dsh-zen-remote for access, xmanrui dsh-im for chat approvals, dsh-in-hand for the mobile UI, and meow-smooth for desktop fallback, with versions, licenses, and weekly downloads
All four plugins in this comparison. Download counts are context, not a recommendation.

Scroll horizontally to see all columns.

StagePluginJob
Doordsh-zen-remote 2.2.5 · MITPWA access, loopback gateway, pairing, Web Push
Bell@xmanrui/dsh-im 5.4.0 · MITChat approvals, task delivery, reconnect catch-up
Handdsh-in-hand 1.7.8 · Apache-2.0Standalone mobile UI for sessions and approvals
Chairmeow-smooth 0.8.1 · MITDesktop 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?

DSH remote access architecture: a phone on 4G reaches a TLS reverse proxy, which forwards to a loopback gateway on port 3088 and dsh web on port 3080, with an eight-digit pairing code and Web Push to the lock screen
The gateway never listens on a public interface. The reverse proxy is the only public entry point.

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.

  1. Forward only to 127.0.0.1:3088; do not expose the gateway.
  2. From mobile data, open https://<your-domain>/lan-gate/admin. Expect 403. A readable page means the proxy dropped X-Forwarded-* headers.
  3. 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 push notification rules: tool approval pushes, ask_user_question pushes, a normal turn finish does not push unless pushTurnEnd is enabled, and subagent completion never pushes
The default push policy. A normal turn finish is silent unless you opt in.

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 + targetId through ctx.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?

  1. Door: install dsh-zen-remote, pass the 403 check, pair one device.
  2. Bell: connect one dsh-im channel, test an approval, then add delivery targets.
  3. Hand: install dsh-in-hand only 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 Plan

One-off and monthly options, while stock lasts. Access is delivered as a key after payment.