Overview
Some of our best gaming nights, conversations, funny moments, and other recordings ended up scattered across my friends' and my PCs. I wanted to find a particular game, phrase, or moment without scrubbing through years of video, so I built Python indexing utilities, a native macOS library, and ClipTube, a web app where we can search and stream the same personal archive.
What it is
ClipTube is the web companion to a native macOS video-library app I built for my friends and me. Together, the apps make it possible to browse and replay years of PC recordings, from gaming clips to conversations and funny moments we would otherwise have to stumble across by chance.
A shared clip catalog connects each recording to the context that helps us remember it: its date, tags, on-screen text, transcript, and technical details. The original videos stay in the library, ready to play in either app.
Why I built it
My friends and I kept saving videos over the years, but a growing folder of recordings is hard to explore when the moment you remember has no useful filename. We remember who was playing, which game was on screen, or something somebody said—not where a particular file landed.
I built ClipTube to put that context to work, turning the archive into something we could search together and return to whenever an old moment came up in conversation.
Indexing the archive
I wrote Python utilities to scan the video library, interpret dates in filenames and folders, and apply configurable keyword tags. OpenCV samples video frames and Tesseract OCR reads text from game screens and other desktop content. A separate Whisper pass transcribes speech and adds that text to the catalog, so visual and spoken details can help identify a clip.
The web indexer enriches the catalog with media information from ffprobe and generates cached thumbnails with FFmpeg. Keeping searchable metadata and generated assets alongside the original files lets the apps reopen the library without rescanning every video just to display it.
One library, two apps
The macOS app uses SwiftUI for the library and AVKit for playback. It reads clips directly from the collection and caches generated thumbnails, while keeping the browsing and playback experience close to the videos themselves.
The web companion pairs a React and TypeScript interface with a Node.js and Express server. The server builds SQLite full-text and semantic search indexes, caches media metadata and thumbnails, and streams video on demand so we can seek through clips in the browser.
Search and rediscovery
On macOS, I built fuzzy, semantic, and exact transcript search over clip filenames, tags, and spoken text. Sentence embeddings help surface relevant clips even when a query describes the moment in different words; filters for people, games, dates, and times narrow the results when we remember more.
The web app combines weighted SQLite full-text results with semantic matches from clip details and overlapping transcript chunks. Favorites, watch history, calendar and On This Day views, session browsing, statistics, and duplicate detection offer more ways to find a clip than typing a search query.
What I worked through
A single search technique was not enough for an archive with messy filenames, visible game names, personal tags, and long conversations. I built the desktop and web apps to support both precise lookups and looser descriptions, while keeping the results connected to dates, people, and games.
Long transcripts raised a separate indexing challenge: splitting speech into independent passages could lose the context around a relevant phrase. The web indexer carries words across transcript chunks, then combines metadata, keyword, and semantic results so specific terms and broader descriptions can both lead back to a useful clip.
Lessons learned
The most important part of a personal media library is the context attached to each file. Dates, screen text, tags, and transcripts give us different ways to remember the same moment, and combining those clues makes older recordings far more useful than a folder full of videos.
Building both apps also taught me to design the catalog around the people using it, then let each client handle search and playback in a way that fits its platform. The result is software my friends and I can keep using as the archive—and the memories in it—grows.
Highlights
- Created a Python indexing pipeline with OpenCV, Tesseract OCR, contextual tagging, and separate Whisper transcription to make a personal video archive searchable
- Built a native SwiftUI macOS app with fuzzy, semantic, and exact transcript search, plus filters for people, games, dates, and times
- Developed a React and TypeScript web app backed by Node.js, Express, and SQLite to search the library and stream clips in the browser
- Designed semantic transcript search for long recordings using 400-word chunks with 80-word overlaps
- Added calendar and On This Day rediscovery, favorites, watch history, session browsing, statistics, and duplicate detection