# 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**: starting a screen share immediately pops the mini-call out into a small always-on-top frameless window (user + mascot tiles, live caption, control bar) that floats over every app — including Rowboat itself, since the shared screen may be Rowboat. It stays for the whole share (surviving app switches) and disappears when sharing stops or video mode ends. While sharing it is THE call surface: the in-app PiP hides, and presenting from the full-screen meeting collapses the meeting into it (restored when the share ends). Control-bar actions (camera toggle / stop share / end call) round-trip `video:popoutAction` → main → `video:popout-action` → app window, which owns the mic/camera/capture. The 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 `