Until the first stable release, only the latest tagged public-beta release is supported. Reports must include the exact DSH version, plugin commit or tag, operating system, architecture, and whether LAN or Funnel mode was used.
Do not open a public issue containing pairing codes, APNs device tokens, provider keys, relay credentials, private hostnames, conversation content, or an unpatched exploit. Use GitHub private vulnerability reporting for Mars-Sea/dsh-deeppilot when available. Otherwise open a minimal issue asking for a private contact channel without sensitive details.
/phone/pairaccepts only a short-lived, single-use pairing code and a P-256 public key. The code expires after five minutes and is invalidated after one successful registration./phoneupgrades anonymously, then sends a fresh 30-second challenge bound to the stable Host audience. The client proves possession of its registered P-256 private key with ECDSA/SHA-256.- The iOS app uses a non-exportable Secure Enclave key on physical devices. The Mac stores only public keys and metadata.
GET /phone/healthis intentionally unauthenticated and returns only minimal readiness/version facts.- Protocol v1, shared Bearer tokens, query credentials, and
c2s.hello.authare not accepted. There is no remote downgrade switch. - The server enforces explicit protocol scopes, while the normal settings UI grants the default scope set and exposes only the global connection switch plus per-device deletion. Deleting a device disconnects it immediately.
- The canonical
$DSH_HOME/deeppilotdirectory is repaired to mode0700.host-idanddevices-v2.jsonare owner-only. - The independent LAN listener (default port
3098) is TLS-only: the plugin serves a self-signed EC P-256 certificate, and the app pins its SPKI fingerprint delivered inside the pairing QR. There is no trust-on-first-use; a regenerated key forces re-pairing. The private key lives owner-only under$DSH_HOME/deeppilot/lan-tls/. Never forward the LAN port to the public Internet; public access should use Funnel HTTPS/WSS. - The LAN listener and Funnel helper publish only
/phone,/phone/pair, and/phone/health, never the complete DSH Web UI. - Logs must never include pairing codes, key material, APNs tokens, or message bodies.
- The Funnel helper allows at most 60 requests per source per minute and 600 globally. Concurrent WebSockets per public source are configurable from 1 to 16 and default to 8.
- The Node bridge independently allows at most 12 anonymous authentication or pairing attempts per source per minute, 120 globally, and two concurrent unauthenticated WebSockets per source.
- Five failures within ten minutes block that source for 15 minutes. A blocked request receives HTTP 429 with
Retry-After. - The bridge ignores caller-supplied forwarding headers on non-loopback sockets.
- Audit logs use process-local salted hashes, preventing stable source/device correlation across restarts.
If a QR code is exposed before expiry, invalidate it or issue a new one. If a paired device is lost or suspected compromised, delete that device from the settings list; other devices remain valid.
Verify the public-beta helper from the repository root with:
cd bin && shasum -a 256 -c SHA256SUMSDeveloper ID signing and notarization remain release gates for broad end-user distribution.