i99dash docs
Operator CLI

Operator CLI (i99op)

The support operator's console — connect to a car over the Remote Help relay and drive it from your terminal.

i99op is a standalone CLI a support operator runs to reach any Android car head unit through Remote Help / DashDoctor and drive it from the terminal — no web console, no hand-rolled adb.

Car-agnostic. The relay + adb tunnel work with any Android head unit, not just BYD / i99dash — repairing the i99dash app on a BYD is the flagship case, but the shell, app-install, screen-mirror, file, and recovery flows run on any Android car.

Different audience from the rest of these docs. The i99dash SDK is for mini-app developers; i99op is for support operators helping an owner recover or troubleshoot their car. Both are part of the i99dash toolchain, so they live side by side here.

How a session works

The owner starts a session on the car and reads you one short code (or a handle + 6-digit OTP). You redeem it; the backend binds the session and hands the CLI a signed, single-use relay ticket. From there i99op brings up a peer-to-peer link to the car and splices it to a local adb port:

operator's machine
   i99op ──HTTP──▶ backend   (redeem code / OTP → signed relay ticket)
   i99op ──WSS───▶ relay ──▶ car   control plane: signalling, auth,
   │                               kill-switch + recovery text ops
   └─ P2P (WebRTC DataChannel) ─▶ car   raw adb byte stream
                                        → `adb shell` / `scrcpy`

The adb byte stream is peer-to-peer: adb and scrcpy ride a direct WebRTC DataChannel between your machine and the car, spliced to a local 127.0.0.1 port. The relay only carries the control plane — signalling, auth, the kill-switch, and the text-channel recovery ops. On the same LAN the peers connect directly; across networks they use STUN/TURN to traverse NAT. The adb stream never transits the relay.

The backend stays authoritative the whole time: the master flag, the operator allowlist, and the handle-and-role-bound ticket all gate what the session permits. Nothing in the CLI can widen the granted capability — it only drives what the session already allows.

What you can do

  • Connect + shell — redeem a code and drop straight into adb shell on the car (i99op connect <code>).
  • Reconnect — if a session drops while the case is still open, resume it from the GUI's Tickets tab without a new code — the open case is the owner's standing consent.
  • Mirror the screenscrcpy over the same P2P channel, with tunable streaming quality for the car's mobile uplink.
  • Recover — run the DashDoctor plan → reinstall flow to repair or replace the car app over the live tunnel, without dropping the session.
  • Record — capture a session (--record) for evidence; the upload bills your operator wallet, and the owner must approve recording on the car first (two-party consent).
  • Wallet — each support ticket is a flat charge; check your balance and top up in the web console.

Next

On this page