Introduction

When DSH runs on a development machine, sessions, approvals, and questions are often bound to that computer’s browser. If you leave your workstation, you have to wait until you return to handle them; wanting to continue a conversation on your phone or approve a tool call there is also not natively supported. Common approaches include remote desktop or SSH, but these are full-machine takeovers rather than lightweight remote controls tailored to the DSH workflow.

Below, we introduce DSH Remote maintained by Blank-not-black (GitHub: Blank-not-black/dsh-Remote). It provides session viewing, approval and question handling, file transfer, and a runtime overview via a trio of a DSH plugin, a standalone gateway, and an Android app/WebUI. It works over LAN or Tailscale, uses token-based authentication, and data only flows between your devices.

What Is This

DSH Remote is a remote console for DSH: it lets you view sessions, handle approvals and questions, transfer files, and monitor host status from a phone or another computer. The npm package name is dsh-remote-plugin, the current repository version is 0.6.15, and it is licensed under MIT.

Each of the three components has a distinct role:

Component Role
DSH Plugin Provides entry points within DSH Web, automatically manages the gateway, and shows host and gateway status
Standalone Gateway Handles token authentication, real-time connections, file transfer, and device monitoring
Android App / WebUI Remote operation interfaces for phones, desktop browsers, and the plugin’s embedded view

The token serves as the remote control credential. By default, the project does not introduce an extra account system; the token is stored in ~/.dsh-remote/token and should be safeguarded like an SSH private key—do not commit it to a repository or share it publicly via screenshots.

Core Features

The following capabilities are derived from the project’s README and documentation.

Session Remote Control: View sessions, continue work, switch models, handle goals and background tasks. Session details support real-time messages, history loading, slash commands, and full-screen input.

Real-time Decision Notifications: Approvals, questions, and task status are pushed in real time; network fluctuations can trigger an automatic fallback to polling, reverting to WebSocket once the connection stabilizes.

Files and Images: Browse host directories with support for chunked uploads, resumable transfers, pausing, and cancellation; send photos or gallery images as image content in session.prompt to the current session (subject to the current DSH composition and model supporting image input).

Runtime Overview: DSH version, gateway link status, device connections, token usage, and recent activity are consolidated on the home and statistics pages; the plugin panel and admin console provide details on gateway version, port, upstream status, and token usage over the last 7 days.

Multi-Network Access: Supports LAN, Tailscale, and authenticated WebSocket tunnels. Your phone and computer should be on the same trusted LAN or connected via Tailscale; do not expose the gateway port directly to the public internet.

Offline-Viewable Chat History: The client can load historical messages, making it easy to continue viewing after weak signal or brief disconnections.

Installation and Enabling

The plugin must be installed on the DSH Web web profile. First, confirm that DSH Web can open normally on the local machine, then execute the following commands under the same user that runs DSH:

dsh plugin --profile web add dsh-remote-plugin
dsh plugin --profile web list --depth 0

The second command verifies that the plugin has been added to the web profile.

To specify a version or install from Git:

dsh plugin --profile web add dsh-remote-plugin@0.6.8

dsh plugin --profile web add "github:Blank-not-black/dsh-Remote#main&path:/packages/plugin"

After the steps above:

  1. Fully restart the DSH Web process (if running manually, stop and re-execute dsh web; if using a systemd user service, run systemctl --user restart dsh-web).
  2. In DSH Web, press Ctrl+F5 for a hard refresh and open the DSH Remote panel from the sidebar.
  3. Confirm the gateway is running in the plugin panel, and visit http://127.0.0.1:8787/health on the DSH host; a JSON response indicates the gateway port is available.
  4. Copy the token or scan the QR code to pair from the plugin panel; the token is also saved in ~/.dsh-remote/token.
  5. On the phone, go to “Settings → Server” to scan the QR code, or enter http://your-computer's-LAN-IP:8787 and the token (do not use 127.0.0.1 or localhost).
  6. On another computer, open http://DSH-host-IP:8787 directly to access the desktop WebUI in a browser.

The plugin includes a built-in gateway that defaults to listening on 0.0.0.0:8787 and starts and self-heals automatically with DSH. The gateway on/off intent is saved in ~/.dsh-remote/gateway.enabled. Port priority is: environment variable DSH_REMOTE_GATEWAY_PORT~/.dsh-remote/gateway-port → 8787.

