The cockpit server (dashboard_server.py, plus dashboard_replay.py and personas.py mounted on the same app) is a FastAPI
application on :8080 (TLS by default). This table is regenerated from the route decorators at every docs build by
scripts/routedoc.py; the anonymous? column is derived from the _PUBLIC_EXACT / _PUBLIC_PREFIXES allow-list in the auth
middleware.
Authentication. After a passkey login the browser holds a short-lived HS256 JWT. Send it as Authorization: Bearer <jwt> on
/api/* and as ?token=<jwt> when opening /ws/chat or /ws/voice. Anonymous /api/* → 401 {"error": …}; anonymous
WebSocket → close code 4401. auth.issue_token(subject, name, ttl=) mints long-lived service tokens for scripts and sibling
robots. See Auth.
Talking to the agent from a machine.POST /api/chat {"prompt": "…"} (or text, ≤ 600 chars) runs one synchronous agent turn (≤ 90 s, 504 on timeout) and returns
{ok, result, reply, seconds}. It is the target of tiny.technology's endpoint proxy — such turns get no fleet tools
(fleet=True), which enforces the one-hop depth cap described in Fleet.
Driving.POST /api/control {"linear": 0.4, "angular": 0, "duration": 0.3} is one frame; hold a stream of them for motion
(the cockpit joystick sends them while pressed). Both the thinker drive gate and the clamp apply.
On-device CA-trust helper: QR to /ca + iOS/Android step-by-step. · src
38 routes; 15 answer without a session (health, the passkey ceremony, the page shells and the trust/CA pages), every other /api/* route returns 401 to anonymous callers and the WebSockets close with 4401.
/ws/chat — open with ?token=<jwt>. Client sends {"type":"chat","text":"…"} (a bare string is treated as chat),
{"type":"control", "linear","angular","duration"} for joystick frames (answered with {"type":"control_ack"}, {"stop":true} on
release) and {"type":"ping"} → pong. The server streams the agent turn as {"type":"token","data","complete"},
{"type":"tool", …}, {"type":"reasoning","data"}, then {"type":"done","text"} or {"type":"error","error"}.
/ws/voice — binary PCM16 frames up (the browser mic); {"type":"voice_meta","rate"} once, then {"type":"audio","data":"<base64>"}
frames down; {"type":"stop"} ends the session. Provider and voice follow the dashboard config.