Stream Transcript Extractor

Extract full transcripts from Microsoft Stream recordings — even when download is disabled. Defeats lazy-loaded panes with one click.

Extract Transcript
Drag the button to your bookmarks bar to install
On desktop, drag the button to your bookmarks bar.
On mobile, use the tab.
Bookmarks bar hidden? Press Ctrl+Shift+B to show it
🎯 How to Use
Four simple steps — takes under 60 seconds for any recording.
  1. 1

    Open the Stream Recording

    Navigate to the Microsoft Stream / SharePoint recording URL. Typically looks like https://[org].sharepoint.com/.../stream.aspx?id=...

  2. 2

    Open the Transcript Pane

    Click the "Transcript" button in the video player toolbar. Wait 2-3 seconds for the initial entries to appear on the right side.

  3. 3

    Click the Bookmarklet

    Click "📜 Extract Transcript" in your bookmarks bar. A progress overlay appears showing extraction status with a live entry counter.

  4. 4

    View Results in New Tab

    A new tab opens with the complete transcript — fully searchable, color-coded by speaker, and downloadable in 4 formats.

✨ Features
Everything you need to work with meeting transcripts efficiently.
🔄

Defeats Lazy Loading

Auto-scrolls the virtualized list across 3 passes to force all entries to render.

🔍

Full-Text Search

Instant search with highlighted matches. Overrides Ctrl+F for the transcript.

👥

Speaker Filtering

Toggle individual speakers on/off with filter chips. Isolate who said what.

🎨

Color-Coded Speakers

8 distinct colors auto-assigned to speakers for easy visual scanning.

📄

Download as .txt

Clean plain text format with speaker headers and timestamps.

🗂️

Download as .json

Structured data with metadata — perfect for programmatic use.

🎬

Download as .srt

Subtitle format compatible with video players and editors.

📊

Download as .csv

Spreadsheet-ready with columns for index, timestamp, speaker, text.

📋

Copy to Clipboard

One-click copy of the entire formatted transcript.

🔒

100% Client-Side

No data leaves your browser. No server. No tracking. Fully local.

🔁

Auto-Updates

Script fetched fresh from source on every click. Always latest version.

Zero Install

Just a bookmark. Works in Chrome, Edge, Firefox. No extension needed.

⚙️ How It Works
Microsoft Stream's transcript pane uses a virtualized list — only rendering entries visible in the viewport. This makes it impossible to select-all or copy. The download button is also permission-locked.
🔖
Bookmarklet Click
Tiny loader in your bookmarks bar — fetches the main script
📡
Fetch Script from Gist
Main extraction logic loaded fresh (cache-busted) every time
📜
Auto-Scroll Transcript Pane
Scrolls in 280px increments, 160ms delay — forces lazy list to render all items
🧲
Collect DOM Entries
Reads speaker, timestamp, text from each rendered cell. Deduplicates via index Map.
🔁
3 Complete Passes
Re-scrolls from top multiple times — fills gaps from virtualization destroying earlier items
Open Results in New Tab
Self-contained HTML page with search, filter, color coding, and 4 export formats
🔎 DOM Selectors Used
Selector Purpose
[data-testid="scroll-to-target-targeted-focus-zone"] Scrollable transcript container
[data-list-index] Individual transcript entry cells
[class*="itemDisplayName"] Speaker name element
[id^="Header-timestamp-"] Timestamp element
[id^="sub-entry-"] Transcript text content
🛠️ Troubleshooting
Common issues and their fixes.
Nothing happens when I click the bookmarklet

Chrome may have stripped the javascript: prefix. Right-click the bookmark → Edit → confirm the URL starts with javascript:. Also ensure you're on the Stream recording page, not a blank tab or the installer page.

Alert says "Transcript pane not found"

The transcript panel must be open and visible before clicking the bookmarklet. Click the "Transcript" button on the video player first. Wait 2-3 seconds for at least a few entries to appear, then click the bookmarklet.

Only partial entries were extracted

For very long recordings (1hr+), the script runs 3 scroll passes which covers most cases. If entries are still missing, simply run the bookmarklet a second time — it will re-extract from scratch. You can also try waiting a moment after opening the transcript pane to ensure it fully initializes.

New tab doesn't open or gets blocked

Your browser's popup blocker may have intercepted it. Look for a blocked popup icon (usually in the address bar, right side). Click it and select "Always allow popups from this site." Then try again.

Script fails to load (network error)

Your corporate VPN or proxy might block GitHub Gist URLs. Workaround: Open the raw script, copy its entire content, then paste it directly into the browser console (F12 → Console → Paste → Enter) on the Stream page.

Works in Chrome but not in Firefox

Ensure the bookmark URL starts with javascript: — Firefox is stricter about this. Firefox may also show a notification bar asking to allow the popup. Click "Allow" and the results tab will open.

Entries show wrong speaker attribution

The script inherits speaker identity from the nearest header element above each entry. If Stream groups multiple consecutive entries under one speaker header without repeating the name, the script carries the last known speaker forward. This matches Stream's own display behavior.

Extraction takes very long / seems stuck

For recordings over 2 hours, extraction may take 2-3 minutes. The progress overlay shows a live counter — if it's still incrementing, it's working. The "stuck" detection (6 consecutive failed scrolls) will naturally end each pass when the bottom is reached.

🔧 Manual Installation
If drag-and-drop doesn't work in your browser, create the bookmark manually.
  1. 1

    Show Bookmarks Bar

    Press Ctrl+Shift+B (Windows/Linux) or Cmd+Shift+B (Mac).

  2. 2

    Create a New Bookmark

    Right-click the Bookmarks Bar → "Add page..." or "Add bookmark". Alternatively, open Bookmark Manager with Ctrl+Shift+O.

  3. 3

    Set Name & Paste URL

    Set name to anything (e.g., "📜 Extract Transcript"). Paste the code below as the URL:

javascript:void((async()=>{try{var r=await fetch('https://gist.githubusercontent.com/dog-broad/6f9c99d3e3d11a5af9ba198bab9e2e6d/raw/transcript-extractor.js?v='+Date.now());if(!r.ok)throw new Error('HTTP '+r.status);var t=await r.text();eval(t);}catch(e){alert('Failed to load transcript extractor: '+e.message);}})())
  1. 4

    Save — You're Done

    Click Save. The bookmarklet is now in your bookmarks bar, ready to use on any Stream recording page.

💡 How updates work

The bookmarklet is just a tiny loader (~200 bytes). Every time you click it, it fetches the latest version of the extraction script from this Gist. When the script is updated, everyone automatically gets the new version — no reinstall needed.

🛡️ Console Fallback

If the bookmarklet doesn't work at all due to strict enterprise policies, you can always paste the script directly into the browser console. Press F12 → Console tab → paste the raw script content → press Enter.