Vibe Engines
YouTube

Vibe Engines is free, interactive AI engineering & system design — runs in your browser. Pick a learning path

AI System Design

Design an AI Notetaker

Step 1 / 9

Learn AI system design by building an AI meeting notetaker step by step.

The numbers to beat~real-timestreaming first pass2nd passoffline cleanup of hard audioper wordtimestamp + confidence

The whole design, in writing

Every step of the build above, written out: the problem each piece solves, the option that was taken and the ones that were not, the numbers, and how it fails in production.

The big idea

Meetings are where decisions go to be forgotten

Companies run on meetings, and meetings run on the worst storage medium ever invented: human memory. Decisions evaporate, action items orphan, and the one person who remembers "we already decided this in March" left the company. An AI notetaker turns an hour of messy multi-speaker audio into structured, searchable, actionable record — if you can solve capture, transcription, attribution, extraction and trust, live.

MeetingZoom · Meet · Teams
New in this step: Meeting.

A pipeline: a bot that joins the call under consent rules, streaming ASR + diarization producing a speaker-attributed transcript, an LLM pass that extracts decisions and action items with timestamped receipts, a memory that makes months of meetings searchable, and delivery into the tools where work actually happens.

What the new pieces do

Meetingclient
The live call: multiple speakers, screen shares, jargon, interruptions — an hour of unstructured audio that contains real decisions.

Step 1 · Get the audio

The capture bot

Before any AI: how do you get clean audio out of a Zoom call? The options shape everything downstream — a phone on the table hears the room; a per-participant stream hears each person.

MeetingZoom · Meet · TeamsCapture Botjoins as participant
New in this step: Capture Bot.

How should the system capture meeting audio?

  1. One mixed-down stream, whatever that laptop hears — speakers blended together, no per-person channels, quality hostage to one machine. Diarization starts life crippled.

  2. The bot is a first-class attendee: visible to everyone (consent!), platform-blessed, and — where the API offers it — receiving separated per-participant audio, which makes "who said what" nearly free.

  3. N installs, N OS permission fights, N reasons the meeting starts without capture. The bot needs zero attendee setup.

A Capture Bot joins through the platform’s API (Zoom/Meet/Teams), appears in the participant list by name, and streams audio out — per-speaker channels where the platform provides them, a mixed stream plus voice separation where it doesn’t. Visible presence is a feature: everyone knows the meeting is being recorded.

Why this piece earns its place

The bot is not a service in the usual sense — it is a client, one long-lived media session held open for the length of a call, and that changes how you size the fleet. Capacity is counted in concurrent meetings, not requests, and meetings do not arrive evenly: they start on the hour and the half hour, so a fleet planned against the average is short exactly when every call begins at once, and the ones it turns away started on time. The failure worth designing for is the join, not the stream — waiting rooms, a host who admits participants by hand, a passcode, a meeting that runs late, someone removing the bot mid-call. Each yields a transcript that exists, parses and reads as complete while the opening is simply missing, a gap no error rate will show you because every word present is correct. So record coverage explicitly: which spans the bot was in the room for, carried with the recording, so nothing downstream summarises a stretch nobody captured. You can skip the fleet entirely if you are single-platform and every call is already cloud-recorded — you trade the live surface for somebody else’s infrastructure.

What the new pieces do

Capture Botbackend
A headless participant that joins via the platform’s API, announces itself, and streams per-speaker audio out of the call.

Step 2 · May we even record?

Consent is architecture, not a checkbox

Recording laws differ by state and country (one-party vs all-party consent), companies have no-record norms, and some calls — HR, legal, health — must never touch the pipeline. Where does consent live?

Capture Botjoins as participantConsent & Policywho may record
New in this step: Consent & Policy.

How does the system handle recording consent?

  1. Legally flimsy in all-party-consent jurisdictions and socially corrosive everywhere. Nobody reads the ToS; everybody notices a secret recorder.

  2. The recording WAS the violation. All-party-consent law doesn’t offer an undo, and neither does trust.

  3. Consent as code: the bot announces itself, honors "don’t record this call/series," respects per-region rules, and retention timers delete on schedule.

