---
name: showreel-selects-sheet
description: "Find the shots you remember (a sunset silhouette, a laughing close-up, a glass wall plate) across finished projects' camera files with Vivu, and get a checked selects sheet for a reel or treatment."
---Showreel selects from archived project footage with Vivu
This skill takes a director's or DP's archive of finished projects (camera files named only by a counter, such as A001_C003.MP4 or C0012.MP4) and four to six one line descriptions of shots they remember ("people as silhouettes against the setting sun", "a close-up of someone laughing", "a clean glass facade filling the frame"). Claude helps pick the shooting days worth searching from the user's own shot logs, exports small 720p proxies of just those days, prices the job against the user's Vivu plan, indexes the proxies in a private Vivu project, runs one search per description, checks every result in frames from the user's own file, and writes selects.csv: description, project, source file, start and end time, a frame, and an empty column for whether the client allows the shot in a portfolio. The user cuts the reel from the originals in their own editor.
The value is in what only the picture shows. Camera counters and folder names say which day and which card, and shot logs say "sunset exterior" at best. Whether the dark shape against the sky is a person or a mountain ridge, whether a close-up face has a real expression, whether a wall plate is sharp or soft is only visible in the footage, and this kind of footage usually has no dialogue for a transcript tool to read. Vivu looks at the picture; Claude then looks at frames, because searches by composition and light are the weakest kind of Vivu search, and nothing goes on the sheet as confirmed until a frame shows it.
When to use
Use when someone says "find the sunset silhouette shots from my last three projects", "I need a few close-ups with real emotion for my reel", "pull selects for my director's treatment from old footage", or "which of my archived clips have a glass building plate". It fits a few projects' worth of proxies (tens of clips, 10 seconds to 2 minutes each) that the user may process.
Not for:
- One quick question about one clip. Open it, or search the Vivu project directly.
- A whole archive drive. Index only the shooting days the shot logs point to (Step 3); the rest stays on the drive.
- Recognizing actors or other people. The skill never identifies anyone; the user decides who is in a shot and whether they cleared it.
- Shot size or camera movement on its own ("all my dolly shots"). This was not exercised in our test run; describe what is in the picture instead.
- Editing the reel. The skill finds and checks shots; the editor cuts.
Working principles
- Report measured numbers, not estimates. When a number is an estimate, say so.
- A search result is a candidate until Claude has looked at frames from the user's own file inside the result window. Only rows checked in frames are marked confirmed.
- Stop and tell the user when a required capability or tool is missing. Do not guess around it.
- Ask the user before anything that is expensive to redo: which days to export and the cost (before upload), and the descriptions with their search wording (before searching).
- Write descriptions as things a frame shows: who or what, where the light comes from, what fills the frame. Search results by light and composition can return look alikes (a mountain ridge for a person, a defocused wall for a plate), and the reason text repeats the query's words, so the frame decides.
- The Vivu result page link expires after four hours, so it only appears in the live reply. selects.csv refers to clips by the user's own file names and times.
What you need before starting
The skill runs in Claude Code on the computer that holds or mounts the archive (a terminal or the Code tab of Claude Desktop), because it reads local files and runs ffmpeg. Nothing is downloaded from the internet, so no residential IP is needed. It runs once per reel; nothing is scheduled and nothing is posted anywhere. Check each item at the start and tell the user plainly what is missing before doing anything else.
| Requirement | Why | How to check |
|---|---|---|
| Vivu connector with write access | create a project, open its upload page, search | vivu_get_account shows can_create_projects: true (tool names may carry a server prefix). "has not granted vivu.write" means the connection is read only: reconnect Vivu and allow write access. No Vivu tools at all: add the Vivu connector (https://mcp.vivu.ai/mcp) and stop |
| A shell with ffmpeg and ffprobe | export proxies, measure them, extract frames | ffmpeg -version and ffprobe -version |
| Read access to the archive folders | find the shooting days and export proxies | list one project folder |
| A folder with free space for proxies | 720p proxies are written next to the archive, not over it | ask for the folder; check it is writable with mkdir -p |
| The shot logs or project notes (text) | pick the days that may hold the shots | ask for the files or pasted text; without them, ask the user which days |
| A way to upload local files | move the proxies into Vivu | the user's own browser, or a browser tool that can attach local files (Claude in Chrome takes up to 10 MB per upload call) |
| Permission to process client footage | contracts or NDAs may forbid cloud processing or portfolio use | ask the user per project (Compliance) |
Inputs to collect
Ask for anything missing, most important first.
- The shot descriptions (required). Four to six lines, one shot idea each.
- The project folders to look in (required).
- Per project, whether the contract allows uploading the footage to a cloud service (required). Projects that do not are left out.
- The shooting days to export. Default: the days whose shot log mentions the light, place or subject of a description (Step 2).
- Picks per description. Default: up to 3, the best first.
- The Vivu project name. Default: "Reel selects YEAR", private.
Files and state
Keep the working files in one folder outside the archive:
reel-selects/
config.json project folders, days chosen, project_id, descriptions and their search wording
proxies/ 720p proxies, named PROJECT_ORIGINALNAME.mp4
proxies.csv proxy, project, original_path, duration_s, uploaded_name, video_id
results/ raw result of each description search without its result page link
frames/ strips and picked frames Claude checked
candidates.csv every returned window with its judgment and reason
selects.csv confirmed and uncertain picks (Step 7)
state.json proxies exported and uploaded with video_id, searches run with job_id, windows judged
A rerun reads state.json first and skips what is done: proxies already exported, already in the project, searches already run, windows already judged. Adding another project later exports and uploads only its new proxies; searches run again because a search covers the whole Vivu project, and judged windows keep their judgment.
Step 1: Check the Vivu connector and the setup
Goal: every row of What you need is present, or the user knows exactly what is missing.
- Call vivu_get_account. If the Vivu tools are missing, tell the user to add the Vivu connector in Claude (https://mcp.vivu.ai/mcp) and stop. The account must show can_create_projects: true. If a later write call fails with "has not granted vivu.write", ask the user to reconnect Vivu and allow write access, then retry.
- Run ffmpeg -version and ffprobe -version. Without them nothing can be exported or checked; stop and say so.
- List one project folder and read the shot logs. Ask the Compliance questions for each project now, before anything is exported.
Done when vivu_get_account shows can_create_projects: true, ffmpeg and ffprobe answer, and the user has said which projects may be uploaded.
Step 2: Pick the shooting days from the shot logs
Goal: a short list of days per project that may hold each described shot.
- Read the shot logs or notes for each allowed project. For each description, list the days whose entries mention its light, place or subject ("golden hour", "beach exterior", "interview close-ups", "downtown plates").
- Show the user the list per project with the reason for each day, and ask them to add days they remember and drop days they know are wrong. Shot logs miss things; the user's memory is the second source.
- Where there are no logs, ask the user which days to include rather than exporting everything.
This step was not exercised in our test run (the test footage came without shot logs; Step 6 describes what was tested).
Done when the user has approved a list of days per project.
Step 3: Export proxies and size the job
Goal: 720p proxies of the chosen days, measured and priced, with the user's approval.
- Export each camera file of the chosen days to a 720p H.264 proxy without sound (FILE is the original, PROJECT the project's short name, NAME the original file name without extension). Proxies are small enough to upload and keep the picture Vivu needs; sound is dropped because these searches look at the picture and it makes files smaller:
ffmpeg -v error -i "FILE" -vf "scale=-2:720" -c:v libx264 -crf 23 -preset veryfast -pix_fmt yuv420p -an "reel-selects/proxies/PROJECT_NAME.mp4"
Keep the original path in proxies.csv; selects.csv points back to it. 2. Measure each proxy (PROXY is its path):
ffprobe -v error -show_entries format=duration -of csv=p=0 "PROXY"
- Sum to minutes. Searches: one precise search per description, plus one rewording for a description whose first results include a look alike. A precise search uses 5 credits in total, so as an estimate six descriptions are 30 credits before rewordings; label the credit figure as an estimate.
- Call vivu_get_usage for the plan and what remains. The plans: Free is $0 a month with 20 indexing minutes a month and 50 search credits a month; Premium is $30 a month with 180 indexing minutes a month and 500 search credits a month.
- Show one table:
| This job | Remaining this month | Fits | |
|---|---|---|---|
| Index minutes | measured sum of proxies | from vivu_get_usage | yes or no |
| Search credits (estimate) | descriptions x 5, plus rewordings | from vivu_get_usage | yes or no |
- If it does not fit, offer these levers in order: drop days that only one weak shot log entry pointed to; drop clips the user knows are unusable (slates only, tests); split the projects into two sessions; move to a larger plan. Name every clip left out.
If vivu_get_usage returns no remaining figures (some admin or team accounts return null), show the needed minutes and credits anyway and ask the user to confirm the allowance.
Exporting proxies from camera originals was not exercised in our test run (the test files were already 720p web copies); measuring and pricing were.
Done when the user approves the proxy list and the cost table.
Step 4: Upload and index
Goal: every approved proxy is ready in one private Vivu project and matched to its row in proxies.csv.
- Call vivu_list_projects. Reuse this reel's project if one exists. Otherwise call vivu_create_project with the project name from the inputs and visibility "private"; the default is "organization", which every member of the Vivu workspace can see, and client footage should not be.
- Call vivu_open_upload_page with the project_id right before the upload. The link expires in 180 seconds, so request it only when the user or the browser tool is ready, and never paste it into a file.
- Give the link to the user to open in their own browser and select the proxies (the page takes many files at once), or open it with a browser tool that can attach local files. Claude in Chrome accepts at most 10 MB per upload call; larger proxies go through the user's browser or the Vivu web app. Never split, trim or recompress a file further to fit.
- Poll vivu_list_videos about every 30 seconds until every proxy shows status ready. Vivu replaces spaces and brackets in file names with underscores; match each video back to proxies.csv by the normalized name and by duration_ms against duration_s, and write video_id into proxies.csv and state.json.
The upload through the user's own browser was not exercised in our test run; the test files reached Vivu through a different upload path.
Done when vivu_list_videos shows every proxy as ready and every row of proxies.csv has a video_id.
Step 5: Turn the descriptions into search wording
Goal: one search per description, in words that describe what a frame shows.
- For each description, write a query that names the subject, the light and what fills the frame, and says what does not count when a look alike is likely. The first three rows of the table below are the wordings we tested.
- Show the user the descriptions with their wording and wait for approval.
| Field | Query | Mode | maximum_results |
|---|---|---|---|
| silhouette | a person or people seen only as a dark silhouette against a setting or rising sun, with an orange or red sky behind them | precise | 10 |
| closeup_expression | a close-up of one person's face filling much of the frame, showing a visible feeling such as laughing, smiling, sad or surprised | precise | 10 |
| texture_plate | an empty plate shot of a city wall or a glass building facade filling the frame, in sharp focus, with no people | precise | 10 |
| your own description (a template, not a tested query) | subject + where the light comes from + what fills the frame, and what does not count | precise | 10 |
Avoid asking for "unposed" or "candid" on its own: the search judges where the eyes point, not whether the person was posing (see the worked example).
All searches are precise: only precise returns a time range and a reason Claude can check; fast returns the whole file with an empty reason, so it is no use for picking a moment. maximum_results 10 leaves room for several takes per description; it is also the ceiling on how many candidates a description can get, so raise it when a search returns exactly 10. There is no speech search in this chain: archived B-roll rarely has dialogue that names a shot.
The chain: the shot logs narrow the archive to a few days; the description search finds windows across those days; frames from the user's own file decide what goes on the sheet.
Done when the user has approved the descriptions and their wording.
Step 6: Search each description and check frames
Goal: for every description, windows that Claude has judged from frames.
- Run each description with vivu_search_videos (project_id, query, mode "precise", maximum_results 10). It returns a job_id. Call vivu_get_search_results until complete is true; each status call can wait up to 45 seconds, so a pending search is not a stalled one. Save the completed result as results/FIELD.json with its result_page_url field removed. Show the result page link in the live reply only; it expires after four hours.
- For every result, extract a strip of three frames at the start, middle and end of the window (FILE is the proxy, START, MID and END are seconds inside the window, FIELD and NAME name the output):
ffmpeg -v error -ss START -i "FILE" -ss MID -i "FILE" -ss END -i "FILE" -filter_complex "[0:v][1:v][2:v]hstack=inputs=3,scale=1500:-1" -frames:v 1 reel-selects/frames/FIELD_NAME_START.png
- Judge the strip against the description: a person (not a ridge, a tree or a shadow on a floor) against a sunset sky; one face large in the frame with a visible expression (not a crowd, not a soft focus street); a wall or glass surface in focus filling the frame. Do not trust the reason text for light, focus or who is in the shot. Write every window into candidates.csv with confirmed, rejected or UNCERTAIN and a few words on what the frames show.
- Windows often cover a whole clip or run across two shots of the same camera file. For each confirmed window, make a half second strip to find where the shot starts and stops and to pick the best frame:
ffmpeg -v error -ss START -t LENGTH -i "FILE" -vf "fps=2,scale=320:-2,tile=6x4" -frames:v 1 reel-selects/frames/FIELD_NAME_sheet.png
LENGTH is the window length in seconds (at most 12, so 24 frames fit one sheet; make a second sheet for longer windows). Then save the picked frame at full size with ffmpeg -v error -ss PICK -i "FILE" -frames:v 1 -q:v 3 reel-selects/frames/FIELD_NAME_PICK.png. PICK is the time in seconds of the frame Claude picked on the half second sheet (START plus half a second times the cell index, counting from 0, left to right and top to bottom). 5. If a description's results include a look alike, reword it once (Step 5) and run it again. An empty search does not prove the footage has no such shot; tell the user and ask whether to add days. 6. Report to the user per description: results returned, confirmed, rejected, uncertain.
Worked example from our test run
The test corpus was 6 camera-roll style files (5.01 minutes, no sound, named like A001_C001) joined from public Creative Commons B-roll clips by many different shooters, so each file held several different shots, as a real card does. Truth was written from per second contact sheets before any Vivu call, with look alikes placed next to the targets: a man filmed from behind against a flat daylight sky, a sun setting behind mountains with nobody in the picture, shadows of dancers on a wooden floor, a street crowd, a soft focus market and a soft focus graffiti wall.
In our test run, with 0 rewordings:
- silhouette returned 3 results, 3 real, 0 false, 0 missed. None of the look alikes came back.
- closeup_expression returned 3 results, 3 real, 0 false, 0 missed.
- texture_plate returned 2 results, 2 real, 0 false, 0 missed; the soft focus wall right before the glass tower in the same file was not returned. Both plates in the test corpus were glass; a sharp brick or concrete plate was not tested.
- A probe for "unposed" close-ups returned 3 results, 2 real and 1 false: a posed portrait whose subject looks into the lens and turns his head away in the last seconds of the take.
- The run used 4 precise searches, an estimate of 20 credits.
Almost every window ran past the shot into the neighboring shot of the same file, at the start or the end. We made a half second sheet for every confirmed window; it showed the real cut every time, so the start and end in selects.csv come from frames, not from the window. Reading the cut to the half second matters: a per second look put some in points on the last frame of the previous shot or a black card between shots. The six files were ready about 5 minutes after the upload began.
This is one small, clean corpus where each look sits in its own shot, so it says little about recall on a real archive. Searches by light and composition are rated weak in general and have failed on other footage (audience shots, look alike products), so keep the frame check even when a first run looks clean.
Done when every description has a results file, every window has a judgment in candidates.csv, and the user has seen the counts.
Step 7: Build the selects sheet
Goal: selects.csv the user can work through in their editor.
- Write one row per confirmed or UNCERTAIN pick, descriptions in the user's order, best first:
description,project,source_file,original_path,start,end,frame_path,status,portfolio_ok
silhouette at sunset,PROJECT,PROXY_NAME.mp4,ORIGINAL_PATH,00:44,00:58,frames/silhouette_PROXY_NAME_0044.png,confirmed,
start and end come from the half second sheet, not the raw window. status is confirmed when frames show the shot, UNCERTAIN when Claude could not tell (say why in candidates.csv). portfolio_ok is always left empty: only the user knows what the contract and the people on screen allow. 2. Show the user the first rows and the field mapping, and wait for a yes before writing the rest:
| Field | Source | If unavailable |
|---|---|---|
| source_file, original_path | proxies.csv | the row is not written |
| start, end | half second sheet inside the search window | the raw window, marked UNCERTAIN |
| frame_path | the picked frame | empty, status UNCERTAIN |
| status | Claude's frame check | UNCERTAIN |
| portfolio_ok | the user | empty |
- Tell the user how to open a pick: the original path and time are enough in any editor; the Vivu result page link from Step 6 works for four hours and is not stored.
In our test run selects.csv and candidates.csv were written from the checked windows; nothing was sent anywhere.
Done when selects.csv and candidates.csv exist and the user has seen the counts of confirmed, rejected and uncertain windows.
Compliance
- Client footage. Before Step 3, ask per project whether the contract or NDA allows uploading the footage to a cloud service and showing it in a portfolio. Projects that do not allow upload are left out entirely; portfolio_ok stays empty for the user to fill.
- People on camera. The skill does no face recognition and names nobody. Actors, crew and passers by need a release before their shot goes into a reel; that is the user's call, recorded in portfolio_ok. Shots of minors need a parent's or guardian's consent for portfolio use; the skill cannot tell ages and says so.
- Where the videos go. Proxies are stored in the user's Vivu project until the user deletes them. Create the project as private; the default "organization" visibility shows it to every member of the workspace. The skill never calls vivu_delete_project or vivu_delete_video unless the user asks, and confirms first.
- Nothing leaves the computer except the upload. The skill posts nothing and never writes into the archive; proxies and sheets go into reel-selects/.
Known failure modes
| Symptom | Cause | Fix |
|---|---|---|
| (observed) a window starts on the previous shot of the same file (a daylight figure, a mountain sunset) before the silhouette appears | windows are wider than the shot and do not stop at a hard cut | find the cut on the half second sheet and write that time into selects.csv |
| (observed) a close-up window ends on the next shot, a street crowd or a wide station view | the same | trim end from the half second sheet; never use the raw window as an in point |
| (observed) an "unposed" search returns a posed portrait, with a reason saying "turns his gaze and head away from the camera in an unposed moment" | the search sees where the eyes point, not whether the person was posing | describe what the frame shows (eyes down, laughing at something off screen) and judge posing from frames |
(observed) vivu_get_usage shows "remaining_index_minutes":null |
admin or team accounts may not report a remaining allowance | show the needed minutes and credits and ask the user to confirm the allowance |
| a sunset with no person, or shadows on a floor, comes back as a silhouette | searches by light and composition are weak and can return look alikes | reject from frames; add "a person" and what does not count to the wording |
| a soft focus wall comes back as a plate | the same | judge focus from the full size frame, not the reason |
| a description returns nothing although the user remembers the shot | an empty result does not prove the footage has no such shot | ask which other days might hold it, export them, and search again |
| "has not granted vivu.write" | Vivu connected read only | the user reconnects Vivu and allows write access |
| upload page asks to sign in or shows an error | the one time upload link expires after 180 seconds | request a new link right before opening it |
| a proxy is rejected by the browser upload tool | the file is above the tool's limit (Claude in Chrome takes up to 10 MB per call) | the user opens the upload link in their own browser or adds the file in the Vivu web app; never split or recompress it |
| two proxies point at the same Vivu video | camera counters restart, so two cards share a file name | prefix proxies with the project name; match on name and length |
| a search returns exactly maximum_results windows | the search reached its ceiling | raise maximum_results for that description |