I let a 4B model watch 321 stock clips overnight so I never have to scroll again A developer built nightshelf, an open-source command-line tool that indexes a local stock-video library by meaning using a locally run Gemma 3 4B vision model via Ollama. The tool extracts three frames per clip with ffmpeg, generates structured JSON descriptions, embeds them, and stores results in SQLite with FTS5 for full-text search, processing 321 clips (7.6 GB) in 2,874 seconds with zero failures at 8.9 seconds per clip on a Mac without a GPU server. Released under Apache 2.0 on Java 21 with 169 tests, it reads the clip library and existing catalog read-only and keeps all processing on the local network. This is a submission for the Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady https://dev.to/challenges/hacktoberfest-week3-2026-10-19 . I make short videos, and all of them draw from one shared folder of stock clips: 321 files from Pixabay and Pexels, 7.6 GB, about two and a half hours of footage. Every file is named with a number. pixabay/4926.mp4 could be anything. There is a catalog next to the files, with tags, but the tags are the search queries I typed when I downloaded each clip. They tell me what I was looking for that day, not what the clip contains. So when I need "a single candle on a dark background", the honest method is to open the folder and scrub through thumbnails. I have done that more times than I want to admit. nightshelf is a small command-line tool that looks at the library once, unattended, and writes down what is in every clip. For each video it pulls three evenly spaced frames, asks Gemma 3 the 4B vision model, running locally through Ollama to describe them, embeds the description, and stores everything in a SQLite file. After that I just type what I want: bash $ nightshelf search "a candle flame" --limit 3 1. pixabay/4926 score 0.0328 sim 0.83 10.6s A single candle burns brightly against a dark background, casting a warm, flickering light… status: prayers-nightwatch=approved | used: prayers-nightwatch 2. pixabay/4933 score 0.0320 sim 0.80 33.1s A single candle with a flickering flame burns brightly against a dark background… 3. pixabay/51749 score 0.0320 sim 0.82 20.0s A single lit candle burns brightly in a dark room, casting a warm glow against a black background… The tool also reads my existing catalog read-only, it never writes to it , so it knows which clips I already approved, rejected, or used for a given project. --status unused means "something I have not used yet and did not reject". The real run on my library: 321 clips described and embedded, 0 failures, 2,874 seconds in total, 8.9 seconds per clip , on my Mac, with no GPU server involved. The video about 80 seconds, a real terminal on my real library shows the overnight run with its one-line-per-clip progress, the stats of the full run, a few searches, and an export of a shortlist. These are real terminal outputs from my library the path of my clip folder is masked : Overnight indexer that makes a local video clip library searchable by meaning. A stock-clip library grows until nobody remembers what is in it, and file names like clip 0412.mp4 say nothing. nightshelf looks at a few frames of every clip with an open-weight vision model running on your own machine, writes a short description, stores it in a local SQLite database, and lets you search the library from the command line "rainy city at night", "someone walking a dog on a beach" . Nothing leaves your network, the library is only ever read and the whole library is processed unattended, overnight. php flowchart LR L "Clip library