A Consent & Policy layer gates the bot: audible/visible announcement on join, host controls and opt-outs, calendar- and keyword-based no-record rules, jurisdiction-aware defaults, and per-workspace retention policies that hard-delete on schedule. The audit log records who accessed what, forever.

Why this piece earns its place

Two things about consent only surface once this is running. First, jurisdiction is a property of the participants, not of the meeting. One attendee dialling in from an all-party state makes the whole call all-party, and the participant list keeps changing after the bot joins — so the check belongs on every join event, not one decision at the top of the call. The half nobody specifies is what that re-check does to audio already captured: when a late arrival tightens the rules, the policy has to say whether the earlier minutes survive. Second, retention is a delete problem, and by the last step of this design the same sentence lives in the transcript store, the memory index, a recap email, a task in the tracker, a CRM field and a provider’s logs. A timer that sweeps one store is theatre. Several of those copies must be content, not a link — a task with an owner and a due date is useless as a URL — so deletion is a fan-out of writes, one per destination, and every artifact records where it was written and which meeting it came from. What you cannot reach that way belongs in the policy you publish, not the one you enforce.

What the new pieces do

Consent & Policyservice
Enforces recording law and company policy: announcement, opt-outs, no-record calendars, and per-workspace retention rules.

Back of the envelope

join announcement
the bot is visibly, audibly present
no-record rules
calendars, keywords, series, HR/legal blocklists
retention timers
hard delete per workspace policy
access audit
every view of every meeting, logged

Step 3 · Words and voices

Streaming ASR + diarization

Now the pipeline earns its keep: turn audio into text (ASR) and attribute every word to a person (diarization). Meetings are the adversarial case — jargon, accents, interruptions, laughter, "can you see my screen?"

Streaming ASRspeech → textDiarizationwho said what
New in this step: Streaming ASR, Diarization.

Transcribe live during the call, or batch-process the recording after?

  1. Batch is simpler and slightly more accurate, but it forfeits the live product surface: in-call captions, real-time highlights, "catch me up, I just joined." The market moved live.

  2. Stream for the live experience (captions, running notes), then re-transcribe hard segments offline with a bigger model and full context. Two passes, each doing what it’s best at.

  3. The search-across-months product (step 6) needs everything. Selective capture guts the memory.

Streaming ASR transcribes in near-real-time — primed with a custom vocabulary (attendee names, product terms) and emitting per-word timestamps and confidence. Diarization attributes speech using per-participant channels when available, voice fingerprinting when not. A post-call second pass cleans up the hard segments.

Why this piece earns its place

Two passes means two transcripts of the same hour, and reconciling them is what bites. If a segment’s identity comes from the streaming pass’s utterance boundaries, the cleanup pass renumbers the record, and every citation made during the call — a live highlight, a note already shared — now points at different words. Anchor identity to time, so the second pass revises text inside a stable span instead of re-cutting it. The other thing worth saying is that diarization does not produce people. It produces consistent anonymous clusters — speaker one, speaker two — and turning those into names is a separate join against the participant list: a conference room is one participant and several voices, and somebody who never speaks sits on the list all hour. Cluster count and attendee count need not agree, and where they don’t the system should say it is unsure rather than put a name on a decision. Build the affordance that lets someone fix that mapping once, because one correction re-owns every action item in the meeting. And expect the live text to rewrite itself: streaming ASR revises words as context arrives, so anything reading the stream must tolerate text changing underneath it.

  • ~real-timestreaming first pass
  • 2nd passoffline cleanup of hard audio
  • per wordtimestamp + confidence

What the new pieces do

Streaming ASRservice
Transcribes audio in near-real-time, primed with attendee names and product vocabulary. Emits words with timestamps and confidence.
Diarizationservice
Attributes every word to a speaker — from per-participant audio channels when the platform provides them, voice fingerprints when it doesn’t.

