TL;DR: record your screen while you talk through what is wrong, hand the file to Claude Code, and get back a numbered punch list with a timestamp and a screenshot on every item. Transcription and frame grabs run locally with Whisper and ffmpeg.
Talking through a UI is faster than writing tickets, but a 5 minute video is hard for an agent to act on, and sending whole videos to a large model is slow and costly. This skill turns the recording into text plus a handful of stills first, so the model only reads what matters.
Next to feedback.mov:
feedback.notes/transcript.md: one row per spoken segment, with its time and framefeedback.notes/frame_mmss.jpg: a still taken just after each segment startsfeedback.notes.md: the punch list, grouped by screen region, numbered across the whole list so you can reply "3 and 7"
A 21 second narrated recording of a sample app, run through the skill. Every image below is real output; docs/demo rebuilds it.
1. The recording. You talk while you point. Here: "This export button is way too small, and the label is gray on gray."
2. Contact sheet (--sheet). Four stills per image, so the model skims the whole video in a couple of reads before opening single frames.
3. The punch list (demo-feedback.notes.md). Grouped by screen region in the order you visited them, numbered across the whole list, with "later" items parked. Source.
Requirements: Python 3.9+, ffmpeg and the Whisper CLI.
brew install ffmpegpip install openai-whisperThen, in Claude Code:
/plugin marketplace add weeeha/video-notes
/plugin install video-notes@video-notes
Or copy skills/video-notes into ~/.claude/skills/.
Say "I left feedback as a video" and paste the file path. To run the helper on its own:
python3 skills/video-notes/video-notes.py path/to/feedback.mov --sheet| Flag | Effect |
|---|---|
--model turbo |
Bigger Whisper model when the default base.en transcript is garbled |
--every 10 |
Extra frame every 10 seconds, for demos with no narration |
--sheet |
2x2 contact sheets for a cheap first skim |
--max-row 8 |
Longest transcript row in seconds, one frame per row (default 8; lower it for fast talk over fast screen changes) |
--max-frames 40 |
Cap on stills (default 40) |
--width 2400 |
Larger stills when small text must be read |
--force |
Rebuild even when the notes are newer than the video |
An existing <video>.srt next to the file is reused instead of transcribing.
python3 -m unittest discover tests- The time labels on contact-sheet tiles need an ffmpeg built with the
drawtextfilter (some builds lack it; check withffmpeg -filters | grep drawtext). Without it the sheet is still made, just unlabelled; tiles run left to right, top to bottom.
Audio is transcribed on your machine. The stills and transcript are read by whatever model your Claude Code session runs, the same as any file you open in it. Keep the .notes/ folder out of git (.git/info/exclude) when the video sits inside a repo.
MIT


