Ethan Hennenhoefer

Case study 01

Scribe

Scribe turns Google Meet's built‑in captions into a live, speaker‑attributed transcript, and Claude checks your meeting agenda off in real time with the quote that proves each item was actually covered.

Year
2026 · v1.9 · 18 releases
Role
Everything: design, build, ship
Stack
Chrome extension (MV3) · vanilla JS · Supabase · Vercel · Claude API
Live
scribe-meets.vercel.app ↗
Scribe mid-meeting: live speaker-attributed transcript on the left, agenda on the right with six of ten items checked by Claude, each showing an evidence quote
Mid‑meeting: live transcript, capturing status, and the agenda checking itself off

01

The problem

Every meeting‑transcription tool I could find fails at least one of five constraints that matter in real client calls.

The unlock: Google Meet's caption engine already does free, real‑time, speaker‑labeled speech‑to‑text. A Chrome extension can read that caption text straight out of the Meet page, so the transcription work is already done. Scribe captures it, streams it to the cloud, and builds intelligence on top.

02

The in-Meet sidebar

You don't have to leave the call to see it working. The extension injects a small agenda panel directly into the Google Meet page, so items tick off in the corner of the meeting while you talk. Only the host runs the extension, and everyone else sees a completely normal call.

A Google Meet call with Scribe's agenda panel injected on the right: five of ten items checked off live during the meeting
Live in Google Meet: the agenda ticks itself while the call runs

03

How it works

  1. 01

    Capture

    A Manifest V3 content script watches the Meet caption DOM and emits every caption with its speaker name. It survives tab backgrounding via a chrome.alarms heartbeat and self‑heals if Meet redraws the caption container.

  2. 02

    Stream

    The extension's service worker signs in to Supabase over plain REST and upserts each caption row. Partial captions and their final version merge into one row, and writes are serialized so a final can never be overtaken by an earlier partial.

  3. 03

    Render

    The web app is one dependency‑free vanilla‑JS page. It backfills the transcript with a single query, then subscribes to Supabase Realtime so new lines appear live, color‑coded by speaker, with in‑progress lines dimmed until finalized.

  4. 04

    Think

    A Vercel serverless function on a cron sends new transcript lines to Claude, which evaluates them against the agenda. When an item is genuinely covered, it gets checked with a confidence score and a verbatim evidence quote. A cheap anything‑new check keeps API usage near zero.

  5. 05

    Own your data

    Every table is scoped by user with Postgres row‑level security, so each account only ever sees its own meetings. Email auth with verification and password reset.

04

Around the product

05

The hard parts

What I took away: the best solution came from deleting a working version. The bot build functioned, but it failed the constraint that actually mattered to users, and recognizing that early is what made the final product feel obvious instead of clever.

Next case study Onset →