Step 4 · The durable record

One transcript store, everything points at it

Words, speakers, timestamps, confidence — where does it all live, and in what shape? The schema decision here quietly determines whether summaries can carry receipts later.

Streaming ASRconfidence-scoredDiarizationwho said whatTranscript Storewords · speakers · t
New in this step: Transcript Store.

What is the canonical stored form of a meeting?

  1. Summaries are derived artifacts. Store only the derivative and you can never re-derive, re-verify, or answer "what EXACTLY was said?"

  2. The transcript is the source of truth; summaries, action items and search results all cite segment IDs. Receipts become structural.

  3. Audio is the backup, not the record — unsearchable, unquotable, and expensive to reprocess for every question.

The Transcript Store holds the canonical record: segments with speaker, start/end timestamps, text and confidence — plus a pointer to the audio span. Everything downstream (summaries, tasks, search hits) references segment IDs, so every claim about the meeting has a receipt you can click and hear.

Why this piece earns its place

The segment boundary rule is an API, and you choose it once. Artifacts hold segment ids forever, so deciding later that utterances were the wrong unit — too short to hold an argument, too long to quote — re-ids the whole corpus and breaks every citation already sitting in a task or a CRM field. It is the cheapest decision on this page today and among the most expensive to revisit. Second: a correction is an append, not an update. Audio stays the ground truth, and an edited segment has to carry who changed it and when, because the question that eventually arrives is not what was said but who altered the record and whether they were in the room. One step downstream, that means an artifact cites a segment revision, not merely an id — otherwise re-deriving quietly rewrites a recap somebody already read and acted on, with nothing marking that it moved. Storage shape follows the same split: segments are small and stay hot, audio is the expensive half and tiers down, so click-to-hear carries a retrieval delay on old meetings. Decide whether you tell the user that, or pin the audio spans an artifact actually cites.

What the new pieces do

Transcript Storestore
The durable record: timestamped, speaker-attributed, confidence-scored segments. Every downstream artifact points back here.

Step 5 · From words to work

Grounded extraction: decisions, actions, owners

An hour of transcript is still an hour of reading. The product is the distillation: what was decided, who owes what by when. And here lives the notetaker’s scariest failure mode — a fluent summary of things nobody said.

Transcript Storewords · speakers · tUnderstanding LLMdecisions · actions
New in this step: Understanding LLM.

How does the LLM turn a transcript into notes users can trust?

  1. Fluent, plausible, and occasionally fabricated. An invented action item with a real person’s name attached is a trust-ending event.

  2. Every extracted item carries segment IDs — clickable receipts. Items that can’t cite a segment don’t ship. Extraction becomes checkable, not vibes.

  3. Meetings don’t talk like that — decisions emerge across ten fuzzy minutes. This is why LLM understanding is the unlock; regexes never worked.

The Understanding LLM produces structured outputs — summary sections, decisions, action items with owner and due date — and every item is grounded: it must cite the segment IDs (and thus timestamps) it derives from, with low-confidence audio flagged rather than paraphrased confidently. Click any note, hear the moment it came from.

Why this piece earns its place

A model asked to emit segment ids will emit plausible segment ids. Grounding is only real if the citation is verified after generation, mechanically: every id resolves, belongs to this meeting, and — with a second cheap pass — actually supports the claim it is attached to. Skip that check and grounding is a prompt instruction, which is to say a suggestion, and a fabricated item now ships wearing a receipt. That is worse than an uncited one, because the receipt is the signal that tells a reader somebody checked. The operational half is identity. Extraction runs again after the cleanup pass and again after every human correction, so an action item needs stable identity derived from what it cites and who owns it, not a fresh id per generation. Get that wrong and re-deriving a meeting after one fixed name opens a second ticket for work that already exists — which earns a notetaker a reputation for noise faster than any hallucination will.

What the new pieces do

Understanding LLMservice
Reads the transcript and extracts the meeting’s structure: summary, decisions, action items with owners — each grounded to segment timestamps.