If not using the plugin, you can download a standalone single-file gateway (e.g., dsh-remote-linux-x64) from GitHub Releases and run it independently:

./dsh-remote-linux-x64

PORT=9000 TOKEN=your-token ./dsh-remote-linux-x64

The default upstream is the local DSH Web at http://127.0.0.1:3080, and the admin page is at http://127.0.0.1:8787/admin.

The Android app is the dsh-remote.apk in the releases.

Typical Usage

Gateway Health Check (execute on the DSH host computer to distinguish between a gateway not starting and network unreachability):

curl -i http://127.0.0.1:8787/health
ss -ltnp | grep ':8787'
curl -i http://127.0.0.1:3080/

If /health returns ok: true but upstreamOk: false, the gateway is running but DSH Web (default 3080) is unreachable; check the DSH Web process rather than the gateway itself.

File Transfer API (the Bearer token matches the one in the plugin panel or ~/.dsh-remote/token):

TOKEN=$(cat ~/.dsh-remote/token)
HOST=http://127.0.0.1:8787

curl -H "Authorization: Bearer $TOKEN" "$HOST/fs/list"
curl -OJ -H "Authorization: Bearer $TOKEN" "$HOST/fs/file?path=~/Downloads/example.zip"
curl -H "Authorization: Bearer $TOKEN" --data-binary @./photo.jpg \
  "$HOST/fs/upload?path=~/Downloads&name=photo.jpg"

The default single-file limit is 2 GB, adjustable via DSH_REMOTE_FS_MAX_UPLOAD; allowed directories by default include the current user’s home and workspaces registered in DSH workspace.list. Additional root directories can be configured with DSH_REMOTE_FS_ROOT (use : on Linux/macOS, ; on Windows).

Phone Navigation: Sessions, Files, Home (link health and to-dos), Statistics (tokens and costs), Settings (server, token, notifications, and skin).

Desktop WebUI: Left side session list and workspace, file transfer, home overview, statistics drawer, and approval/question notification cards.

Use Cases and Notes

Suitable for:

  • DSH running on a computer, where you need to view sessions, reply to questions, or handle tool approvals from your phone.
  • Needing to transfer files between your phone and the DSH workspace, or send images as session attachments.
  • Viewing sessions, files, token statistics, and device connections from another computer over LAN or Tailscale, without setting up an extra account system.

Before using, please note:

  • The plugin runs with the same user and permissions as the current DSH process; review the source code and confirm the MIT license and behavior meet your expectations before installation.
  • The gateway defaults to listening on all network interfaces; firewalls must allow TCP 8787 inbound (there’s no need to expose DSH’s 3080 to the public internet). If your phone cannot connect, check that you’re using the computer’s LAN IP or a Tailscale 100.x.x.x address, and verify router AP isolation.
  • A 401 or unauthorized error usually indicates token mismatch; re-scan or copy the token from the current plugin panel. If the page is black or features aren’t updating, try Ctrl+F5 or fully exit and reopen the app to clear static resource caches.
  • Prefer starting the gateway via the plugin panel or restarting DSH Web to trigger self-healing; avoid using systemctl --user restart dsh-remote-gateway.service as a universal restart method (the gateway launched by the plugin may be a transient process).

The DSH ecosystem philosophy is “everything is a plugin.” Community directories like SkillHub are independent sites and have no official affiliation with DeepSeek / High-Flyer; dsh-remote-plugin is a community-maintained client-side plugin with approximately 19 stars on GitHub.

Conclusion

DSH Remote brings DSH’s most critical decision surfaces—sessions, approvals, questions, and files—to your phone and second device, rather than replicating an entire remote desktop. The three components are clearly divided, can be enabled with a single command in plugin mode, and the gateway and token mechanism facilitate self-hosting on a trusted LAN or Tailscale.

  • Directory page: https://www.skillhub.cn/plugins/Blank-not-black/dsh-Remote
  • GitHub: https://github.com/Blank-not-black/dsh-Remote
  • npm: https://www.npmjs.com/package/dsh-remote-plugin