RECAP Video Summarizer
Clickable transcripts and summaries for recordings
- Year
- 2024
- Kind
- Apps
- Status
- Finished
Watches your OBS recordings folder, pulls the audio with FFmpeg, transcribes it with Whisper on Groq and summarizes it with Llama. Click any transcript line to jump to that moment in the video.
RECAP watches the folder OBS Studio records into. Each new video has its audio extracted with FFmpeg, transcribed by Whisper large-v3 on Groq into time-stamped segments, and summarized by a Llama model. Everything lands in a local SQLite library with a Next.js dashboard, where every transcript line seeks the video to its moment.
The problem
A screen recording is hard to use after the fact: to find one moment you scrub through the whole video. RECAP watches the folder OBS Studio records into and turns each new recording into a time-stamped transcript and a short summary, kept in a local library. Click a line of the transcript and the video jumps to it.
How it works
- 01
Watch the recordings folder
A watcher built on chokidar, a Node file-watching library, follows the recordings folder named by WATCH_PATH in .env and picks up every new .mp4 or .mkv. OBS keeps writing to the file while it records, so the watcher waits until the size has held still for 2 seconds before touching it. Each recording gets a row in SQLite, through the Prisma ORM, marked PROCESSING. When the watcher restarts it scans the folder again but skips any recording already completed, matched by path and size, so nothing is processed twice.
- 02
Pull out the audio with FFmpeg
FFmpeg drops the video stream and encodes the sound as an MP3 next to the original. Transcription only needs sound, so the MP3 is all that goes to the API; the video never leaves the machine.
- 03
Transcribe with Whisper on Groq
The MP3 goes to Whisper large-v3, a speech-to-text model, hosted on Groq. RECAP asks for the verbose_json format, which returns the text in segments, each with a start and end time, and stores every segment as its own row. Those times are what make the transcript clickable later.
- 04
Summarize with an LLM
The full transcript then goes to a Llama 3.2 90B model on Groq, with a one-line system prompt asking for a summary of up to 1,024 tokens. Summary, transcript, duration, language and segments are written in one update and the row becomes COMPLETED. If any step throws, the row is marked ERROR, so a bad file shows up as failed instead of stuck, and the next time the watcher starts it retries that row in place.
- 05
Jump from a line to its moment
A Next.js dashboard lists the recordings as cards. Opening one shows the video beside its transcript, and clicking a segment sets the player to that segment's start time. The video comes from an API route that answers HTTP range requests, sending only the bytes the browser asks for, so seeking in a long recording doesn't download the whole file. The library can be searched across transcripts, summaries and file names, and each recording can be tagged and filtered by tag.
Decisions
Watch a folder, not OBS
RECAP never talks to OBS. It reacts to video files appearing in a folder, so any recorder that saves .mp4 or .mkv there works the same way.
Keep the segments, not just the text
Storing each segment with its start and end time costs one extra table. It is what turns a wall of text into a list of moments you can jump to.
Hosted models
Both models run on Groq, so the only model setup is one API key in .env, and the machine doing the recording needs no GPU.