Step 6 · The compound asset

Meeting memory: search across months

One meeting’s notes are convenient. The moat is longitudinal: "what did we tell this customer about pricing?", "when did we last discuss the migration?", "what did I promise legal?" — questions that span dozens of meetings nobody will re-read.

Transcript Storewords · speakers · tMeeting Memorysearch across months
New in this step: Meeting Memory.

How do months of meetings become answerable?

  1. "Pricing" appears in 200 meetings. Keyword search finds the word; the question needs the discussion — meaning, speakers, dates, decisions.

  2. Months of meetings is millions of tokens per query — slow, expensive, and context-rotted. Retrieval exists for exactly this.

  3. Hybrid retrieval scoped by metadata, answers that quote and link the exact moments. The notetaker becomes the company’s conversational memory.

Meeting Memory indexes segments and extracted items — embeddings for meaning, metadata (speakers, attendees, date, customer) for filtering. Questions run retrieval-augmented answers that quote segments with links, scoped by the asker’s access rights. This is where a notetaker becomes organizational memory.

Why this piece earns its place

Semantic similarity has no sense of time, and that is what hurts here. Ask what was decided about pricing and the index returns March and September, both genuinely about pricing — and the answer confidently reports a decision overturned months ago. Neither is stale, which is what makes it hard: both are accurate records of what was said. Recency weighting is the floor; the real fix is linking decisions on a subject into a chain, so an answer can say it was decided once and changed later, which is usually what the asker needs. The second production surprise is that rights move and an index does not. Narrowing on workspace, attendees and the meeting ACL before ranking is the right mechanism — where those values come from is the bug. Copy a permission snapshot into the index at write time and it is a cache nobody invalidates: someone leaves the team, a meeting is locked down, an attendee is removed, and the filter keeps matching the row it stored. It fails open, silently, because over-broad retrieval looks exactly like retrieval that worked. Resolve rights against the live source on every query, build the filter from what comes back, and pay the lookup.

What the new pieces do

Meeting Memorystore
Embeddings + metadata over every past meeting: "what did we decide about pricing in March?" answered with quotes and links.

Step 7 · Meet users where work happens

Delivery and the feedback loop

Notes nobody sees change nothing. The recap has to reach email/Slack, action items have to become tracked tasks with owners, sales calls have to update the CRM — and user corrections have to flow back in.

Consent & PolicyMeeting MemoryDeliveryTelemetry / Audit
New in this step: Delivery, Telemetry / Audit. · swipe to pan the diagram

What happens with the finished notes?

  1. Another inbox nobody checks. The value of an action item is zero until it exists where tasks are actually tracked.

  2. Deliver into the workflow, not beside it. And every human edit (fixed transcript, corrected owner) is training signal + audit trail.

  3. Nobody reads an hour of transcript; sending it all also maximizes the privacy surface. Deliver the distillation; link the receipts.

Delivery pushes each artifact to its home: recap to email/Slack, action items into the task tracker with owners and due dates, structured fields into the CRM for customer calls. Corrections flow backward — an edited segment re-derives its artifacts — and everything lands in the audit/telemetry stream: WER by meeting type, extraction-accuracy evals, access logs.

Why this piece earns its place

Delivery is the only place this system writes into tools it does not own, and those writes are not reversible the way a bad summary is. A wrong task gets assigned, notified and half-discussed before anyone checks it; deleting it unsends none of that. Delivery is also a fan-out of independent writes, so it needs per-destination state: Slack takes the recap, the tracker refuses it because the project requires a field nobody mentioned, and one delivered flag on the meeting is a lie. And every owner has to survive a lookup in another system — the tracker wants an account, the CRM a contact, and the meeting hands you a display name a human chose. Where that fails, ship the item unassigned and say so rather than guess the nearest match. Then the thing that quietly misleads teams: corrections are not a sample. You only get an edit for a meeting somebody read, and those are the important ones and the obviously broken ones. Word error rate over corrected segments is not the fleet’s, and it will look like it is improving while the untouched long tail does not move. Use corrections to decide where to look; keep a separate randomly sampled labelled set for the number you report.

  • tasksborn with owners + due dates
  • editsflow back and re-derive
  • WER + evalstracked per meeting type

