← Back to home@sandeep-alluru

deepseek-harness-rc

Drive your DeepSeek Harness (dsh) coding agent from your phone — typed ACP protocol, one-tap approvals, self-hosted push notifications, no screen scraping.

Stars
0
Language
TypeScript
Created
Sep 5, 2026
Updated
Oct 25, 2026

Introduction

dshrc logo

dshrc session list   live turn   approval

dshrc

Remote control for DeepSeek Harness.
Drive your dsh coding agent from your phone — over ACP, not a screen scrape.

Features · Install · Quickstart · News · What's next · Guide · Architecture

CI License: MIT Node npm

Not affiliated with or endorsed by DeepSeek. dshrc is an independent, unofficial client that talks to DeepSeek Harness (dsh) over the Agent Client Protocol, via the community adapter deepseek-acp.


📰 News

  • 2026-09-05 — dshrc 0.1.0. First release: pair a phone with a short-lived code, start and drive dsh sessions over ACP, approve tool calls with one tap, receive self-hosted push notifications, and reach the daemon over LAN, Tailscale, or an outbound relay. A terminal client and an Even Realities G2 glasses client are included. Full notes in the Changelog.

⚡ Get started

# 1. deepseek-acp — the ACP adapter dshrc drives (unofficial; wraps DeepSeek Harness)
npm install -g deepseek-acp
deepseek-acp --setup        # paste a DeepSeek API key once, or export DEEPSEEK_API_KEY

# 2. dshrc
npm install -g dshrc

# 3. One required setting — where new sessions open
dshrc config set defaultCwd ~/code

# 4. Start
dshrc up --lan

Open the printed URL on your phone, enter the 6-character code, add to Home Screen.

  dshrc listening on http://192.168.1.10:4319

  No paired devices. Open the URL above and enter:

      Y8M8GF

(192.168.1.10 is an example — use the address your machine prints.)

Approvals need no extra setup: deepseek-acp's sandbox always asks before a tool touches anything outside the session's working directory, so one-tap remote approval just works out of the box.

For access from anywhere (cellular, travel), use Tailscale so the phone gets HTTPS on your private tailnet — see Guide → Tailscale.

Check the install anytime: dshrc doctor


⭐ Features

Existing toolsdshrc
TransportPTY / terminal bytesACP JSON-RPC (typed)
Waiting for you?Regex over ANSIsession/request_permission — always sent, no config bypass
Approve a toolSend keystrokesOne tap by optionId
NetworkingOpen inbound portsLAN, Tailscale, or outbound relay
Terminal + phoneSeparate sessionsSame session (dshrc term)
PlatformsOften iOS-onlyPWA — iOS and Android
DeepSeek HarnessUnsupportedNative, via deepseek-acp
  • Owned sessions — start from the phone; full control
  • Push notifications — self-hosted Web Push (VAPID); no third-party cloud
  • Relay mode — daemon dials out; nothing listens on your machine
  • Glasses client — an Even Realities G2 front end to the same daemon

Full usage: docs/GUIDE.md


📥 Install

Requires Node 20+ and deepseek-acp (itself a wrapper over DeepSeek Harness).

npm install -g deepseek-acp
npm install -g dshrc

From source:

git clone https://github.com/sandeep-alluru/deepseek-harness-rc.git
cd deepseek-harness-rc
npm install && npm run build
npm link
PlatformPackaged CLIFull suite (CI)Service
LinuxNode 20–24Node 22, 24systemd user unit
macOSNode 20–24Node 22, 24—
WindowsNode 20–24Node 22, 24Scheduled Task

Verified against deepseek-acp 0.8.0.


🚀 Quickstart

dshrc config set defaultCwd ~/code   # required
dshrc doctor                         # agent, ACP, approvals
dshrc up --lan                       # reachable on your LAN
GoalCommand
Pair another devicedshrc pair
List devicesdshrc devices
Revoke a devicedshrc revoke <id>
Terminal on same sessiondshrc term
Run as a service (Linux)see Guide → Service
Outbound relaydshrc up --relay wss://your-relay
Use a different agent binarydshrc up --agent-command /path/to/deepseek-acp

