Cueprecise
CuePrecise is an MCP server that turns long YouTube videos into a searchable local evidence bundle—transcripts, speakers, timestamps, and frames—so AI clients can answer questions with cited proof.
Analyze videos: Register a YouTube URL and run the full pipeline (fetch, transcribe, assemble, merge chapters, extract frames, index).
Check progress: Query job status, chunk progress, generated artifacts, and estimated local Gemini usage.
Get an outline: Retrieve a timestamped chapter outline; optionally write and save improved chapter titles.
Search evidence: Ask questions and get relevant transcript spans, speaker info, confidence, and related frames with timestamps.
Extract excerpts: Pull transcript text and frames for a specific time range.
Manage summaries: Create or retrieve a video summary, or validate and save a host-improved structured summary.
Extract frames on demand: Generate frames around screen references, recovered terms, or custom timestamps.
Clean up data: Purge derived results, audio chunks, source video, raw materials, or everything explicitly.
Support Korean subtitles: Through related tools, the server can provide subtitle work packets and viewer links (Korean-only translation target).
Indexes YouTube videos by transcribing original speech, aligning captions, detecting speakers, and capturing frames, then enables searching for relevant moments with timestamps and evidence links back to the source video.
CuePrecise
Find the exact moment in a long YouTube video—and see the evidence behind the answer.
A long video in a language you do not speak should still be searchable. CuePrecise is an open-source MCP server for Claude Desktop, Codex, Cursor, and other AI clients. It turns a YouTube video's original speech, captions, speakers, and relevant frames into a searchable local reference.
CuePrecise analyzes videos longer than an hour in about three minutes. It does not send the whole video to your AI client for every question. It transcribes the original audio in chunks, indexes the evidence, and retrieves only the passages and frames related to your question.
The transcription starts with the original audio. When original-language YouTube captions are available, they fill matching gaps for Latin-script names and terms missed by the transcription. You can ask about a video in your own language and still get the original words, speaker information, relevant frames, and a timestamp that takes you back to YouTube. Precise retrieval may require terms in the video's original language. Actual processing time depends on the video, network, and API response time.
See it in action
The attached demo uses a Polish-language interview. Ask what it is about in your own language; CuePrecise returns relevant moments, the original transcript, and matching frames as evidence.
You: I do not speak Polish. What is this interview about?
Your AI + CuePrecise:
Explains the interview in your language, points to relevant moments,
and provides the original transcript and matching frames as evidence.https://github.com/user-attachments/assets/ce7d595b-871f-469a-bcb8-798713751ffd
Demo source: “Czym jest prompt injection i jak chronić firmę przed złośliwą instrukcją dla AI? Gośc. Tomasz Bartel” by Daniel Bartosiewicz | Content i Automatyzacja, licensed under CC BY.
Download CuePrecise → GitHub Releases
Jump to the answer. Get a timestamp for each item in a summary.
Keep speakers separate. Compare what each person said and why.
Find a referenced screen again. Connect a relevant frame to what was being explained.
Check the source. Open the original YouTube video at the cited moment.
Watch with Korean subtitles. Play the video with subtitles translated from the same evidence used in the analysis.
Try questions like these:
What is the main argument of this video? Include timestamps for each point.
Find where the speaker explains self-supervised learning.
When does that phrase appear on screen?
Compare each speaker's position on basic income and include the supporting passages.
If these speakers debated a new issue, what arguments and counterarguments
would follow from what they actually said in the video?In Claude Desktop, clicking a timestamp opens YouTube at that moment. Other AI clients may render timestamp links differently.
Related MCP server: yt-mem-ai
It keeps answers tied to evidence
CuePrecise is not just a summarizer. It gives your AI client the material it needs to answer a question and lets you check where the answer came from:
Gemini's word-level transcription of the original speech.
Original-language YouTube captions, when available, to recover missed Latin-script terms.
Frames from screen references, recovered terms, or explicitly requested timestamps.
Speaker labels, confidence, and provenance for retrieved words.
When evidence is absent or weak, CuePrecise reports insufficient evidence. The analysis bundle stays on your computer, so a later conversation can search the same video without starting over. Audio chunks used for transcription are sent to Gemini; see PRIVACY.md.
Recovering a term the transcription missed
Names and technical terms are easy to lose in a long transcription. In one 23-minute
Korean technical lecture, the phrase self supervised learning disappeared from all four
Gemini-only transcription runs.
Gemini transcription:
So how did they learn this ability? It is a way of learning.
CuePrecise merge:
So how did they learn this ability? self supervised learning is a way of learning.CuePrecise checks the YouTube captions from the same time range and fills only a matching gap. It does not rewrite Gemini's words. Words supplied by captions keep their origin.
The measured example looked like this:
The YouTube original-language captions contained 91 Latin-script words and the missing phrase.
The Gemini runs contained 28–29 Latin-script words, but missed the phrase every time.
The merged result contained 38 Latin-script words and recovered the phrase while keeping the Korean transcription quality.
This is one measured edge case, not a general accuracy claim. The exact merge rules and validation criteria are documented in CONTRACT.md.
Compare speakers without pretending to know their names
CuePrecise carries speaker information across chunks of a long video. Speaker labels are identifiers, not real names. Confirmed and inferred identities are kept separate, and weak evidence remains unresolved instead of being presented as a fact.
That lets your AI client:
collect one speaker's claims and supporting passages;
compare the positions of several speakers;
simulate a debate about a new issue using the speakers' actual statements as evidence.
A simulated debate is generated from the video. It is not a claim that those people actually discussed the new issue.
Watch with Korean subtitles built from the same evidence
CuePrecise can overlay Korean subtitles on a foreign-language lecture using the evidence already collected during analysis.
First, it fixes the terminology. Gemini's transcript is checked against YouTube captions and
on-screen text to resolve spellings such as by torch → PyTorch and combine JS → ConvNetJS.
The terminology is locked before translation so the same term stays consistent across batches.
Your AI client translates the lecture in small batches. CuePrecise checks the returned translations for numbers, terminology, reading speed, missing lines, and style, then returns only the flagged lines for review. Translation makes no additional Gemini calls; usage or charges from your AI client still depend on that client's plan.
In one measured run on a 68-minute lecture with 934 sentences, terminology review took about two minutes and 19 translation batches took about 14 minutes, with six batches needing review. In that run, subtitles were produced about five times faster than playback. Actual speed depends on the video and AI client.
The local browser viewer provides:
Subtitles over the YouTube player, including in fullscreen.
Korean, Korean with the original text, or original-language subtitles.
Saved preferences for font size, subtitle position, shadows, and box style.
Optional short term explanations shown when each term appears.
A searchable transcript, terminology list, and quality report in the side panel. Click a sentence to play from its timestamp.
Shortcuts:
Spaceto play/pause,←and→to seek five seconds,Cfor subtitle language,Tfor term explanations, andFfor fullscreen.
The quality report excludes purely cosmetic differences such as MinGPT → minGPT from
its correction count. Korean is the only translation target currently supported; other
languages are on the roadmap.
Quick start
Windows Smart App Control: v0.2.5 was blocked on PCs where Smart App Control is on (
[WinError 4551] An Application Control policy has blocked this file). Starting with v0.2.6, the Claude Desktop extension ships only widely used runtime files (the official Python embeddable package and an unmodified FFmpeg release build) and runs with Smart App Control on.v0.2.10ships the other AI clients installer the same way, as a plain zip instead of an unsigned installer executable. There is no remaining known Smart App Control issue.
Claude Desktop on Windows — one-file extension
Open Releases and download
cueprecise-windows.mcpb.In Claude Desktop, open Settings → Extensions → Advanced settings → Install Extension.
Select the file. Claude will ask for a Gemini API key and a folder for local video data.
Enable CuePrecise and ask Claude about a YouTube link.
The approximately 97 MiB bundle includes CuePrecise, an embedded Python runtime, yt-dlp, FFmpeg, and FFprobe. You do
not need to install Python, Git, or the video tools separately. The extension is currently
available for Claude Desktop on Windows.
Other AI clients on Windows
Open Releases and download
cueprecise-windows.zip.Extract the zip and double-click
CuePrecise 설치.cmd. Windows may ask you to confirm running it.Paste a Gemini API key from Google AI Studio when asked, then pick the AI clients found on your computer.
Fully quit and reopen the connected clients.
An AI client can also run the script non-interactively instead of walking through the
prompts, for example CuePrecise 설치.cmd --api-key-stdin --targets claude-desktop,codex.
It adds only the CuePrecise entry and backs up existing configuration when it can do so safely; a secret-bearing Codex TOML may be left without a backup to avoid copying the key. On Windows, the API key is encrypted with Windows DPAPI for the current user. Older plaintext CuePrecise keys are moved into the protected store during an upgrade.
Unsigned preview:
v0.2.10is not digitally signed, so Windows may show an unknown-publisher warning. Download it only from this repository's Releases page and verifySHA256SUMS.txtif you want to check the file before installing it.
macOS, Linux, and command-line installation
With uv:
uv tool install git+https://github.com/Nattentia/cueprecise
cueprecise setupThe setup command configures detected supported AI clients, including Claude Desktop, and
creates the default data directory ~/.cueprecise/data. It keeps a timestamped .bak file
when an existing configuration can be backed up safely. If a secret-bearing configuration
cannot be parsed safely, it avoids making an unsafe backup.
Install ffmpeg and ffprobe, then check the environment:
cueprecise doctorCreate a Gemini API key, then pass it through standard input or a file so it does not appear in the command or shell history:
cueprecise setup --api-key - # paste the key, then press Enter
cueprecise setup --api-key-file ~/.gemini-key # read it from a file
pass show gemini/api-key | cueprecise setup --api-key -
cueprecise run "https://www.youtube.com/watch?v=VIDEO_ID" --language en-US
cueprecise status VIDEO_IDIf a key is exposed, delete it in Google AI Studio and create a new one. See PRIVACY.md for the full procedure.
For source development only:
git clone https://github.com/Nattentia/cueprecise.git
cd cueprecise
python -m pip install -r requirements.txt
python src/pipeline.py --helpSupported AI clients
cueprecise setup can detect and configure:
Claude Desktop
Codex
Claude Code
VS Code
Cursor
Windsurf
Gemini CLI
Configuration paths for Cursor, Windsurf, and Gemini CLI are included, but their complete setup flows have not yet been verified on the development PC.
Run it for every detected client, for one named client, or to inspect the result:
cueprecise setup
cueprecise setup --client codex
cueprecise doctorAn application counts as installed when its executable is on PATH. A leftover configuration
folder is not treated as proof that the application is present. An undetected client can
still be named explicitly with --client <name>.
CuePrecise skips an existing cueprecise entry if CuePrecise did not create it. It does not
overwrite another MCP server's settings, and a failure for one client does not stop the
others.
ChatGPT connectors and Claude.ai on the web are not supported. They accept remote MCP servers over HTTPS with OAuth, while CuePrecise runs as a local stdio server on your computer.
Connect another MCP host
CuePrecise accepts both the request-per-request MCP revision 2026-07-28 and the earlier
initialize handshake. cueprecise setup is preferred because it preserves existing
configuration and handles credentials for supported clients.
The JSON below is for a source checkout or an MCP host not listed above. It stores the key in plaintext, so use the setup command when possible:
{
"mcpServers": {
"cueprecise": {
"command": "python",
"args": [
"C:/path/to/cueprecise/src/mcp_server.py",
"--bundle-root",
"C:/path/to/cueprecise/data"
],
"env": {
"GEMINI_API_KEY": "..."
}
}
}
}Use absolute paths. On every platform, literal --api-key VALUE is rejected to keep the key
out of process listings and shell history. The server can start without GEMINI_API_KEY:
existing analyses remain searchable, while new transcription requests stop with a
configuration message.
MCP tools
The tools fall into five groups.
Analysis and status:
cueprecise_register— register and analyze a YouTube video. Choose the stages to run; new transcription chunks call Gemini, while saved responses are reused when settings match.cueprecise_status— report progress, generated artifacts, and estimated local usage.
Search and evidence:
cueprecise_outline— return a timestamped outline, recovered terms, and speaker state.cueprecise_query— search transcript evidence and related frames.cueprecise_excerpt— return transcript and frames for a specific time range.cueprecise_frames— extract frames around screen-reference moments or requested timestamps, downloading the video again if needed.
Saved results:
cueprecise_summary— create or retrieve a summary.cueprecise_set_summary— validate and save a host-improved summary.cueprecise_set_chapter_titles— validate and save host-written chapter titles.
Subtitles (Korean only for now):
cueprecise_subtitle— return the next subtitle work packet (term review, translation, or checks) and the local viewer link.cueprecise_set_subtitle— validate and save the AI client's response, then return the next packet.
Cleanup:
cueprecise_purge— explicitly remove chunks, source video, derived results, raw material, or all data.
After fetching material from YouTube and transcribing audio with Gemini, assembly, caption merging, chapter generation, rendering, frame extraction, and indexing run locally. Chapter titles and summaries are written by the host AI from retrieved evidence; they do not create another Gemini call.
Local evidence bundle
The installer and cueprecise setup use ~/.cueprecise/data. A source checkout can use
data unless you set --bundle-root.
data/<video_id>/
job.json chunk plan and progress
raw/
captions.json original-language YouTube captions
metadata.json metadata used for language checks
audio/ audio chunks used for transcription
transcripts/ per-chunk transcripts and raw responses
frames/ extracted frames
derived/
transcript.json assembled Gemini transcription
merged.json transcription plus caption evidence
chapters.json timestamped outline
frames.json frame index
output.srt, output.txt optional render output
index.sqlite3 transcript, chapter, frame index, and summaryEach indexed evidence span keeps its timestamp, speaker status, evidence confidence, and origin. The merged word data also keeps per-word timestamps and origin:
{
"text": "supervised",
"start": 208.93,
"end": 209.87,
"speaker": "speaker:0",
"speaker_status": "confirmed",
"origin": "youtube"
}A query result includes the time range, text, source, confidence, and any related frame:
{
"start": 1728.4,
"end": 1740.2,
"timecode": "00:28:48",
"text": "The experiment was stopped after eight participants had seizures.",
"source_path": "derived/merged.json",
"source_kind": "transcript",
"speaker": "speaker:3",
"speaker_status": "inferred",
"speaker_confidence": 0.75
}Frames are not sampled uniformly across the whole video. CuePrecise prioritizes screen references in the transcript, recovered terms, and timestamps requested by the user. It does not semantically classify every code sample, table, or diagram. Text recognized on those frames is stored as separate provenance instead of replacing the transcript.
How it works
CuePrecise does not try to make your AI client watch the entire video in one pass. It builds a knowledge bundle that can be searched again:
Fetch audio, a low-resolution video stream, original-language captions when available, and metadata from YouTube.
--skip-videodefers the video download until frames are requested.Split the audio into chunks and request word-level transcription and speaker information from Gemini.
Assemble completed chunks and use original-language captions only to fill matching gaps for missed Latin-script terms.
Extract frames at screen-reference moments, recovered terms, and timestamps requested by the user.
Index transcript, chapters, speakers, and frames in SQLite.
Let the AI client retrieve the relevant evidence and write the answer with timestamps.
Stages communicate through JSON files and can be rerun independently. Completed chunks are reused when the input and settings match. Raw transcription responses are saved before validation, so a parse failure does not automatically spend another Gemini call on the same response.
The optional render stage creates SRT and TXT files. Overflowing text is carried into the
next cue instead of being silently dropped, preserving 100% of the words in the rendered
output.
Language selection and translation guard
Pass the video's original language when possible, for example --language en-US, --language ko-KR, or another BCP-47 code. Without it, Gemini can occasionally return a translation
instead of a verbatim transcript.
CuePrecise checks each chunk against original-language captions, the requested language, and video metadata. If it detects a translation, it stops before spending calls on the remaining chunks. When there is no basis for the check, it records that the check was skipped. The check uses material already fetched and does not make an extra API call.
Command-line reference
python src/pipeline.py run <url> [options]
python src/pipeline.py status <video_id>
python src/pipeline.py purge <video_id> --scope <scope>Common run options:
--language— comma-separated BCP-47 language codes; specifying the original language is recommended--stages— stages to run;allincludes optional stages--bundle-root— directory for video bundles--force— ignore cached results and rebuild--skip-video— skip the video download--keep-video— keep the video after frame extraction--at— timestamps, in seconds, at which to extract frames--max-frames— maximum number of frames; default 40--chunk-max-secs— maximum chunk length; default 1790 seconds--overlap-secs— overlap between chunks; default 10 seconds--daily-limit,--rpm-limit,--request-interval— local Gemini usage limits and the minimum gap between calls--width— subtitle line width; default 20, with 42 recommended for English
Rebuild selected derived output or clean up source material:
python src/pipeline.py run <url> --stages render
python src/pipeline.py run <url> --stages visual
python src/pipeline.py purge <id> --scope chunks--scope accepts chunks, video, derived, raw, or all. Deletion is explicit.
Performance and usage
The pipeline is designed to resume. Completed chunks are reused when the input and settings are unchanged, and local post-processing such as merge, visual extraction, and indexing does not call Gemini.
The source video is removed after frame extraction; use --keep-video to retain it. The
split transcription audio is removed once every chunk is transcribed. The original audio is
kept. If two apps ask for the same video at once, the second reports that it is busy.
A local usage ledger records attempts by an API-key hash and Pacific date, never the original key. CuePrecise shows the expected calls before a job starts and stops if a configured limit would be exceeded. Google AI Studio remains authoritative for server-side usage.
Requirements
Python 3.11+
ffmpegandffprobefor audio chunking and frame extractionFrame OCR is built into Windows. On macOS and Linux, install
pytesseract,Pillow, and thetesseractbinary (optional)
python -m pip install -r requirements.txt
python -m pip install -r requirements-optional.txt # optional OCR and timezone supportgoogle-genai is needed only for the transcribe stage.
The installable distribution is cueprecise-mcp, with cueprecise and cueprecise-mcp as
its command-line entry points. It has not been published to PyPI yet, so install from the
GitHub URL above.
Tests
python -m unittest discover -s testsThe suite uses the standard-library unittest runner. Tests do not access the network or
call the Gemini API. Tests that require google-genai are skipped when the SDK is not
installed.
Known limitations
YouTube caption spelling errors can remain in recovered terms, and captions may be unavailable.
The caption-merge threshold was tuned on a limited set of real videos and needs broader validation.
Across three or more chunks, a speaker absent from the overlap can remain
unresolved. CuePrecise avoids assigning a potentially wrong identity.The interruption/resume path for a long-running job on the real API still needs end-to-end validation.
Visual-reference phrase matching currently focuses on Korean and English.
Visual search is candidate-based: it prioritizes transcript screen references and requested timestamps rather than inspecting every frame semantically.
Cross-language retrieval is lexical rather than translation- or embedding-based; original terms may be needed when the host AI does not translate the query.
Timestamps assigned to caption-recovered words are placed inside the missing transcription gap and should be treated as approximate within that interval.
The subtitle tools translate into Korean only, and the viewer that plays those subtitles is in Korean. Other target languages are planned.
That viewer runs on this computer (
127.0.0.1) while the MCP server is running, and is designed for desktop browsers.
Documentation
README.ko.md— Korean READMECODE_SIGNING_POLICY.md— Windows release review and signing policyPRIVACY.md— API keys, local data, external services, and uninstall behaviorCONTRACT.md— authoritative data contracts and validation rulesDECISIONS/— design decisions and rejected alternativesCONTRIBUTING.md— development environment and pull request processSECURITY.md— private vulnerability reporting
Roadmap
Korean subtitles laid over the YouTube video, built from the analyzed evidence
A browser extension for videos that block external playback
The same subtitles in languages other than Korean
Host-specific timestamp links
Pipelined chunk transcription
Multi-video research with source-specific evidence
Acknowledgements
The initial transcription flow was informed by the MIT-licensed
gemini-transcribe-wrapper.
CuePrecise is an independently written project.
License
CuePrecise is released under the MIT License.
CuePrecise is not affiliated with or endorsed by YouTube or Google. YouTube is a supported service.
Available Tools
10 toolscueprecise_excerptA
지정한 시각 구간의 자막 원문과 그 구간의 프레임을 조회한다. 긴 구간은 앞부분만 돌아오고 truncated 가 참이 된다 — 그때는 start 를 옮겨 이어 부른다.
Inputs: end (required), start (required), video_id (required).
cueprecise_framesA
화면 참조 시각의 프레임을 추출하고 frames.json 을 갱신한다. 영상이 없거나 --skip-video를 사용한 경우 원본 URL로 저해상도 영상을 받아온다. Gemini 호출 없음.
Inputs: video_id (required), at, max_frames.
cueprecise_outlineB
영상 개요와 timestamp 목차를 조회한다. needs_titles가 있으면 근거를 보고 제목을 직접 지은 뒤 cueprecise_set_chapter_titles를 호출한다.
Inputs: video_id (required), max_entries.
cueprecise_purgeB
영상 자료를 명시적으로 삭제한다. scope: derived(기본) | chunks | video | raw | all. chunks 는 전사용 청크 오디오만 지우며 원본 오디오에서 다시 만들 수 있다.
Inputs: video_id (required), scope.
cueprecise_queryB
영상 내용을 질의한다. 근거 span 과 frame 을 timestamp 와 함께 반환한다. 근거가 없으면 없다고 답한다.
Inputs: query (required), video_id (required), limit.
cueprecise_registerA
YouTube 영상을 등록하고 분석 파이프라인을 실행한다. stages 를 주면 일부 단계만 재실행한다.
Inputs: url (required), stages, language.
cueprecise_set_chapter_titlesB
cueprecise_outline의 needs_titles에 대해 호스트가 직접 지은 제목을 검증 후 저장한다. 경계와 원문은 바꿀 수 없다.
Inputs: titles (required), video_id (required), fingerprint (required).
cueprecise_set_summaryB
cueprecise_summary packet만 근거로 작성한 구조화 요약을 검증·저장한다. chapter 경계와 timestamp는 서버가 결정한다.
Inputs: content (required), video_id (required), fingerprint (required).
cueprecise_statusC
작업 상태, 청크 진행도, 산출물 존재 여부, 로컬 Gemini 사용량 추정을 조회한다.
Inputs: video_id (required).
cueprecise_summaryC
사용자가 전체 영상 요약을 요청할 때만 요약을 만들거나 현재 요약을 재사용한다. 로컬 요약은 즉시 사용 가능하며, packet이 있으면 호스트가 cueprecise_set_summary로 한 번 개선할 수 있다.
Inputs: video_id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool targets a distinct lifecycle operation: registration, status, outline, query, excerpt, summary, frame extraction, save operations, and purge. The only close pairs (summary/set_summary and excerpt/frames) are clearly separated by read vs write/generate semantics in their descriptions.
All names share the cueprecise_ prefix and use snake_case, and set_* is consistently used for write/validation tools. However the stems mix noun-style names (status, outline, summary, frames) with verb-style names (register, query, purge, excerpt), so the pattern is consistent but not a uniform verb_noun convention.
Ten tools is well-scoped for a video analysis and retrieval server. Each tool covers a necessary part of the pipeline without redundant entries.
The set provides full lifecycle coverage: register creates and runs the pipeline, status monitors it, outline/query/excerpt/frames/summary cover reading and retrieval, set_summary and set_chapter_titles cover updates, and purge covers deletion with granular scopes. No critical dead-end or missing operation is apparent.
Maintenance
Related MCP Connectors
Your YouTube library, in the AI tools you already use: Claude, ChatGPT, Cursor, any MCP client.
YouTube transcripts, search, channel browsing, and playlists for AI agents via MCP.
Extract YouTube transcripts, search what was said, and read on-screen frames with cited timestamps.
An MCP server that gives any LLM or agent clean YouTube transcripts on demand: a single video, a whole channel, or a playlist, plus AI cleanup of auto-generated captions. API-key auth, credit-based, same backend as the public v1 API. Get a free API key with 25 free credits at youtubetranscriptdownload.com/account.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that ingests YouTube videos and podcasts, making them searchable with timestamps and deep links to exact moments.65MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that gives AI assistants a local YouTube memory: transcribe videos, store and search transcripts, follow subscriptions, and generate summaries, timestamped highlights, and digests, all on your machine with no cloud or API keys.62 PyPI7MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for turning YouTube channels into a queryable local knowledge base. Enables BM25 search and extractive Q&A over captions with timestamped citations.MIT
- AlicenseNot gradedqualityCmaintenanceA self-hosted, read-only MCP service that searches public YouTube and Bilibili videos and produces compact evidence packages with verified metadata, timestamped captions or ASR, frames, OCR, and contact sheets for ChatGPT/Codex analysis.1GPL 3.0