What the new pieces do

Deliveryservice
Pushes artifacts where work happens: recap email, tasks into the tracker with owners, CRM fields updated from sales calls.
Telemetry / Auditbus
Quality and access logs: word-error-rate tracking, extraction accuracy evals, and who viewed which meeting — the audit trail.

The payoff

You built an AI meeting notetaker

From an hour of chaotic multi-speaker audio to a trustworthy record: a consented capture bot, streaming ASR with a cleanup pass, diarization that names every voice, a canonical timestamped transcript, grounded extraction with clickable receipts, memory that answers questions across months, and delivery into the tools where work happens.

MeetingCapture BotConsent & PolicyStreaming ASRDiarizationTranscript StoreUnderstanding LLMMeeting MemoryDeliveryTelemetry / Audit
The finished design, end to end. · swipe to pan the diagram

Now unleash the crosstalk and watch error containment work: confidence flags, grounded-only summaries, editable transcripts, and corrections that repair every downstream artifact.

Everything you assembled, in order

  • Capture bot — platform API, per-speaker streams, visibly present
  • Consent as code — announcements, no-record rules, retention timers
  • Stream + cleanup — live ASR pass, offline second pass on hard audio
  • Diarization — attribution turns transcripts into evidence
  • Segment IDs — one canonical store; every artifact carries receipts
  • Grounded extraction — no citation, no claim — hallucination contained
  • Meeting memory — RAG across months, scoped by access rights
  • Deliver + learn — artifacts into real tools; corrections flow back

Where an interviewer pokes next

Getting the boxes right is the easy half. These are the questions that separate a candidate who drew the diagram from one who has run the thing. Answer each one out loud before you open it.

  1. The platform API sometimes gives one mixed audio stream, not per-speaker channels. What happens to diarization then?

    It falls back to voice fingerprinting on the mixed stream — clustering segments by acoustic voice signature instead of by channel. It works, but it’s noticeably weaker on overlapping speech and similar-sounding voices, which is exactly why "join via the API" beats "record the room": you get per-channel audio whenever the platform will give it to you, and fingerprinting is the fallback, not the plan.

  2. Why does the consent layer block the bot outright instead of just muting note-taking for sensitive calls?

    Because the harm is the recording, not the note. A muted bot that’s still capturing and buffering audio is still a data-handling liability — an all-party-consent violation doesn’t care whether a summary got written. Blocking join (or leaving immediately) means no audio ever enters the pipeline for that call, which is the only version of "safe" that survives a legal audit.

  3. An action item can’t find a transcript segment that supports it. What actually happens to it?

    It gets dropped from the shipped output, not softened into vague language. The grounding requirement is binary: cite a segment or don’t ship. A "maybe someone said this" item is worse than no item — it looks exactly as confident as a grounded one, so the system would rather under-report than let ungrounded claims through with equal authority.

  4. Meeting memory answers "what did we tell this customer about pricing" by searching across months of calls. What stops it leaking a meeting from a team that shouldn’t see it?

    Every retrieval is scoped by the asker’s access rights before ranking, not after — the metadata filter (workspace, attendee list, meeting ACL) narrows the candidate set first, so a document the asker can’t see is never embedded into the answer, not just hidden from the final display. Filtering after retrieval is the version that leaks through summarization.

  5. How would a multi-language meeting — three attendees, three native languages — change this pipeline?

    ASR needs per-segment language detection (not one global setting), diarization is unaffected since it’s acoustic not linguistic, and the Understanding LLM either extracts per-language or normalizes to one working language for the summary — but grounding still has to point at the original-language segment, so a translated action item’s "receipt" is audio in a language the reader may not speak. That’s a real open edge, not a solved one.

Check yourself — the answers, and why

