{"slug": "show-hn-turn-narrated-screen-recordings-into-data-for-ai-agents-local-mit", "title": "Show HN: Turn narrated screen recordings into data for AI agents (local, MIT)", "summary": "A new open-source MCP server called talkthrough-mcp, released under the MIT license, lets developers turn narrated screen recordings into structured data for AI agents without any cloud dependency. The tool runs locally using ffmpeg, faster-whisper, and RapidOCR, providing timestamped transcripts, speaker labels, keyframes, and OCR text through lazy retrieval tools that prevent context overflow. Its wall-clock timestamp anchoring distinguishes it from existing screen-recorder SaaS and video-analyzer MCPs, enabling agents to directly correlate moments like 'the checkout hung' with server logs.", "body_md": "[Quickstart](#quickstart) · [Tools](#tools) · [FAQ](#faq) ·\n[Troubleshooting](/korovin-aa97/talkthrough-mcp/blob/main/docs/TROUBLESHOOTING.md) · [Changelog](/korovin-aa97/talkthrough-mcp/blob/main/CHANGELOG.md) ·\n[Contributing](/korovin-aa97/talkthrough-mcp/blob/main/CONTRIBUTING.md)\n\n**Feedback ingestion for AI agents.** Record your screen and talk; your agent\ndoes the rest — files the bugs, writes the spec, builds the backlog.\n\n`talkthrough-mcp`\n\nis a local-first MCP server that turns a narrated screen\nrecording (or any video/audio file) into agent-ready structured data:\ntimestamped transcript segments, optional who-said-what speaker labels,\nscene-change keyframes, OCR'd on-screen text, and wall-clock anchoring.\nEverything is served through lazy retrieval tools, so a 30-minute recording\nnever floods the model context — the agent pulls exactly the transcript\nslice, moment bundle, or frame it needs.\n\nThere is no LLM inside the server and no cloud anywhere in the path: ffmpeg,\nfaster-whisper, and RapidOCR run on your machine, and the calling agent brings\nthe intelligence. What makes it different from screen-recorder SaaS and\nvideo-analyzer MCPs: it works on arbitrary local files, it ships the agent\nworkflows (server prompts + example agents), and it anchors every timestamp to\n**wall-clock time** — so \"the moment I said the checkout hung\" maps straight to\nthe right window of your server logs.\n\nOne command, no system dependencies: ffmpeg falls back to a bundled build,\nOCR is pip-only, and whisper models download themselves on first use. The\nonly prerequisite is [uv](https://docs.astral.sh/uv/) (`brew install uv`\n\nor\n`curl -LsSf https://astral.sh/uv/install.sh | sh`\n\n).\n\nTwo install paths — **pick one**, not both (the plugin already includes\nthe server; installing both would register it twice):\n\n**Server only** — the 7 tools + 5 prompts, and nothing else on your\nsystem. Choose this for a minimal setup, or when you manage MCP servers\nyourself across several clients:\n\n```\nclaude mcp add -s user talkthrough -- uvx \"talkthrough-mcp[diarization]\"\n```\n\n**Full plugin** — the same server, plus native slash commands\n(`/talkthrough:triage-recording`\n\n, …) that handle the ceremony for you,\na ready-made triage subagent, and an agent skill that teaches Claude the\nworkflow. Choose this for the best out-of-the-box experience:\n\n```\n/plugin marketplace add korovin-aa97/talkthrough-mcp\n/plugin install talkthrough@talkthrough\n```\n\n**OpenAI Codex CLI**\n\n`~/.codex/config.toml (or project-scoped .codex/config.toml in trusted projects)`\n\n:\n\n```\n[mcp_servers.talkthrough]\ncommand = \"uvx\"\nargs = [\"talkthrough-mcp[diarization]\"]\n```\n\nMore: `integrations/codex/`\n\n**OpenCode**\n\n`opencode.json (project) or ~/.config/opencode/opencode.json`\n\n:\n\n```\n{\n  \"mcp\": {\n    \"talkthrough\": {\n      \"type\": \"local\",\n      \"command\": [\n        \"uvx\",\n        \"talkthrough-mcp[diarization]\"\n      ],\n      \"enabled\": true\n    }\n  }\n}\n```\n\nMore: `integrations/opencode/`\n\nAny other MCP stdio client uses the same server command: `uvx \"talkthrough-mcp[diarization]\"`\n\n.\nPer-engine folders with exactly these snippets plus verification steps live\nin [ integrations/](/korovin-aa97/talkthrough-mcp/blob/main/integrations); agents can self-install via\n\n[.](/korovin-aa97/talkthrough-mcp/blob/main/llms-install.md)\n\n`llms-install.md`\n\nMulti-person recordings (meetings, interviews, panels) can carry `S1`\n\n/`S2`\n\n/…\nspeaker labels. Every install button, snippet, and the plugin above already\nship the `[diarization]`\n\nengine, so asking your agent \"who said what\" just\nworks — diarization itself still runs only when requested per call\n(`process_media(path=..., diarize=true, num_speakers=<count if known>)`\n\n),\nand its models download once on first use.\n\nPrefer the minimal server without the diarization engine? Use\n`uvx talkthrough-mcp`\n\nas the command instead (the MCP registry entry also\nresolves to this lean form) — an explicit `diarize=true`\n\nwill then answer\nwith the one-line install fix. Details in\n[Speakers](#speakers-optional-diarization).\n\n```\ngit clone https://github.com/korovin-aa97/talkthrough-mcp\nclaude mcp add talkthrough -- uv run --directory /path/to/talkthrough-mcp talkthrough-mcp\n```\n\nThen, in your agent:\n\nProcess\n\n`~/Desktop/recording.mov`\n\nand triage it — or just invoke the`triage-recording`\n\nserver prompt.\n\n| Tool | What it does |\n|---|---|\n`process_media(path, recorded_at?, vocabulary?, language?, model?, diarize?, num_speakers?, force?)` |\nIngest a video/audio file: local STT, keyframes, OCR, wall-clock, opt-in speaker labels. Returns a compact summary. Idempotent by content hash — re-calls are instant; `diarize=true` on a processed job adds speakers without re-transcribing. |\n`get_transcript(job_id, start_ms?, end_ms?, format?)` |\nPaginated transcript as `segments` , `text` , or `srt` (speaker-prefixed when diarized, plus a roster header); truncation returns `next_start_ms` . |\n`get_frames(job_id, at_ms? | start_ms?+end_ms?, max_frames?, include_duplicates?)` |\nKeyframe images nearest a timestamp or evenly thinned across a range (unique frames by default, max 6/call); each frame names its absolute `path` . |\n`get_moment(job_id, start_ms, end_ms)` |\nThe \"one remark\" bundle: transcript slice + up to 3 frames + their OCR text + wall-clock range (+ `speakers_in_range` when diarized). |\n`search(job_id, query)` |\nSubstring search over the transcript AND on-screen OCR text; hits carry `t_ms` /`t_wall` , frame refs, and the speaker when diarized. |\n`extract_frame(job_id, at_ms, crop?)` |\nExact-timestamp full-resolution re-extract from the source video (optional crop) when keyframes miss the instant; returns the file's absolute `path` . |\n`list_jobs()` |\nRecent processed recordings with durations, wall-clock starts, counts, and speaker counts when diarized. |\n\nEvery tool description ships 10+ usage examples, so agents pick the right tool without extra prompting.\n\n| Prompt | Workflow |\n|---|---|\n`triage-recording` |\nNarrated screencast → precise findings JSON (bug/feature/question routing, frame evidence) |\n`spec-from-workshop` |\nRecorded workshop → structured spec with quoted decisions and open questions |\n`backlog-from-demo` |\nProduct demo → prioritized backlog with timestamped evidence |\n`meeting-actions` |\nMeeting audio → action items, decisions, open questions |\n`correlate-with-logs` |\nRecording remarks ↔ system logs via wall-clock windows |\n\nThe same prompts live as plain files in [ examples/prompts/](/korovin-aa97/talkthrough-mcp/blob/main/examples/prompts)\nif your client doesn't surface MCP prompts. The findings contract used by\n\n`triage-recording`\n\nis [.](/korovin-aa97/talkthrough-mcp/blob/main/examples/output-contract.schema.json)\n\n`examples/output-contract.schema.json`\n\nThe same workflow ships as a cross-engine [Agent Skill](https://agentskills.io)\nat [ .agents/skills/talkthrough/](/korovin-aa97/talkthrough-mcp/blob/main/.agents/skills/talkthrough) — Claude Code,\nCodex CLI (\n\n`$talkthrough`\n\n), Cursor, Copilot, Gemini CLI, Goose and other\nSKILL.md-compatible tools read it. Agents without MCP wiring can drive the\n[CLI](#cli)directly:\n\n`talkthrough-mcp process recording.mov --json`\n\nprints the\nsame summary the MCP tool returns, and the job store is shared either way.Every timestamped result carries both `t_ms`\n\n(video-relative) and `t_wall`\n\n(ISO 8601 real time) once the recording start is known. Resolution ladder:\n\n`recorded_at`\n\nparameter (agent/user override) → confidence`exact`\n\n- QuickTime\n`com.apple.quicktime.creationdate`\n\ntag, carries the local timezone (QuickTime Player recordings; ⌘⇧5 wrote it before macOS 26) →`high`\n\n- Container\n`creation_time`\n\ntag (UTC) →`medium`\n\n— macOS 26+ ⌘⇧5/ReplayKit screen recordings land here (no`creationdate`\n\ntag anymore); pass`recorded_at=`\n\nwhen local-tz`t_wall`\n\nmatters - File mtime minus duration (recorders finalize files at recording END) →\n`low`\n\n- Nothing → tools still work with relative\n`t_ms`\n\nonly\n\nWhy it matters: \"the upload spinner froze *here*\" becomes a ±30 s grep window\nin your server logs.\n\nWith the `[diarization]`\n\nextra installed (included in every generated config —\nsee [Quickstart](#who-said-what-speaker-diarization--included-in-the-configs-above)),\n`process_media(diarize=true)`\n\nlabels who said what — locally, like everything\nelse here ([sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) runtime, no\ntorch, no accounts, no GPU):\n\n- Speakers become\n`S1`\n\n,`S2`\n\n, …**in order of first appearance**; every transcript segment gets a`speaker`\n\n, and the tools surface it everywhere — roster with talk time in`get_transcript`\n\n,`speakers_in_range`\n\nin`get_moment`\n\n,`speaker`\n\non`search`\n\nhits,`S1:`\n\nprefixes in the text/SRT formats, a speaker count in`list_jobs`\n\n. **Know the headcount? Pass** Clustering to an exact k removes the main failure mode of unknown-count mode (similar voices merging or one voice splitting). Agents are instructed to do this via the tool guidance; do the same in your own calls.`num_speakers`\n\n.**Already processed a recording?** Calling`process_media(diarize=true)`\n\non it re-runs*only*diarization — whisper is not re-run, and labels appear in the existing job in seconds. Same for changing`num_speakers`\n\n.- Labels are anonymous by design; mapping\n`S1`\n\n→ \"Alice\" is the calling agent's job (self-introductions, vocatives, the`attendees`\n\nargument of the`meeting-actions`\n\nprompt). The server never guesses names.\n\nModels download once (~47 MB total) from pinned, checksum-verified URLs into\n`~/.talkthrough/models/`\n\n; warm runs are zero-network like the rest of the\npipeline. Speed on an M-series CPU (4 threads): a 26-minute meeting diarizes\nin about 2 minutes (RTF ≈ 0.08), on top of the transcription time. Memory:\nexpect on the order of 1–1.5 GB peak RSS while an hour-plus meeting is being\ndiarized (measured on a real 73-minute recording); it is released when the\nstage completes.\n\n| Role | Model | Download | Weights license |\n|---|---|---|---|\n| Segmentation |\n|\n\n[NeMo](https://github.com/NVIDIA/NeMo)`en_titanet_small`\n\n[WeSpeaker](https://github.com/wenet-e2e/wespeaker)`en_voxceleb_resnet34_LM`\n\n[3D-Speaker](https://github.com/modelscope/3D-Speaker)`campplus_sv_en_voxceleb_16k`\n\nThe default won a real-meeting accept-eval (RU/EN/ES + a 3-speaker 26-minute\nmeeting): it was the only candidate to isolate all three real voices at\n`num_speakers=3`\n\n, at 2× the speed of the runner-up.\n\nPick an alternate embedding model (or point at your own `.onnx`\n\nfile for\noffline machines) via `TALKTHROUGH_DIARIZATION_EMB_MODEL`\n\n; tune the\nunknown-count sensitivity via `TALKTHROUGH_DIARIZATION_THRESHOLD`\n\n(see\n[docs/TROUBLESHOOTING.md](/korovin-aa97/talkthrough-mcp/blob/main/docs/TROUBLESHOOTING.md)). Honest quality notes\nlive in [Limitations](#limitations).\n\nEverything runs locally: your recordings never leave your machine, speech is\ntranscribed by a local whisper model, OCR and speaker diarization are local\nONNX inference, and there is no telemetry. The only network access is one-time\ntool/model downloads (ffmpeg build, whisper model, OCR models, diarization\nmodels — the latter pinned by URL + sha256). Diarization keeps no voiceprint\ndatabase: voice embeddings live only in process memory, and only anonymous\nturn labels (`S1`\n\n/`S2`\n\n) land on disk.\n\nNarration in any of Whisper's ~99 languages works: the language is\nauto-detected per recording, and the summary reports both `language`\n\nand\n`language_probability`\n\nso agents can tell a confident detection from a shaky\none (silence or music at the start can fool the detector — pin it with\n`language=\"ru\"`\n\nand `force=true`\n\nwhen that happens). Speaker diarization is\nacoustic — it fingerprints voices, not words — so it is language-independent\nand works across all of those languages unchanged.\n\nPick the model for your languages — per call (`model=`\n\nparameter, agents do\nthis themselves when a transcript comes back garbled) or as the server\ndefault (`TALKTHROUGH_WHISPER_MODEL`\n\n):\n\n| Model | Size | Best for |\n|---|---|---|\n`small` (default) |\n464 MB | English and major-language narration on CPU |\n`large-v3-turbo` |\n~1.5 GB | recommended for non-English — near-large quality at near-small speed |\n`medium` |\n~1.5 GB | conservative alternative to turbo |\n`tiny` / `base` |\n75–145 MB | quick drafts, CI |\n`*.en` variants |\n— | English-only, slightly faster/better for EN |\n\nTips that work in every language: pass product names via\n`vocabulary=\"Term1, Term2\"`\n\n(biases the decoder so jargon survives), and note\nthat the workflow prompts instruct agents to write digests in the\n**narrator's language** while keeping quotes verbatim — the server never\ntranslates (exact quotes are evidence; translation is the agent's job).\n\nOn-screen text (OCR) defaults to RapidOCR's Latin + Chinese models. For other\nscripts set `TALKTHROUGH_OCR_LANG`\n\nto your language — `ru`\n\n/`uk`\n\n(→ the\n`eslav`\n\npack), `ja`\n\n, `ko`\n\n, `ar`\n\n, `hi`\n\n, `el`\n\n, `th`\n\n, or any RapidOCR pack name\nlike `cyrillic`\n\n— and reprocess with `force=true`\n\n; the matching recognition\nmodel downloads once. Spoken-language support is unaffected either way.\n\n| Env var | Default | Meaning |\n|---|---|---|\n`TALKTHROUGH_WHISPER_MODEL` |\n`small` |\ndefault whisper model (`tiny` /`base` /`small` /`medium` /`large-v3` /`large-v3-turbo` ); the `model` tool param overrides per call |\n`TALKTHROUGH_OCR` |\n`on` |\nset `off` to skip OCR |\n`TALKTHROUGH_OCR_LANG` |\nLatin+Chinese | recognition script for on-screen text: a language code (`ru` , `ja` , `ko` , `ar` , `hi` , …) or a RapidOCR pack name (`eslav` , `cyrillic` , `latin` , …); the model downloads once |\n`TALKTHROUGH_OCR_PARAMS` |\n— | advanced: JSON object of raw RapidOCR params merged over the derived ones, e.g. `{\"Rec.lang_type\": \"cyrillic\"}` |\n`TALKTHROUGH_DIARIZE` |\n`off` |\nset `on` to diarize by default (needs the `[diarization]` extra; degrades with a warning without it); an explicit `diarize` tool param always wins |\n`TALKTHROUGH_DIARIZATION_THRESHOLD` |\n`0.5` |\nclustering sensitivity when `num_speakers` is unknown: fewer speakers than expected → lower it; more → raise it |\n`TALKTHROUGH_DIARIZATION_SEG_MODEL` |\n`pyannote-segmentation-3-0` |\nsegmentation model: allowlist name or a path to a local `.onnx` (offline preseed) |\n`TALKTHROUGH_DIARIZATION_EMB_MODEL` |\n`nemo_en_titanet_small` |\nembedding model: allowlist name (see\n`.onnx` path |\n\n`TALKTHROUGH_DIARIZATION_THREADS`\n\n`min(4, cpus)`\n\n`TALKTHROUGH_MAX_SECONDS`\n\n`7200`\n\n`TALKTHROUGH_MAX_FRAMES`\n\n`600`\n\n`duration/budget`\n\non long recordings)`TALKTHROUGH_HOME`\n\n`~/.talkthrough`\n\nThe pipeline is also a CLI — useful for pre-processing long recordings outside an agent session (the store is content-addressed, so the agent then queries the same job instantly):\n\n```\ntalkthrough-mcp process ~/Videos/long-session.mov   # prints the summary\ntalkthrough-mcp process demo.mov --json             # machine-readable\ntalkthrough-mcp process sync.m4a --diarize --num-speakers 3   # who said what\ntalkthrough-mcp gc --keep-days 30                   # clean the job store\ntalkthrough-mcp serve                               # stdio MCP server (default)\n```\n\nFirst run notes: missing system ffmpeg triggers a one-time `static-ffmpeg`\n\ndownload; the first transcription downloads the whisper model (~460 MB for\n`small`\n\n); both are cached. After that, expect roughly 3× faster than real time\non an Apple-Silicon CPU with the default model, OCR included (a 2-minute clip\nprocesses in ~40 s) — and instant re-runs on the same file. Progress streams\nas MCP progress notifications, and the CLI prints stage lines. More:\n[docs/TROUBLESHOOTING.md](/korovin-aa97/talkthrough-mcp/blob/main/docs/TROUBLESHOOTING.md).\n\nCI runs lint, the unit suite, a full CLI smoke, and a diarize smoke on\n`windows-latest`\n\n(static-ffmpeg Windows build, whisper `tiny`\n\ntranscription,\nOCR, the instant idempotent re-run, and a speaker-roster assert through the\nnative sherpa-onnx stack). Notes: the per-job lock is POSIX `fcntl`\n\nand\ndegrades to a no-op on Windows — fine for a single-user machine; quote paths\nwith spaces (`uv run talkthrough-mcp process \"C:\\Videos\\Screen Recording.mp4\"`\n\n).\nIf something breaks, please open an issue.\n\nVideo: `.mov`\n\n`.mp4`\n\n`.webm`\n\n`.mkv`\n\n— audio-only: `.m4a`\n\n`.mp3`\n\n`.wav`\n\n`.ogg`\n\n`.flac`\n\n(transcript tools only; frame tools explain why they're unavailable).\nLocal files only.\n\nHonest edges, so you can decide fast:\n\n**Speaker labels are segment-level and opt-in.** Diarization assigns each whisper segment ONE speaker by dominant overlap — a segment spanning a fast exchange gets the majority voice, sub-second interjections (\"yeah\", \"mhm\") can be absorbed, and heavy crosstalk degrades clustering (the segmentation model tracks at most 2 simultaneous voices). Quality is pyannote-3.x-generation. The comfort zone without hints is roughly 2–8 speakers;**pass**— it removes the worst failure mode at any size, and it is the way to go for large meetings (10+).`num_speakers`\n\nwhenever the headcount is known**Local files only.** No URL/YouTube ingestion ([#5](https://github.com/korovin-aa97/talkthrough-mcp/issues/5)) — download first.**Keyframes + transcript, not motion analysis.** A glitch*between*scene changes can be invisible in the frame set;`extract_frame`\n\nre-checks any instant, but frame-by-frame motion reasoning is your multimodal model's job.**STT quality tracks the model you pick.** The default`small`\n\nfavors speed; non-English narration wants`model=\"large-v3-turbo\"`\n\n(see[Languages](#languages)).**OCR reads crisp UI text well;** tiny or low-contrast print is best-effort.**Wall-clock confidence depends on recorder metadata**— worst case pass`recorded_at=`\n\n(see the ladder above).**Windows caveats**— POSIX lock degrades to a no-op; see the Windows section above.\n\n| talkthrough | cloud recorder SaaS | meeting notetakers | typical video-analyzer MCPs | |\n|---|---|---|---|---|\n| Runs fully locally | ✅ | ❌ | ❌ | varies |\n| Any local video/audio file | ✅ | browser/app captures | meetings only | ✅ |\n| Wall-clock anchoring (log correlation) | ✅ | ❌ | ❌ | ❌ |\n| Who-said-what speaker labels | ✅ local, opt-in | some | ✅ cloud | ❌ |\n| Ships agent workflows (prompts, skill, findings contract) | ✅ | ❌ | ❌ | ❌ |\n| OCR of on-screen text, searchable | ✅ | some | ❌ | rare |\n\n**Why not just upload the video to a multimodal model (e.g. Gemini)?**\nFor a short, non-sensitive clip — do that. The trade-offs appear with length\nand sensitivity: an hour of screen recording costs on the order of a million\ntokens *per question*, the file leaves your machine, and you still can't map a\nremark to `14:32:07 UTC`\n\nto grep your server logs. talkthrough indexes once,\nlocally, then answers any number of follow-ups from the index.\n\n**Why not screenpipe?**\nDifferent job. screenpipe is an always-on recorder of *your* machine going\nforward (commercial license). It can't open the `.mov`\n\na teammate or customer\njust sent you. talkthrough analyzes any file it's handed — the two compose\nfine.\n\n**There are agent skills that \"watch\" videos. Why a server with an index?**\nWatch-style skills push a budgeted frame dump into the context window (and go\nsparse on long videos), often call cloud STT for the audio, and keep nothing.\ntalkthrough builds a persistent local index — transcript + OCR, full-text\nsearchable — retrieves exact frames lazily, anchors everything to wall-clock\ntime, and answers the next question without reprocessing.\n\n**I use Jam for bug reports — do I need this?**\nKeep Jam for browser bugs: console+network captured at record time is great\nevidence. talkthrough covers what a browser extension can't — desktop apps,\nmobile screencasts, ops incidents, meetings, any file — with no account, and\ncorrelates with *server-side* logs via wall-clock time.\n\n**Which agent model do I need to drive this?**\nWe ran a 150-run battery against v0.2.0 — 6 model configs (Claude haiku/sonnet/opus, Codex gpt-5.5 at two reasoning efforts + gpt-5.4-mini) × 10 verbatim-identical task prompts × 5 real recordings (30 s–73 min, RU/EN, 1–5 speakers), scored by a strict LLM judge plus mechanical evidence checks. Short version: point lookups and search (\"who said X and when\") worked on **every** tier tested; minutes-with-owners and evidence-disciplined name mapping want the top tiers; reasoning effort moved results more than model family. Full matrices — score × time × tokens on every intersection — in [docs/MODEL-NOTES.md](/korovin-aa97/talkthrough-mcp/blob/main/docs/MODEL-NOTES.md).\n\n**Can't I just script ffmpeg + whisper myself?**\nYes — that's exactly this pipeline. What you'd be rebuilding: scene-change\ndetection with perceptual dedup, OCR, transcript+OCR search, the wall-clock\nladder, MCP tools with embedded usage examples, five workflow prompts, and a\nfindings contract. One `uvx`\n\ncommand instead of an afternoon of glue.\n\n**Is it really local? What leaves my machine?**\nNothing at runtime. The network is used only for one-time downloads (ffmpeg\nbuild, whisper/OCR/diarization models). No telemetry. See [Privacy](#privacy)\n— and [SECURITY.md](/korovin-aa97/talkthrough-mcp/blob/main/SECURITY.md) treats a violation of this promise as a\nvulnerability.\n\nMachine-readable entry points, so AI agents can install and use this server without a human reading docs:\n\n— step-by-step install instructions for agents`llms-install.md`\n\n— index of the documentation`llms.txt`\n\n— an`.agents/skills/talkthrough/SKILL.md`\n\n[Agent Skill](https://agentskills.io)teaching the tool workflow; discovered automatically inside a checkout by Codex CLI (`$talkthrough`\n\n) and readable by Claude Code, Cursor, Copilot, Gemini CLI and other SKILL.md-compatible tools— instructions for coding agents contributing to this repo`AGENTS.md`\n\n— MCP registry manifest`server.json`\n\n— per-engine adapters, all generated from one source of truth and drift-tested (incl. the Claude Code plugin under`integrations/`\n\n)`integrations/claude-code/`\n\nURL/YouTube ingestion · persistent speaker-name labels (`label_speakers`\n\n) ·\nword-level speaker splitting · cloud STT · embeddings/semantic search ·\nhosted/remote mode · `.mcpb`\n\nbundle · whisper.cpp backend\n\nMIT", "url": "https://wpnews.pro/news/show-hn-turn-narrated-screen-recordings-into-data-for-ai-agents-local-mit", "canonical_source": "https://github.com/korovin-aa97/talkthrough-mcp", "published_at": "2026-07-22 13:02:56+00:00", "updated_at": "2026-07-22 13:22:51.698676+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-agents", "machine-learning", "natural-language-processing"], "entities": ["talkthrough-mcp", "ffmpeg", "faster-whisper", "RapidOCR", "Claude", "OpenAI Codex CLI", "OpenCode", "Astral uv"], "alternates": {"html": "https://wpnews.pro/news/show-hn-turn-narrated-screen-recordings-into-data-for-ai-agents-local-mit", "markdown": "https://wpnews.pro/news/show-hn-turn-narrated-screen-recordings-into-data-for-ai-agents-local-mit.md", "text": "https://wpnews.pro/news/show-hn-turn-narrated-screen-recordings-into-data-for-ai-agents-local-mit.txt", "jsonld": "https://wpnews.pro/news/show-hn-turn-narrated-screen-recordings-into-data-for-ai-agents-local-mit.jsonld"}}