📱 Reach your phone

  1. LAN — dshrc up --lan on a trusted Wi‑Fi only
  2. Tailscale (recommended) — install Tailscale on PC + phone, then: sudo tailscale set --operator=$USER tailscale serve --bg http://127.0.0.1:4319 Open the printed https://your-machine.tail-xxxx.ts.net URL (sample shape only)
  3. Relay — daemon dials out to a VPS you control

Step-by-step Tailscale setup (install, Serve, pair, persist, troubleshooting): Guide → Tailscale


How it works

dshrc spawns deepseek-acp directly over stdio — no subcommand or mode flags, since any argv it doesn't recognize as --setup/--version/--help falls through to running as an ACP service. The daemon, ACP client, pairing, push, relay, and phone/PWA/glasses clients all speak the same typed protocol regardless of which agent is on the other end of the pipe, so the whole stack above the transport layer never has to know or care that the agent is deepseek-acp.

A few things worth knowing about how this backend behaves:

  • Model selection goes through the DEEPSEEK_ACP_MODEL environment variable — deepseek-acp has no --model CLI flag of its own.
  • Approvals are structurally guaranteed. deepseek-acp's sandbox always sends session/request_permission before a tool leaves the session's working directory — there is no config key, flag, or environment variable that turns it off. There is no state a phone-controlled session can end up in where tools run unattended without the phone getting a say. See SECURITY.md.
  • One process per session. Every spawned session is its own deepseek-acp process — there is no shared-backend mode to configure. (--leader is accepted in config files for compatibility.)

🔭 What's next

The roadmap builds on dsh's own session store. Verified against real files: dsh writes one compressed session.jsonl.zstd per session under $DSH_HOME/sessions/ and keeps no live-process registry. Three features build on that store, in order:

  • Session discovery — list sessions started outside dshrc, from the store itself. The reader decompresses the zstd JSONL and reads the type:"session" header line and the later session/title event; the schema is documented in code comments in src/daemon/session-manager.ts.
  • Registry-checked take-over — reclaim a session another process has open, with a "refuse to join a standalone owner" guard. takeOver() resumes today; the guard builds on a live-process registry to check against.
  • Observed mode — mirror a session started by hand elsewhere, by tailing its compressed log with the same reader (src/daemon/observer.ts).

Session resume of a session dshrc itself created works today — deepseek-acp advertises ACP's loadSession capability, and the on-disk existence check matches dsh's real directory-naming scheme. PRs on any of the three are very welcome.


📚 Documentation

DocContents
GuideInstall, config, daily use, push, relay, service, troubleshooting, FAQ
ArchitectureTopology, ACP, session modes, event model
SecurityThreat model, reporting
ContributingDev setup, tests, PRs
ChangelogRelease notes

🧩 Components & versions

ComponentVersionRole
dshrc0.1.0 (npm)This package — daemon, phone PWA, terminal and glasses clients
deepseek-acp0.8.0 (verified)The ACP adapter over DeepSeek Harness; dshrc spawns it over stdio
DeepSeek Harness (dsh)upstreamThe coding agent being driven
Node.js20–24Runtime

✅ How the numbers are verified

  • CI runs typecheck, lint, format check, build, and the full test suite on Linux, macOS, and Windows (Node 22 and 24) — see the badges above.
  • The ACP surface is conformance-checked against recorded handshakes from the real backend (docs/captures/), and the README screenshots are generated from a live deepseek-acp session.
  • dshrc doctor re-checks a live install — agent, ACP, approvals — on your machine.

🔒 Security in one line

Remote control of a coding agent is remote code execution. Pair devices, prefer Tailscale or relay over open LAN — approvals need no extra configuration; the sandbox always asks. See SECURITY.md.


🙏 Credits


📖 Citation

@software{dshrc,
  title  = {dshrc: Remote control for DeepSeek Harness},
  author = {Alluru, Sandeep Varma},
  url    = {https://github.com/sandeep-alluru/deepseek-harness-rc},
  year   = {2026}
}

License

MIT.