Eight steps in, these are the calls you should be able to make cold. Pick one, then read why.

  1. Why does the capture bot join as a visible participant?

    Visible presence satisfies consent norms and law, and API capture delivers separated per-participant audio that makes diarization tractable.

  2. Why must extracted action items cite transcript segment IDs?

    An item that can’t cite the moment it came from doesn’t ship. Receipts make extraction checkable and trust survivable.

  3. The canonical stored record of a meeting is…

    Store the evidence, derive the artifacts. Summaries and tasks are regenerable views over segments.

  4. Why is diarization so valuable?

    Who-said-what is what makes summaries actionable and accountable — and overlapping speech is what makes it hard.

  5. A calendar invite for an HR call accidentally lets the bot in. What should happen?

    The harm is the recording itself, not just the summary — consent has to gate capture, not just output. A muted-but-listening bot is still a liability.

How you’d open this design in an interview

Before any boxes: agree what it must do, pin the qualities that shape everything, then build — naming each trade-off as you make it. The walkthrough above is that exact order.

What it must do

Agree on these before drawing a single box.

  • Capture: a bot joins the call under consent rules and streams per-speaker audio out.
  • Transcribe + attribute: streaming ASR plus diarization — who said what, with timestamps.
  • Extract: an LLM pulls decisions and action items with owners, grounded to segments.
  • Remember: make months of meetings searchable across calls.
  • Deliver: push recap, tasks and CRM updates into the tools where work happens.

The qualities that shape everything

Each one names the mechanism that buys it.

Consent survives a legal audit
A Consent & Policy layer gates the bot — join announcement, no-record rules, retention timers, access audit — enforced before capture starts.
Attribution turns a transcript into evidence
Diarization attributes every word to a speaker via per-participant channels, falling back to voice fingerprinting on a mixed stream.
Every claim has a clickable receipt
The Transcript Store holds timestamped, speaker-attributed, confidence-scored segments that every downstream artifact points back to by segment ID.
Notes users can trust, not fabrications
Grounded extraction: decisions/actions must cite the segment IDs they came from, or they don’t ship.
Answer questions across months of calls
Meeting Memory indexes segments + extracted items (embeddings + metadata), answered with quoted segments and scoped by access rights.
Notes actually change something
Delivery pushes artifacts into the real tools (email/Slack, tracker, CRM) and flows corrections back as an eval/audit signal.

The trade-offs you say out loud

Senior signal isn’t the boxes — it’s naming what you gave up and why it was the right price.

A visible bot on the platform API over recording one participant’s system audio

A mixed room stream blends speakers and starts diarization crippled. API capture gives per-speaker channels and its visible presence satisfies consent.

Consent as architecture over a line in the terms of service

In all-party-consent jurisdictions the recording is the violation and there is no undo. Policy has to gate capture in the architecture, not sit in settings nobody reads.

Store the segments, derive the artifacts over storing only the polished summary

Keep only the derivative and you can never re-derive, re-verify, or answer "what exactly was said?". Segment IDs make receipts structural.

Grounded structured extraction over free-form "summarize this meeting"

Fluent summaries occasionally fabricate an action item with a real person’s name attached. No citation, no claim — the grounding requirement is binary.

RAG over meetings over keyword search across transcripts

"Pricing" appears in 200 meetings; the question needs the discussion — meaning, speakers, dates, decisions — not just the word.

The answer, out loud

