Created Last updated

Architecture note · James Meadlock & Milo

Video Ingestion Pipeline: the architecture we decided not to build

Decision update, August 4: this page is retained as historical architecture research, not an approved or deployed system. We did not create the LlamaIndex service, media workers, queue, or Supabase corpus described below. The current plan uses youtube-content, web_extract, and an experimental video_analyze lane.
How to read the research below. Video is not a document with a play button. A useful research system has to classify access, respect rights, preserve the clock, separate speech from visuals, and return an answer that points back to the moment where the evidence appeared. The vector database is almost the easy part.
Source classes4+
Deployment statusNot built
Current defaulttext first
Direct videoexperimental
Rights defaultfail closed

The architecture

A clean pipeline starts by admitting that the input is not clean. A public investor-relations page might expose an ordinary MP4, a Brightcove player with expiring HLS URLs, a registration form, or a replay whose terms prohibit retention. Those are different acquisition problems. They should still produce the same downstream research object.

Video ingestion architecture: direct media, captioned video, dynamic players, and registered webcasts pass through an access and rights gate; official transcripts, timestamped ASR, and selective visual analysis normalize into one node contract before Supabase retrieval and cited answers.

The end-to-end shape. Open the editable SVG.

There are three design decisions hiding in that diagram:

  1. Acquisition is an adapter layer. There is no universal “download webcast” call.
  2. The transcript and the clock travel together. Dropping segment times at any handoff destroys citation quality.
  3. Every source converges on one node contract. Retrieval should not care whether the words came from official captions, local ASR, or a human transcript.

Why acquisition is the hard boundary

The public examples are more varied than they look. TransUnion exposes investor-day videos from a company page.[10] Manulife uses Brightcove for its presentation videos and also publishes supporting material.[11] Restaurant Brands International has used Vimeo-backed event playback.[12] An Exelon replay on Notified asks for identity fields before playback.[13] Apple offers an earnings replay while explicitly restricting recording, reproduction, and redistribution.[9]

That is why browser automation is useful but not magical. A browser can establish JavaScript state, load an embedded player, submit an approved registration, and expose the media requests made by the page.[14] It cannot turn a prohibited use into a permitted one, and it should not be used to bypass DRM, CAPTCHA, or an access control.

Four video access classes: direct public media, dynamic public players, registration-required webcasts, and blocked or rights-restricted sources, with a safe acquisition action for each.

“The page loaded” is not the same as “the video was acquired.” Open the editable SVG.

ClassTypical sourceSafe action
public_directMP4, MP3, public captionsFetch, checksum, record terms and canonical page.
public_dynamicBrightcove, Kaltura, Vimeo, WistiaUse the public player session; preserve the landing page as the citation target.
registration_requiredNotified, Q4, ON24-style replaysUse an approved identity, retain session metadata, allow human review.
blocked_or_rightsDRM, CAPTCHA, restrictive termsStop, request permission, or index metadata only.
Fail closed. A missing rights decision is not an implicit yes. Store rights_flag beside the transcript so a later export cannot forget the condition under which the material entered the corpus.

The timestamp contract

For ordinary document RAG, a citation can point to a page. For video, the useful target is a time range. “This came from the earnings call” is provenance; “34:12–35:07” is a citation.

{
  "text": "...",
  "start_s": 2052.4,
  "end_s": 2107.1,
  "source_id": "event_2026_q3",
  "source_url": "https://company.example/investors/event",
  "speaker": "Chief Financial Officer",
  "transcript_kind": "official | captions | asr | human",
  "artifacts": ["deck:p14", "frame:2078.0"],
  "rights_flag": "owner_supplied | licensed | research_only",
  "payload_hash": "sha256:..."
}

That schema does more than support clickable links. It lets the system explain why a quote may be imperfect, deduplicate changing auto-captions, connect a spoken claim to a slide, and exclude material whose retention terms changed. Hash the transcript payload, not merely the video ID; auto-generated captions can change while the source identifier stays the same.

The quality gate is simple and unforgiving: retrieve a claim, open the source at start_s, and verify that the cited span actually supports the answer. A confident answer attached to the wrong moment is worse than an honest empty result.

Transcript first, visuals second

Investor videos tempt us into full multimodal analysis immediately. That is usually backwards. Most investor events already separate their strongest evidence into three artifacts:

Ingest those official artifacts first. Run ASR only when the official transcript is absent, incomplete, or too slow to arrive. Sample visual frames only at scene changes, slide transitions, or transcript windows where a speaker refers to something visible but unsaid. LlamaIndex’s own multimodal video examples extract frames and build a separate image/text retrieval path rather than treating a video as one native document.[6] Its VideoDB example likewise delegates video indexing and scene handling to a specialized system.[7]

