The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Vidgrid — eyes for video listing page.
Convert video clips into annotated image grids for vision LLM analysis. One cell = one second, by default.

LLMs can't watch video, but they can analyze a single image. vidgrid samples
one frame per second from a video, tiles them into a numbered storyboard with
timestamps, and optionally sends the result to Claude, GPT, or Gemini with a
prompt. The result is something close to "my LLM just watched a video" for
the cost of a handful of image uploads.
Don't want to install? Use the hosted version at vidgrid.site — drop a file, get the grid in the browser. 3 free renders, $5 lifetime after that. Free for ever on the CLI.
One cell = one second, by default. The auto-picker chooses the smallest
grid (biggest, most-legible cells) whose board count stays under
--max-boards (default 10). When that's not enough for a long clip, it
bumps the grid up; as a last resort, it reduces the sampling rate. Override
with --fps and --max-boards for full control.
| Grid | Cells | Seconds per photo | Best for |
|---|---|---|---|
2x2 | 4 | 4 | Very short clips (2–4s) |
3x3 | 9 | 9 | Default — best overall readability |
4x4 | 16 | 16 | More compact, cells get smaller |
5x5 | 25 | 25 | Experimental — cells small, LLM accuracy drops |
Quality degrades with bigger grids. Cells shrink, detail is lost, and the LLM has a harder time reading fine content like text or UI elements. Stick with 3×3 unless you specifically need to pack more seconds into one photo. 5×5 exists mostly as a "let me see what happens" option.
At 1fps sampling, the board count at each grid size:
| Video length | 2×2 | 3×3 | 4×4 | 5×5 |
|---|---|---|---|---|
| 3s | 1 (partial) | 1 (partial) | 1 (partial) | 1 (partial) |
| 9s | 3 | 1 | 1 (partial) | 1 (partial) |
| 25s | 7 | 3 | 2 | 1 |
| 60s | 15 | 7 | 4 | 3 |
| 186s (3 min) | 47 | 21 | 12 | 8 |
| 300s (5 min, cap) | 75 | 34 | 19¹ | 12 |
Bold = what auto picks — the smallest grid (biggest cells) that
keeps the board count under --max-boards (default 10).
¹ At the 5-min cap, even 4×4 exceeds 10 boards at 1fps, so auto drops
the sampling rate (≈1 cell per 1.9s) to land at the 10-board limit. Use
--fps 1.0 --max-boards 20 to preserve 1fps and accept more boards.
Most vision LLMs accept ~10–20 images per request, so auto's default ceiling of 10 keeps a full video inside a single model call.
Requires Python 3.9+ and ffmpeg on your PATH.
vidgrid samples one frame per second, runs Whisper on the audio, sends the grid + transcript to Claude, and prints the answer. The model correlates frames and words via the burned-in timestamps.
Because cells are globally numbered (1, 2, 3...) and tagged with timestamps, the model can point you at the exact moment. No scrubbing.
Send the PNGs to Claude in a single request and ask it to rank or reject clips against your shot list. This is the workflow vidgrid was built for.
vidgrid keeps the grid shape square (N×N) regardless of source orientation and preserves the source aspect inside each cell. Landscape sources produce wide boards; portrait sources produce tall boards. Cells are never cropped.
The default mode gives the LLM two correlated inputs: the rendered grid image AND the Whisper transcript as separate text. The model correlates them via the timestamps printed on each cell.
This beats burning captions into the image because:
Add --burn-captions if you want a self-contained image (useful for sharing
or offline analysis).
vidgrid reads and writes three caption formats. The --captions flag
auto-detects from the file extension. The --transcript-format flag
controls what --transcribe writes.
| Format | Extension | Size (36 words) | When to use |
|---|---|---|---|
json | .json | ~4.8 KB | Remotion pipelines, tools that need word confidence |
srt | .srt | ~1.4 KB | Video editors, universal subtitle format |
txt | .txt | ~0.4 KB | Smallest, grep-friendly, trivial to parse |
JSON (default, Remotion-compatible):
SRT (SubRip subtitles):
TXT (plain timestamped text, one word per line):
Use any format as input, output, or both. You can mix — read an .srt and
write a .txt with --captions foo.srt --transcript-format txt.
Modules: vidgrid.probe, vidgrid.sample, vidgrid.compose,
vidgrid.captions, vidgrid.llm, vidgrid.presets.
Single-board run:
Multi-board run:
Cells are numbered globally across boards. A 3-board run has cells 1–27 so the LLM can reference any frame without ambiguity.
ffmpeg -ss START -t 300 input.mp4 chunk.mp4.vidgrid's differentiator: 1 cell = 1 second, numbered cells, simple CLI, multi-provider LLM integration in one package.
MIT. The bundled Source Sans 3 font is licensed under SIL OFL 1.1.