What a strong answer to “Design an AI Meeting Notetaker” sounds like, first question to last trade-off. It is about 7 minutes of talking; the whiteboard and the interviewer fill the rest of the 45. Read it aloud once, then close the page and give it yourself.

  1. 0–3 min

    What the record has to be

    Let me say what we’re actually building, because it shapes every box. A meeting is an hour of unstructured multi-speaker audio that happens to contain real decisions, and it runs on human memory. So the output isn’t a summary — it’s a record: what was decided, who owes what, and a way to check any of it against the moment it was said. I’d hold myself to that word, trustworthy, the whole way, because a notetaker that’s fluent and occasionally wrong is worse than none.

  2. 3–8 min

    Get the audio from the platform

    I’d start with capture, because everything downstream inherits it. The option I’d reject is recording one participant’s system audio — one mixed-down stream, hostage to a single laptop, and diarization starts life crippled. So: a bot that joins through the platform API, appears in the participant list, and streams audio out — per-speaker channels where Zoom or Meet or Teams give them, a mixed stream plus voice separation where they won’t. The bot being visible isn’t a cost; it’s the consent story doing double duty.

    Built in step 1: The capture bot
  3. 8–13 min

    Consent is a component, not a setting

    Consent comes next, because it’s the thing that ends deployments. Recording law differs by state and country, and in an all-party jurisdiction the recording itself is the violation — there’s no undo, so record-everything-and-delete-on-complaint isn’t a plan. I’d make it a policy engine that gates the bot before capture starts: the join announcement, opt-outs, no-record rules keyed to calendars and keywords for HR and legal calls, retention timers that hard-delete per workspace, and an access log of every view. It fails closed, because a bot that stays on the call and just doesn’t transcribe is still recording.

    Built in step 2: Consent is architecture, not a checkbox
  4. 13–20 min

    Words, then voices

    Then the hard part, and it’s two things. ASR turns audio into text; diarization says who said it. I’d stream the first pass rather than batch it, because the live surfaces — in-call captions, catch me up — are the product now, then run a higher-accuracy pass after the call over the hard segments. I’d prime it with attendee names and product terms, and emit per-word timestamps and confidence. Diarization uses per-participant channels when the platform offers them and voice fingerprints when it doesn’t. Attribution is the point: someone said we should delay launch is trivia; the VP of Sales said delay is a decision record.

    Built in step 3: Streaming ASR + diarization
  5. 20–26 min

    Store the evidence, derive the rest

    Now the schema decision, which settles whether the later promises are keepable. The canonical stored form isn’t the polished summary and isn’t the raw audio — it’s timestamped, speaker-attributed, confidence-scored segments with a pointer to the audio span, and everything downstream references segment IDs. Store only the summary and you can never re-derive, re-verify, or answer what exactly was said. Keep only audio and it’s unsearchable and expensive to reprocess. Pointing at IDs is what makes corrections pay: fix one segment and every artifact citing it gets rebuilt.

    Built in step 4: One transcript store, everything points at it
  6. 26–33 min

    Extraction that has to cite

    Extraction is where the scariest failure lives — a fluent summary of things nobody said, with a real person’s name on an invented action item. So I wouldn’t ask for a free-form summary. I’d ask for structured output: summary sections, decisions, action items with owner and due date as typed fields, and every item has to cite the segment IDs it came from. That requirement is binary — no citation, no ship. It suppresses fabrication, since you can’t cite what wasn’t said, and it builds the trust UI for free. Low-confidence passages get flagged, not paraphrased confidently.

    Built in step 5: Grounded extraction: decisions, actions, owners
  7. 33–38 min

    The part that compounds

    One meeting’s notes are convenient; the asset is longitudinal — what did we tell this customer about pricing, what did I promise legal, across dozens of calls nobody will re-read. Keyword search only finds the word, and pricing appears in two hundred meetings. Feeding every transcript to the model per question is millions of tokens and context rot. So it’s retrieval over the segments and the extracted items — embeddings for meaning, metadata for filtering by speaker, date and attendees — quoting exact moments, scoped by rights I resolve at query time rather than trust the index to remember. Memory that leaks across teams is a lawsuit, not a feature.

    Built in step 6: Meeting memory: search across months
  8. 38–43 min

    Notes that reach the work

    Last piece: notes nobody sees change nothing. I’d push each artifact to its home — recap to email or Slack, action items into the tracker with owners and due dates, structured fields into the CRM for sales calls — rather than into another app nobody logs into. I’d send the distillation with links to the receipts, not the full transcript to everyone, which nobody reads and maximises the privacy surface. Then the loop: every human edit, a fixed name or a re-owned task, flows back, re-derives its artifacts, and lands in telemetry beside word error rate by meeting type.

    Built in step 7: Delivery and the feedback loop
  9. 43–45 min

    The trade-off, and what I’d do next

    The through-line is that every choice trades coverage against trust. Streaming buys the live product and costs accuracy until the second pass. Grounding costs you items — one that can’t cite a segment gets dropped rather than softened — and I’d take that trade every time, because under-reporting is recoverable and a confident fabrication isn’t. Visible capture costs a little candour in the room and buys the consent story. With more time I’d go at multi-language meetings, where the receipt is audio in a language the reader may not speak, and at the live in-call surfaces the streaming pass makes possible.

