Goal
A phone-friendly minimal UI for talking to the agent away from the desk (e.g. on a treadmill), exposed via ngrok http 8770.
Decisions (2026-07-17)
- Direction: chat-first (proposal B in
issues-drafts/mobile-ui/) — message-stream of user/Claude bubbles, live transcription growing inside the user bubble, thin activity status bar, always-visible mute, PTT button only when detection_mode == "ptt".
- Architecture: one Vue app, two layouts — mobile as a separate route/entry in
dashboard/, sharing components and hud.css tokens with the desktop HUD. NOT a media-query-responsive single page, NOT a separate hand-written HTML (today's mobile.py inline string drifts from the desktop).
- v1 scope: Claude activity, live transcript, chat history, mute (+ conditional PTT). No costs widget, no character panel.
Technical notes
mobile_server.py (port 8770) currently proxies only /status and /api/active-agent — needs /utterances and the mute toggle proxied too; serve the built mobile page instead of the MOBILE_HTML string.
- Browser mic on the phone requires HTTPS — ngrok provides it; verify the tab-audio WS (:8766) path works through the tunnel or is out of scope for v1 (view/control only).
🤖 Generated with Claude Code
Goal
A phone-friendly minimal UI for talking to the agent away from the desk (e.g. on a treadmill), exposed via
ngrok http 8770.Decisions (2026-07-17)
issues-drafts/mobile-ui/) — message-stream of user/Claude bubbles, live transcription growing inside the user bubble, thin activity status bar, always-visible mute, PTT button only whendetection_mode == "ptt".dashboard/, sharing components andhud.csstokens with the desktop HUD. NOT a media-query-responsive single page, NOT a separate hand-written HTML (today'smobile.pyinline string drifts from the desktop).Technical notes
mobile_server.py(port 8770) currently proxies only/statusand/api/active-agent— needs/utterancesand the mute toggle proxied too; serve the built mobile page instead of theMOBILE_HTMLstring.🤖 Generated with Claude Code