Record your browser tab as a polished video with webcam overlay — or export as an animated GIF. One click to capture demos, tutorials, bug reports, and walkthroughs, right from your browser.
Install from the Chrome Web Store: coming soon — pending review.
Zero dependencies. Zero accounts. Zero cloud. Everything runs locally using browser APIs.
Most screen recorders need accounts, cloud uploads, or desktop apps. TalkOver is different:
Perfect for developers sharing bug reproductions, educators making walkthroughs, designers demoing flows, or anyone who needs a quick screen capture with a personal touch.
| Setting | Options | Default | |———|———|———| | GIF Frame Rate | 5, 10, 15, 24, 30 fps | 10 fps | | Scale | 100%, 75%, 50%, 25% | 100% | | Quality | Low, Med, High | Med | | Cursor | on / off | on | | Loop GIF | on / off | on | | Webcam Position | TL, TR, BL, BR | BR | | Webcam Shape | Rectangle, Square, Circle | Rectangle |
All settings persist across sessions.
Alt+Shift+R to start/stop recording without opening the popupgit clone https://github.com/NeoVand/TalkOver.git
chrome://extensions/ in ChromeComing soon.
Alt+Shift+R)The file downloads instantly with a timestamped filename.
popup.html/js/css UI — controls, preview, trim, webcam overlay, export
background.js Service worker — state machine, tab capture, message routing
offscreen.js Offscreen document — MediaRecorder, stream capture, blob storage
gif-worker.js Web Worker — frame quantization, LZW compression, GIF89a encoding
db.js IndexedDB wrapper — stores video, webcam, and GIF blobs
permissions.html/js Dedicated page for mic/camera permission prompts
┌─────────────────────────────────────────────┐
User clicks │ background.js │
Record ─────────>│ tabCapture.getMediaStreamId() │
│ reads tab dimensions (width × height) │
│ sends config to offscreen document │
└──────────────┬──────────────────────────────┘
│
┌──────────────v──────────────────────────────┐
│ offscreen.js │
│ getUserMedia(tab stream at native res) │
│ getUserMedia(webcam) ─> separate recorder │
│ getUserMedia(mic) │
│ mix tab audio + mic via Web Audio API │
│ MediaRecorder(tab video + mixed audio) │
│ MediaRecorder(webcam video) │
│ ──> blobs saved to IndexedDB │
└──────────────┬──────────────────────────────┘
│
┌──────────────v──────────────────────────────┐
User sees │ popup.js (done view) │
preview ─────────│ loads tab video from IndexedDB │
│ loads webcam video from IndexedDB │
│ overlays webcam via CSS (same as live) │
│ trim handles adjust clip range │
└──────────────┬──────────────────────────────┘
│
┌──────────────v──────────────────────────────┐
User clicks │ popup.js (export) │
Save ───────────>│ GIF: frame-by-frame canvas + webcam PIP │
│ quantize + LZW in Web Worker │
│ Video: canvas composite + MediaRecorder │
│ (in visible popup — not offscreen) │
│ ──> download │
└─────────────────────────────────────────────┘
Chrome’s canvas.captureStream() is broken in offscreen/hidden documents (Chromium #41270855, #41279417). Tab and webcam streams are recorded separately in the offscreen document, then composited during export in the popup where the canvas rendering pipeline is active.
The extension includes a from-scratch GIF89a encoder (no libraries):
All encoding runs in a Web Worker with progress updates streamed back to the UI.
| Permission | Why |
|---|---|
tabCapture |
Capture the active tab as a media stream |
activeTab |
Read the title of the tab you’re recording (so the file is named after it) |
offscreen |
Run MediaRecorder in a background document (MV3 requirement) |
storage |
Persist user settings and per-tab recording metadata across sessions |
No data leaves your browser. Recordings live in your browser’s IndexedDB until you start a new recording in that tab or close the tab; nothing is uploaded.
TalkOver does not collect, transmit, or store any personal data. All recordings live only in your browser’s local IndexedDB, are scoped per tab, and are cleared when you start a new recording in that tab or when the tab closes. No analytics, no telemetry, no network requests, no third-party fonts or scripts.
See PRIVACY.md for the full privacy policy used on the Chrome Web Store listing.
Contributions are welcome! Please open an issue or pull request.
MIT