What this teaches

Learn AI system design by building an AI meeting notetaker step by step. An interactive guide covering the capture bot that joins calls, streaming speech-to-text, diarization (who said what), grounded LLM understanding that extracts decisions and action items with timestamped receipts, searchable meeting memory across months of calls, consent and retention rules, and delivery into the tools where work actually happens.

Key takeaways

  • Capture bot — platform API, per-speaker streams, visibly present
  • Consent as code — announcements, no-record rules, retention timers
  • Stream + cleanup — live ASR pass, offline second pass on hard audio
  • Diarization — attribution turns transcripts into evidence
  • Segment IDs — one canonical store; every artifact carries receipts
  • Grounded extraction — no citation, no claim — hallucination contained
  • Meeting memory — RAG across months, scoped by access rights
  • Deliver + learn — artifacts into real tools; corrections flow back

Concepts covered

  • Meetings are where decisions go to be forgotten
  • The capture bot
  • Consent is architecture, not a checkbox
  • Streaming ASR + diarization
  • One transcript store, everything points at it
  • Grounded extraction: decisions, actions, owners
  • Meeting memory: search across months
  • Delivery and the feedback loop
RUN IT YOURSELF

The 0.8-second segment that gave the action item to the wrong person

Fifty seconds of a stand-up, cut into the sub-utterance windows a diarizer actually scores, attributed two ways from one identical set of speaker scores — independent argmax per segment, and the same scores decoded with a turn-taking prior — running for real in your browser. It prints speaker error rate, the number of speaker turns each invents, and who ends up owning the action item. Change SWITCH_PENALTY, hit Run, and watch the owner change with it.

HOW TO READ THE CODE — 5 IDEAS
  1. Diarization is what makes the transcript evidence rather than trivia (step 3). Same scores, two decoders: 14.8% vs 6.2% speaker error, and 17 turns vs 8 against a reference of 10.
  2. A segment's log-likelihood is a sum over its frames, so it scales with duration, and its embedding noise falls as 1/sqrt(duration). Argmax decides each window alone, so every flip the noise causes survives into the record.
  3. The prior only has to charge a constant to fix it: a flip inside somebody else’s turn is an island and pays that constant twice — out and back — while a genuine handover pays it once, because the change at the far end happens either way. That 2× asymmetry deletes fragments far harder than it deletes turns, and the file prints both prices in seconds of clean audio (1.33 s and 0.67 s at P=3).
  4. The page stores speaker-attributed segments and grounds every action item to segment ids (steps 4–5). Here argmax flips segment 16 — "I will take that one", 0.8 s — so the grounded item ships with a receipt and the wrong owner, which is worse than no item at all.
  5. It is not free and not magic. The prior erases Dana's real 0.4 s "mhm", the overlap segment is error no single-label decoder can remove (step 3: overlapping speech is why this is genuinely hard), and past the sweep's minimum the prior outvotes real turns until the meeting collapses to one speaker.
CPython · WebAssembly
built to be reasoned about, not memorized — make the calls, unleash the crosstalk, run the quiz.
Finished this one? 0 / 65 AI System Designs done
NextDesign a Conversational AI Closest AI system design to this one

Explore the topic

See this alongside everything else on the same subject — handbooks, system designs, challenges and tools, in one place.

More AI System Designs