Selective beats exhaustive. One frame every second creates a large, repetitive image corpus and still misses the semantic boundary between two slides. Scene-change sampling plus the published deck is cheaper, easier to audit, and usually better evidence.

Where LlamaIndex and LlamaParse fit

LlamaIndex is useful here, but it is not the downloader and it should not own the canonical corpus by default.

ComponentGood fitWhat it does not solve
LlamaIndex frameworkNode construction, metadata, ingestion workflows, retrieval experiments, response synthesis.Host-specific acquisition, durable rights policy, or timestamp preservation unless we implement it.
LlamaParseParsing presentation decks and documents; optional transcription of supported audio/video uploads.A complete native video-understanding pipeline with frame-time citations.
LlamaCloud IndexFast hosted prototype and managed retrieval.A reason to duplicate a private Supabase corpus we already control.
SupabaseCanonical metadata, full-text search, vectors if earned, provenance, access policy.Transcription and player acquisition.

LlamaParse currently lists audio and video formats including MP3, MP4, M4A, WAV, WebM, and several others.[1] Its pricing model meters audio/video by minute, while its documented limitations still matter for production sizing and unsupported cases.[2][3]

The stock open-source readers are a sharper warning. VideoAudioReader runs Whisper and returns transcription text as a document, but its implementation does not preserve Whisper’s segment-level timing in the returned document.[4] YoutubeTranscriptReader similarly joins caption text into a document rather than carrying each caption’s start and duration into retrieval metadata.[5] Those defaults are fine for “search this video.” They are insufficient for “prove this answer at the right second.”

LlamaCloud Index offers a managed ingestion and retrieval path.[8] For a small private research library, I would keep Supabase authoritative and treat LlamaIndex as a replaceable orchestration layer. If the framework earns its keep, keep it. If a 200-line ingestion worker is clearer and easier to test, use that instead.

A state ledger, not a Kanban OS

Durable workflow state is valuable. A visible task-management product is not required. Each source needs a machine-readable status, timestamps, attempt count, and a structured failure reason:

discovered → access_checked → acquired → transcribed → visual_enriched → qc_passed → indexed → citation_tested ↘ blocked(reason, retryable?) ↘ failed(reason, attempts)

This buys resumability without inventing seven agent personalities or making a human drag cards around. A worker claims the next eligible record, performs one bounded transition, writes evidence, and exits. A retry limit prevents one broken webcast from consuming the whole queue. Human review appears only where the machine cannot make an honest access, rights, or quality decision.

The user experience remains boring in the best way: search, ask, receive a sourced answer, click the timestamp, inspect the evidence.

The historical pilot — not approved for build

Do not start by promising every webcast platform. Start with five deliberately different sources:

  1. YouTube baseline: captions already exist; prove the timestamp contract.
  2. Direct public MP4: prove download, checksum, audio extraction, and ASR.
  3. Public embedded player: prove browser-assisted Brightcove or Vimeo acquisition.
  4. Registration-gated replay: prove session handling and the human-review boundary.
  5. Rights-restricted source: prove the pipeline stops instead of becoming “resourceful.”

For each source, ask the same five tests:

Only after that works should we add speaker diarization, scene extraction, OCR, multimodal reranking, or hosted workflow machinery. Those may be useful. None is more important than a citation that lands on the right second.

Bottom line. Build the research contract first: one canonical source, one rights decision, one timestamp-preserving node shape, one reproducible citation test. Everything else is an adapter.

Sources

  1. LlamaParse supported document types, accessed August 4, 2026.
  2. LlamaParse pricing, accessed August 4, 2026.
  3. LlamaParse limitations, accessed August 4, 2026.
  4. LlamaIndex VideoAudioReader source, accessed August 4, 2026.
  5. LlamaIndex YoutubeTranscriptReader source, accessed August 4, 2026.
  6. LlamaIndex multimodal RAG for video processing, accessed August 4, 2026.
  7. LlamaIndex multimodal VideoDB example, accessed August 4, 2026.
  8. LlamaCloud Index V2 getting started, accessed August 4, 2026.
  9. Apple Q3 2026 earnings call replay and usage notice, accessed August 4, 2026.
  10. TransUnion Investor Day videos, accessed August 4, 2026.
  11. Manulife Investor Day 2024, accessed August 4, 2026.
  12. Restaurant Brands International events and presentations, accessed August 4, 2026.
  13. Exelon Q4 2025 webcast replay, accessed August 4, 2026.
  14. Hermes browser automation documentation, accessed August 4, 2026.