# Video Mode — Deep Dive Video mode lets the assistant *see* the user (webcam) and their screen (screen share), in three presentations: frames attached to normal chat, a hands-free spoken call, and a full-screen Meet-style call. This doc covers the product flow, the technical pipeline, and the LLM prompt surface with exact pointers. ## Product flow The composer's video button (`chat-input-with-mentions.tsx`) toggles video mode; a chevron dropdown picks one of three modes (`VideoChatMode`): | Mode | What it does | |------|--------------| | `chat` — "Video + chat" | Camera on. Webcam (and screen-share) frames ride along with every typed or dictated message. Small PiP preview floats above the composer. | | `call` — "Video call (hands-free)" | Everything in `chat`, plus: continuous listening (each utterance auto-submits as a voice message) and forced full read-aloud TTS. No typing needed; composer still works. | | `meeting` — "Video call (full screen)" | Same pipeline as `call`, presented as a full-screen Meet-style layout: user tile + animated mascot tile, captions, control bar. | On top of any mode: - **Screen share** (`MonitorUp` buttons on the PiP overlay and the meeting control bar): captures the primary screen; frames go to the model as a separately labeled group. In the meeting view the screen becomes the big tile with user + mascot in a side rail. - **Camera off** (Meet-style mute): video mode and screen share keep running, no webcam frames are captured; tiles show a silhouette avatar. - **Mascot dismissal** (meeting view): swaps the animated mascot for a Meet-style letter avatar ("R"). - **Popout**: while screen sharing, if the app window loses focus (the user switched to the app they're sharing), a small always-on-top frameless window pops out with the user + mascot mini-tiles; refocusing dismisses it. Its expand button focuses the main window (`video:focusMain`). `call`/`meeting` options are disabled unless both voice input (Deepgram) and voice output (TTS) are configured. Entering a call saves the user's TTS settings and forces `full` read-aloud; leaving restores them. ## Frame pipeline `apps/renderer/src/hooks/useVideoMode.ts` runs one capture pipe per source (stream → offscreen `