Search YouTube captions, jump to the exact line, save timestamped notes and ranges, then export a clean edit list.
Visit the website · Buy me a coffee
Created by Art Moreno.
Long videos hide useful moments inside hours of footage. ClipSifTranscribe turns existing YouTube captions into a fast, searchable research workspace:
- Paste a YouTube link.
- Search the captions, including exact phrases.
- Jump the official player to any matching line.
- Save a line or mark an In/Out range.
- Add notes and move each moment from Candidate to Selected to Used.
- Export the timestamp map for editing, review, or handoff.
It does not download the video, and it does not upload your research library. The app, cached captions, notes, searches, and pairing data live in a local SQLite database on your PC.
Important
ClipSifTranscribe retrieves captions that already exist on YouTube or imports a transcript you provide. It does not perform speech-to-text on video audio.
| Find | Shape | Keep | Share |
|---|---|---|---|
| YouTube watch, short, live, embed, and youtu.be links | Synced embedded player | Local library and resume position | CSV |
| Human and auto-generated captions | Adjustable seek preroll | Favorites and archive state | JSON |
| Full-text and quoted-phrase search | Single-line moments | Notes and status | Markdown |
| Search suggestions | Custom In/Out ranges | Cached transcripts | Plain text |
| SRT, VTT, and timestamped-text import | Auto-scroll with manual lock | Trusted phone devices | Timestamp links |
The responsive interface works on the host PC and, when explicitly enabled, on a paired phone over a trusted LAN or private Tailscale network.
- Windows 10 or 11 with PowerShell
- Python 3.10 or newer
- Node.js 20.19 or newer, or Node.js 22.12 or newer
- Internet access for YouTube metadata, captions, and playback
- Tailscale only if you want private access away from the host PC
Clone the repository:
git clone https://github.com/ArtMoreno/ClipSifTranscribe.git
cd ClipSifTranscribe
Install the backend, build the interface, generate the icon, and create the desktop shortcut:
powershell -NoProfile -ExecutionPolicy Bypass -File .\Install-ClipSifTranscribe.ps1
Double-click the new ClipSifTranscribe desktop shortcut. The secure default is desktop-only mode at:
http://127.0.0.1:8765
You can also start or stop it from PowerShell:
.\Start-ClipSifTranscribe.ps1
.\Stop-ClipSifTranscribe.ps1
Skip the frontend dependency install and build only when a current
dist directory already exists:
.\Install-ClipSifTranscribe.ps1 -SkipNode
Create a shortcut that opts into trusted-network phone access:
.\Install-ClipSifTranscribe.ps1 -PhoneAccess
If a private Tailscale HTTPS address is already configured, include the address that the app should show and encode in its QR code:
.\Install-ClipSifTranscribe.ps1 -PhoneAccess -PhoneUrl "https://your-pc.your-tailnet.ts.net"
The -PhoneUrl option does not create a tunnel, configure HTTPS, or
change Tailscale ACLs. It only sets the displayed connection address.
Paste a standard YouTube, youtu.be, Shorts, live replay, embed, or YouTube NoCookie link. ClipSifTranscribe normalizes the link, requests basic metadata, and retrieves the available caption tracks.
Human-created captions are preferred when available. The workspace identifies whether the cached track is human-created or auto-generated, and lets you refresh it.
Enter words to search the current transcript with SQLite FTS5. Put an exact phrase in quotation marks. Select a result to seek the player to that line; use the preroll control when you want a little context before the match.
Useful keyboard controls:
| Shortcut | Action |
|---|---|
| Ctrl/Command + F | Focus transcript search |
| Enter | Open the selected result |
| Alt + Down | Select the next result |
| Alt + Up | Select the previous result |
- Save a transcript line with one click.
- Set In and Out points for a larger range.
- Add a note and update the moment's status.
- Track the moment as Candidate, Selected, or Used.
- Reopen saved moments and seek directly to their timestamp.
When YouTube captions are unavailable, import an SRT, VTT, or timestamped text file. Timestamped text can be as simple as:
1:02 First useful line
1:08 Second useful line
The imported transcript is indexed and searched like a retrieved caption track.
| Format | Intended use |
|---|---|
| CSV | Spreadsheet-friendly timestamp map |
| JSON | Structured records for another tool or script |
| Markdown | Readable notes with source and timestamp links |
| Plain text | Compact pipe-separated handoff |
Exports can include the source link, moment title, start and end times, duration, transcript excerpt, note, status, and timestamp link.
Desktop-only mode binds the server to 127.0.0.1, so another device
cannot reach it.
To opt into phone access for the current launch:
.\Start-ClipSifTranscribe.ps1 -PhoneAccess
Phone mode binds to 0.0.0.0. Open Settings on the host PC to see
the connection URL, QR code, and pairing code. A remote browser must pair before
it can call protected API routes. Paired devices can be reviewed and revoked
from Settings.
For an existing private Tailscale address:
.\Start-ClipSifTranscribe.ps1 -PhoneAccess -PhoneUrl "https://your-pc.your-tailnet.ts.net"
Caution
Use phone mode only on a network you trust or through a private tailnet. Never forward port 8765 directly to the public internet. Pairing is not a replacement for HTTPS, firewall rules, Tailscale ACLs, or network-level rate limiting. The host PC must remain awake and connected.
More detail is available in SECURITY.md.
ClipSifTranscribe creates the following private runtime directory:
data/
clipsiftranscribe.sqlite3
server.log
server-error.log
The database can contain:
- YouTube URLs and metadata
- Cached or imported transcripts
- Searches and playback positions
- Saved ranges, excerpts, and notes
- Favorites, archive state, and library records
- Pairing codes and trusted-device tokens
- Diagnostics
The project does not provide cloud sync and does not upload this database. It does contact YouTube for oEmbed metadata, caption retrieval, thumbnails, and embedded playback.
The entire data directory is ignored by Git. Do not force-add it.
To back up your research, stop the server and copy the SQLite file to a secure
location.
Stop the app and remove the desktop shortcut:
.\Uninstall-ClipSifTranscribe.ps1
Also delete the local library, cached captions, notes, and pairing data:
.\Uninstall-ClipSifTranscribe.ps1 -RemoveData
The uninstaller deliberately leaves the source folder in place. Delete that folder manually after confirming that you no longer need its contents.
Create the Python environment and install dependencies:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
Install and build the frontend:
npm ci
npm run build
Run the full application:
.\.venv\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8765
Then open http://127.0.0.1:8765.
For backend auto-reload:
.\.venv\Scripts\python.exe -m uvicorn app.main:app --reload --host 127.0.0.1 --port 8765
The FastAPI server serves the built frontend from dist. Run
npm run build again after frontend changes. The current
npm run dev command starts Vite without an API proxy, so the built
frontend is the reliable full-stack development loop.
Run the Python tests:
.\.venv\Scripts\python.exe -m pytest tests -q
Type-check and build the frontend:
npm run build
Install Playwright's Chromium browser once, then run the browser test:
npx playwright install chromium
npm run test:e2e
The Playwright test expects a built frontend and working Python environment.
| Layer | Technology | Responsibility |
|---|---|---|
| Interface | React, TypeScript, Vite | Player, transcript, search, moments, library, settings |
| Local server | FastAPI, Uvicorn | API, pairing, imports, exports, static frontend |
| Storage | SQLite, FTS5 | Library, caption cache, full-text index, notes, devices |
| YouTube | oEmbed, youtube-transcript-api, IFrame Player | Metadata, existing captions, playback |
| Windows tooling | PowerShell | Installation, launch, shutdown, shortcut, uninstall |
Project layout:
app/ FastAPI backend and icon builder
assets/ Windows application icon
docs/ Repository artwork
e2e/ Playwright browser test
src/ React and TypeScript frontend
tests/ Python unit tests
Install-ClipSifTranscribe.ps1 Installer and shortcut creation
Start-ClipSifTranscribe.ps1 Local server launcher
Stop-ClipSifTranscribe.ps1 Safe server shutdown
Uninstall-ClipSifTranscribe.ps1 Shortcut and data cleanup
The following are generated locally and intentionally excluded:
.venv/
node_modules/
dist/
data/
test-results/
playwright-report/
- Caption retrieval can fail when captions are disabled, private, restricted, unavailable in a region, or temporarily blocked.
- Caption retrieval uses
youtube-transcript-api, which is not an official YouTube API and can be affected by upstream changes or rate limits. - Internet access is required for metadata, retrieved captions, thumbnails, and playback.
- Imported transcripts remain searchable offline, but the embedded YouTube player still needs a network connection.
- The installation and launch workflow is Windows-first.
- Phone mode is designed for trusted private networks, not public hosting.
ClipSifTranscribe is an independent project. It is not affiliated with, endorsed by, or sponsored by YouTube or Google. Use it only with material you are allowed to access and process, and follow applicable copyright rules and platform terms.
Created and maintained by Art Moreno.
ClipSifTranscribe is open source under the MIT License.
Copyright (c) 2026 Art Moreno.
