Skip to content

Compatibility

SorGuayteawLord edited this page Aug 17, 2026 · 1 revision

DSH Mobile speaks the DeepSeek Harness web client protocol — the JSON-RPC-shaped surface over /api that the harness's own GUI consumes. That protocol is internal to the harness and is not versioned on the wire, so the app pins a baseline and checks the harness version it finds.

Canonical document: docs/COMPATIBILITY.md.

Matrix

DSH Mobile Harness version Status
0.1.0 – 0.3.1 0.1.0-rc.5 Supported baseline

The baseline the app was built against is shown at Settings → About, next to the app version.

Requirements

Android 8.0+ (minSdk 26)
Harness a build serving dsh web on the protocol above
Network phone and harness mutually reachable — LAN, adb reverse, or same device

Version policy

  • On connect the app reads the version from host.describe and compares it with its baseline. A mismatch shows a non-blocking warning; you can keep working.
  • Parsing is deliberately lenient. Unknown JSON keys are ignored, and unknown event types and unknown tool cards render as generic entries rather than failing the turn. A newer harness will usually work with an older app, minus whatever it added.
  • New harness releases are validated against recorded traffic (tools/capture) before the matrix is updated.

Loopback-only surfaces

These are refused with HTTP 403 for network clients by harness design, and the app presents them read-only or hides them:

  • settings.*
  • credentials.*
  • llm.discoverModels
  • host.pickDirectory, host.openPath
  • agent-preset authoring (agentPreset.read / copy / openDocument / remove)

Connect over adb reverse and the app is a loopback client, so these become available.

How the app behaves when something is missing

A gateway path no harness component claims answers 404, and the trust fence answers 403. Both mean "this build does not offer that", so the app maps them to capability unavailable and forbidden and hides the control instead of reporting a broken connection. The same rule covers optional projections: if the harness composes no permission presets, no plugin inventory, or no content search, those surfaces simply are not there.

That is why two harnesses can show slightly different apps — see Troubleshooting.

Clone this wiki locally