yt-fts CLI
yt-fts downloads subtitles of YouTube channels and playlists into SQLite and finds phrases with links to the exact second, plus semantic search and chat
- 1,812 ★ on the repository
- Last commit
- Unlicense
Broad access
Why this level
- It downloads YouTube data in bulk in several parallel jobs, and on 403 errors the platform may restrict your access or IP
- The --cookies-from-browser flag reads browser cookies that carry your session data
- Transcript text goes to OpenAI or Gemini under your key for semantic search, chat and summaries
Install
In your terminal, with SkillFoxx CLI
npx skillfoxx add cli/yt-ftsDetects the agents on your machine, shows the access level and pins the version.
Other ways to install
Access and checks
How we reviewBroad accessThe tool can change data, run commands or handle secrets.
- It downloads YouTube data in bulk in several parallel jobs, and on 403 errors the platform may restrict your access or IP
- The --cookies-from-browser flag reads browser cookies that carry your session data
- Transcript text goes to OpenAI or Gemini under your key for semantic search, chat and summaries
This is third-party code. Review the repository files before installing.
What it does
yt-fts is a Python command line program that collects YouTube subtitles and searches them. The download command takes a channel or playlist address (the --playlist flag), downloads subtitles through yt-dlp in several parallel jobs (8 by default, language en by default, changed with --language) and stores them in a local SQLite database. update adds new videos, delete removes a channel with all its data after confirmation, and export writes transcripts to txt or vtt files. The search command looks through saved subtitles by text, in one channel, one video or the whole database. The query string is at most 40 characters and supports AND and OR operators, asterisk wildcards and prefixes from SQLite's enhanced query syntax. Each result is printed with a YouTube address that opens the video at the right second; results can be exported to CSV with --export. For semantic search, the embeddings command splits a channel's transcripts into segments (30 seconds by default) and gets vectors through the OpenAI or Gemini API, storing them in chromadb. After that vsearch works: results are ordered by closeness to the query. The llm command opens a chat whose answers are built from the matching segments, and when the context falls short the query is refined. summarize gives a short summary of a video by link or id with timestamps; if the transcript is not in the database, the command tries to download it. list shows channels, videos and the transcript text, config prints the database paths, and diagnose checks the connection to YouTube.
Who it is for. For researchers, marketers, editors and developers who need to find quotes and topics across every episode of a channel or playlist and build a transcript corpus for their own agents and scripts.
Good fit when
- You need to find in which episode and at which second a channel's author said a particular phrase
- An AI agent needs a local corpus of transcripts for a whole channel or playlist and should receive excerpts on request
- You want to export a channel's transcripts to txt or vtt for analysis, editing or translation
- Keyword search does not help and you need semantic search over transcripts with chat answers and timestamps
- You want a quick summary of one video with links to the moments
Not a fit when
- You need an MCP server that hands an agent one video's transcript by link: the catalog has YouTube Transcript MCP Server for that
- A video has no subtitles: the program takes only existing subtitles and does not turn speech into text
- You need ongoing support and fixes: the author calls the project abandoned
- You need one Markdown file with a video transcript for notes: youtube-fetcher-to-markdown fits, with no database or search
Example request
Download the 3Blue1Brown channel subtitles and find every place where he talks about backpropagation, with links to the secondsLimitations
- Unlicense, a public domain dedication. The author writes at the top of the project description that it is abandoned until they need work again, so do not expect fixes when YouTube changes something.
- Python 3.10 or newer is required. Dependency versions are pinned (yt-dlp 2025.6.30, openai 1.93.0, chromadb 1.0.15) while YouTube keeps changing, so downloads can fail with 403 errors. The diagnose command and docs/TROUBLESHOOTING_403.md help sort them out.
- The update command refreshes only full-text search; it does not recompute vectors for semantic search, which must be fetched again with embeddings.
- embeddings, vsearch, llm and summarize need an OpenAI or Gemini key, transcript text goes to those services, and the OpenAI API is unavailable from Russia. Subtitle language defaults to en; pass --language for others.
- The tool collects YouTube data in bulk: use it only on channels and data you have permission to collect and use, within the platform's rules.
How to disable. Remove the program with pip uninstall yt-fts. The data stays on disk: yt-fts config shows the paths to the SQLite database and the chromadb store, and yt-fts delete --channel removes a channel with all its transcripts.
FAQ
How do I search several words or word parts at once?
The search string understands SQLite's enhanced full-text query syntax. The query knife AND Malibu finds both words, knife OR Malibu finds either, and rea* kni* Mali* matches word beginnings. The string is limited to 40 characters. The --channel and --video-id flags narrow the search to one channel or video.
Do I need an API key for plain text search?
No. A key is needed only by the semantic search, chat and summary commands: embeddings, vsearch, llm and summarize. It is set with the OPENAI_API_KEY or GEMINI_API_KEY variable or the --api-key flag. Subtitle download and the search command work entirely on the local database and yt-dlp.
What does the --cookies-from-browser flag do?
It takes cookies from the named browser (chrome, firefox and others) and adds them to download requests. The author recommends it when YouTube asks you to sign in. It works with download, update and diagnose. Cookies carry your session data, so use a browser and profile you are ready to hand to the program.
How do I split a transcript into segments for semantic search?
With the embeddings command and the --interval flag in seconds, 30 by default. The author notes that longer segments give more accurate language model answers, while semantic search then shows more text to read. Once vectors are saved, the channel gets an (ss) mark in the list.
Where do results and transcripts get exported?
Results of search and vsearch with --export are saved as CSV in the current folder. The export command creates a directory named after the YouTube channel id in the current folder and writes transcripts there as txt (default) or vtt, chosen with --format.
Discussion
No questions or reviews yet.
Related
CLI toolsyutu runs a YouTube channel from the terminal: videos, playlists, comments. Has an MCP server, a built-in agent and a skill for Claude Code and Codex
The /watch skill turns a link or file into frames and captions, or with a Gemini key hands the whole video to Google for the agent to answer from
YouTube Skills
YouTube Skills for AI Agents
A set of skills that gives an agent YouTube transcripts, video and channel search, and playlist extraction over one API
A Claude Code skill that downloads a YouTube video, splits it into semantic chapters, cuts chosen clips, translates subtitles and burns bilingual ones in
YouTube Data MCP (kirbah)
YouTube Data MCP Server (kirbah)
YouTube MCP with trimmed replies: transcripts without a key, video and channel statistics, trends, comments, a MongoDB cache and growing-channel search
The bili CLI for agents: videos, subtitles, search, feeds, favorites and likes on Bilibili, with YAML or JSON output
Comparison with similar tools
Entries that share the main search query, and how they differ.
| Entry | Official | Authentication | Repository stars | Main difference |
|---|---|---|---|---|
| yt-fts (this entry) | no | 1,812 | ||
| YouTube Transcript MCP Server | no | not required | 492 | an MCP server that gives an agent one video's transcript by link, with no database or channel search |
| YouTube Fetcher to Markdown | no | 495 | saves one video's transcript and metadata into a Markdown file for Obsidian |
README in short
The repository has a description of every command with flags and examples, a changelog, a separate guide to 403 errors during download and a pytest suite covering download, export, plain and semantic search. The description opens with a note that the project is abandoned and links to the author's blog post, the chat with a model, summaries and semantic search.