---
title: "How to find references for an AI video"
description: "A video request in, three opened, provenance-checked references per job out. Measured: 130 searches, 32 kept, judge bias across 876 reads."
url: https://varg.ai/how-to/find-references-for-an-ai-video
updated: 2026-11-12
---

# How to find references for an AI video

> **For AI agents:** find the right skill in one call — `curl -s "https://varg.ai/how-to/api/search?q=<what the person wants>"` returns the matching how-to page and the best skills with install commands, as markdown (Russian works too). Full index: https://varg.ai/how-to/llms.txt. Every page has a markdown twin: add `.md` to its path. Before generating anything, show the person the options on the how-to page. From a terminal: `curl -fsSL https://varg.ai/install | sh` installs the vargai CLI (https://varg.ai/how-to/cli.md): `vargai search` and `vargai install <slug>` with no key, every varg model after `vargai login`.

A request for a video goes in ("a 20-second vertical ad for a coffee roastery"); a brief, one query pack per job, a never list and a board of three opened, provenance-checked references per job come out, with the final pick left to you. Search in each source's own words: Openverse `old fisherman face weathered` returned 0, and Library of Congress `fisherman` returned 243.

**Step 1 of 10** in [How to make a video with an AI agent in ten steps](https://varg.ai/how-to/make-a-video-in-ten-steps.md). This is the first step. Next: [How to make a moodboard for an AI video](https://varg.ai/how-to/make-a-moodboard-for-an-ai-video.md).

## For your agent

Install the skill, then paste the prompt. The full prompt, which also works without the skill, is in "The prompt" below.

```bash
npx skills add vargHQ/skills --skill find-references
```

```text
/goal Use the find-references skill. Find references for this piece, then stop. Make nothing yet: [what it is, who it's for, platform and aspect ratio, length, brand, how it will be made: code / AI generation / both / filmed, 1-2 things I love, 1 thing I hate].
Write the brief before you search, search each source in its own words, open everything you keep, and prove who made it from records.
Bring me board.html with three candidates per job, shuffled, no scores. I make the final pick.
```

## The short version

- Write the brief first: 11 fields, each marked said, assumed or asked, and at most two questions to you (what you hate, and the method).
- Run the obvious search first and ban what repeats. Write each never entry as "Reject if" plus a positive wording: 41.5% of failed negated statements rendered exactly what the prompt forbade.
- Search in each source's own words, 1 to 2 catalogue words, no mood words. Starting floors: light 6 queries across 3 sources, framing 4, people 4; stop a job when two queries in a row add nothing new.
- Respect access: 401, 403 and a bot wall are final. Person-only sites (Pinterest, ShotDeck, Film-Grab, Meta Ad Library) become links in `links.md`.
- Open every candidate you keep and prove who made it from records before judging pixels: people scored 52.6% on 5-second fakes from 2026 models.
- Code measures, the LLM only answers yes/no about visible things: a naive judge picked the first of two identical images 10 of 10 and the polished copy 38 of 40.
- Freeze only what the person said: with an invented light direction the best room lost 6 of 6 pairs, and with it removed it won 8 of 8 in each model family.
- Feed a model 1 to 5 references, each with one role: scores fell from 7.817 with one reference to 4.891 with two (MultiBanana, older models).

## Why agents need this

Without a reference, an agent falls back to its default look: ["centered text, gradient background, everything fading in"](https://x.com/rexan_wong/status/2103707054108299437). More adjectives do not fix that. Three facts shape everything below.

- **No library lets you search by ratio, shadow edge or Kelvin.** You search with the words a cataloguer used, then measure what you find.
- **Machines read light and taste badly.** A mean of 24 vision models scored 41.6% on lighting condition and 57.5% on lighting type ([ShotBench](https://arxiv.org/html/2506.21356), older models). No off-the-shelf judge passed 0.55 agreement with designers, against a human ceiling of 0.741 ([Design Crit](https://contralabs.com/research/design-crit)).
- **The best libraries are not for bots.** Film-Grab, ShotDeck, Pinterest, Rate Your Music and Bandcamp's pages forbid or block agents. Your agent reads open archives and writes links for you.

So each part does what it can do.

| Who | Owns |
|----|----|
| Code | facts in pixels and timing: brightness, colour, cuts, tempo |
| Records | who made it, when, and the rights |
| The LLM | literal yes/no checks and the shortlist |
| You | meaning, taste and the final pick |

Reference finding then becomes logistics with a taste step at the end. Most of the gain is discipline your agent can follow today.

## The prompt

Paste this after `/goal` in Claude Code, or as a task in any agent with a shell and web access. It works with or without the skill. Fill in the first line.

```text
/goal Find references for this piece, then stop. Make nothing yet: [what it is, who it's for, platform and aspect ratio, length, brand, how it will be made: code / AI generation / both / filmed, 1-2 things I love, 1 thing I hate].

If the find-references skill is installed, follow it. Otherwise read it first:
https://github.com/vargHQ/skills/tree/main/find-references (references/ has one file per job; scripts/search.py searches 22 open sources with no key). Read SKILL.md and references/queries.md, then only the job files this piece needs. Run from my project folder and never write into the skill folder.

The idea: code owns facts in pixels and timing, records own who made it and the rights, you own literal yes/no checks and the shortlist, I own meaning and the pick. On generated work light matters most; on coded work type, motion and palette come first, and light only where a shot has it. Say which order you used. Some things only I can find: finding that out early and writing the link is a good result.

1. Write brief.json: idea (what the viewer should believe afterwards), feeling (two adjectives and one opposite), subject, world (place and decade), medium, audience, platform, method, constraints, loves, hates. Mark each said, assumed or asked. Ask me at most two questions, about what I hate and the method. Also ask me to attach real assets; that does not count. If my request is vague, show three contrasting territories as a 3 x 3 sheet and ask which row is nearest and which is worst.

2. Run the most obvious search. Say what it actually returned, name what repeats, and mark anything you expected but could not confirm. Write never.md from that search and from what I said I hate, as "Reject if <something a stranger can check on a frame, a clip or a text>", each with a positive wording for prompts, because negatives often backfire in generators. For ads, write Meta Ad Library and TikTok Creative Center links for me: the real picture of a category is there.

3. Write queries.md: one query pack per job this piece needs. Start from these floors, which are not limits: never (2 queries), light (6 across 3 sources), framing (4), people (4), location (3), texture (2-3), palette (2), type and graphics (2-3), motion (3), music (3). Stop a job when two queries in a row add nothing new. Add one query for the whole brief.
- Search in each source's own words. Keyword sources want 1-2 catalogue words. Delete mood words such as cinematic, moody, weathered.
- No library searches by ratio, shadow edge or Kelvin. Search for what is visible (one window, street lamp, candle), and keep numbers for the board.
- Never write "no X" in a semantic query. Filter afterwards. Skip caption queries if you have no semantic engine.
- Read the author field of good Wikimedia Commons hits: institutions upload whole collections. Ask a local archive by name.
- People: search the cataloguer's job word plus a place or decade. I want who the person really is, not the pose, place, expression or clothes: bones, what life has done to the body, work marks, how they carry themselves, one line of biography. Write that as an identity card in words.
- Palette: for the first board, extract from three named frames of candidates. After my pick, re-extract from the picked frame. One frame is fine for a painting or a still.
- Motion: search a format noun plus filters, pick by eye, then measure a clip you may process and write the spec from the numbers. Clips you may process come from Wikimedia Commons (filetype:video) or from me. Refs and whatships name films for me to watch: link them, do not process their clips. Open clips rarely match an ad, so for an ad I watch and supply the clip. On Refs, ai_made:false removes code-made films and ai_made:true mixes them with generated ones: for a coded piece use made_with (hyperframes, remotion).
- Type, for a coded piece: real use, then its class, then 3 fonts with a licence, then check what the piece needs (tabular figures, diacritics, weights), then I compare by eye. A genre of posters can be a Commons category. Lettered posters often name no typeface: classes only, and that is no failure.
- Music: search metadata in era and function words. You cannot hear, so I choose. Borrow tempo, instruments, era, arrangement. Never a melody, voice or artist's name. If there is a voiceover, write one casting line (age, region, texture, pace).
- Skip the first famous name that comes to mind. Take the same job from another field: candlelight from a painting, 9:16 composition from a hanging scroll.

4. Respect access. Never fetch Instagram or Reels, Film-Grab, ShotDeck, Shot Cafe, Eyecannndy, Pinterest, Google Images, Vimeo, Meta Ad Library, TikTok Creative Center, Ads of the World, Rate Your Music, Bandcamp pages, Tunefind or any site that blocks you, not even to check a link. 401, 403 and a bot wall are final: stop and write the link. A 429 means slow down: wait what Retry-After says, or 60 s, try once more, then stop using that source for this run. Do not spoof a user agent, sign in or download store previews. Write those searches into links.md for me with one line of reason each. Prefer open archives (Met, Rijksmuseum, Wikimedia Commons with category walks, Library of Congress, Internet Archive, Poly Haven, Flickr's public feed for leads, Are.na, MusicBrainz, ListenBrainz, Discogs' API), Refs, and FrameThrower if connected. Log every search, including failures, with its source, exact query, rank and count.

5. Fuse each job's results with reciprocal rank fusion (score = sum of 1 / (60 + rank)). Fusion does not cut by maker, and few items overlap across sources, so read the top of each query too. Open every candidate you keep. Write one line saying only what you can see. Delete what you could not open. Only then keep one pick per maker.

6. Prove who made it from records, before judging pixels. Label each HUMAN-PROVEN (a film title, a holding archive, or a named author with a date before 2022 and a body of work), LIKELY HUMAN, UNKNOWN (mood only, no measuring, no feeding) or AI (never board only). "No AI marker" and "detector says human" are never a pass. Tag each feed (mine, licensed for this use, CC0 or public domain, and no identifiable person), words or look. CC BY and BY-SA are words unless I clear them. A public-domain painting is legally feed, but start from words and feed it only after a test frame. Any identifiable real person is words, even in a public-domain photo. Never feed a stranger's face, name a real person in a prompt or use a real minor.

7. Measure what code can read: brightness on each side, contrast, colour by LAB from the real frame, cuts, holds, camera movement, tempo as a range. Then judge light only on generated work, and only if more than 3 candidates survive these gates. Coded work usually needs no judge: run one only on a generated still's light, or where more than 3 survive. For light prefer frames without people; I confirm the rest. For other jobs, gates, code and I are usually enough. Write a want card per job before seeing candidates, with values only and no praise words. Freeze only what I gave or the brief implies; anything you invent is marked assumed and cannot be core, so if you invent a side write direction: any and skip that question. My words outrank your card: a reference that fits the brief and fails an assumed value comes to me with a note. Strip title, maker, date and source from what the judge sees. Use images under random ids, never upscaled. Ask only yes/no questions about visible things, evidence with a location first, and cannot_tell allowed. Shuffle the order on each read, take 3 reads (2 on a small budget), and use a second model family if you have one. If the frame has no face, read the wall or floor nearest the source and the shadows of furniture. Compare the top few in pairs, both orders; a win counts only if it holds both ways. Never ask for lens, film stock, ratio, hex, beauty, or anything about a person's character, class or looks. Never ask "is this good?" and never score 1 to 10.

8. Build board.html: three candidates per job, grouped by job, shuffled, numbered after shuffling, no scores, with a keep or reject button and a note per candidate. With the skill installed, scripts/board.py builds it from board.json. Without it, write one self-contained page that does this. A look reference goes on as a link with no image. Say "these three pass the checks", never "the best". Picks go to "more like this". Rejects go to never.md with the reason.

9. Write refs.md: one job card per kept candidate with id, job, URL, maker, year, what I see, lends (one thing, with numbers from a measurement or record), must not copy, rights, provenance label, and the query and rank that found it. Mark picks when I pick. An image that truly does two jobs gets two cards. For coded work also write DESIGN.md (hex, type, grid, motion, each value labelled measured, record, by eye or assumed, with its source frame) and timing.md (beat, seconds, frames, what moves first, ease, source; beats are usually assumed, and labelled so). For generated work add one role line: "@Image1 defines the light only. Do not copy the room, the person or the colours."

Done when:
- brief.json, queries.md, search_log.jsonl, never.md, refs.md, links.md and board.html exist.
- never.md's tests come from a search you ran and from what I said I hate.
- Every kept reference was opened, and each card has one job, what not to copy, rights and provenance.
- For coded work, DESIGN.md and timing.md exist. If a generated person appears in an ad, you flagged possible disclosure (New York, EU Article 50(4)) for me to decide.
- Each job has three candidates on the board, or you say why not, and every light reading is either measured or marked for me to confirm.
- You list each source you could not reach, each silent zero, what you did not test and what you could not find.
- No person-only site was fetched, no real person's face was fed, and nothing was invented.
```

Shorter prompts for one job at a time, such as light only or rank what I already have, are in [`references/goal-prompt.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/goal-prompt.md).

## One real run, start to finish

We gave a fresh agent only the prompt and this request: *a 20-second vertical ad for a small-batch coffee roastery in Lisbon, made with AI video and a coded end card. I love old Portuguese tile shops and how a room looks before dawn. I hate slow-motion coffee pours.* It logged 130 searches and kept 32 references. No person has judged the result, and here is what it found.

![A dark tile works: two high cold windows, shelves and plaques, one small warm lamp at the right edge](https://varg.ai/how-to/guide-pages/find-references-for-an-ai-video/img/inline-fc1f8d7d52.jpg)

**Light, the best find.** `interior tile` in the Library of Congress building survey, rank 2 of 318: two cold high windows and one small warm lamp in a dark working room. 5.1 stops, 90% of pixels under half grey. No people, and free to feed. [Moravian Pottery & Tile Works](https://www.loc.gov/resource/hhh.pa3690.photos/?sp=9), Jet Lowe.

![De Hooch, The Visit: one window at frame left lights a wall, the room falls dark](https://varg.ai/how-to/guide-pages/find-references-for-an-ai-video/img/inline-5fa1ba2050.jpg)

**Light, from a painting.** One window at frame left, right side falling dark: bright side left, ratio 2.55, 6.1 stops. It lends light only, and its people stay out. [The Visit](https://www.metmuseum.org/art/collection/search/436678), Pieter de Hooch, ca. 1657.

| Job | What came back | Would you use it? |
|----|----|----|
| Never | From 15 opened thumbnails of the obvious search: a logo centred over the scene (5), a built pastel set (4), a person holding the product and doing no work (9). The person's own hate went on the board too | Yes. It describes Nespresso more than small roasteries, so the agent wrote Meta Ad Library links for a person |
| Light | 26 queries where we budgeted 6. Words like `dawn` matched captions and not light. One word pair changed everything: `interior tile` | Yes |
| Location | Commons category walk through *Shop signs in Lisbon* gave real lettering and tile, with author, date, camera and licence in one call | Partly. **No open source returned the inside of a Portuguese tile shop,** so that went to `links.md` as "the most useful thing you can do" |
| Type | One real Lisbon sign with a named typeface, through Fonts In Use | Yes, for hierarchy and ageing |
| Motion | Refs cards were all locked, with no clip to measure. Open clips did not match an ad brief | No. A person has to watch and supply the clip |
| Music | A real coffee roaster's sound on Openverse, Carlos Paredes (1971), Dead Combo (2008) | Unknown. An agent cannot hear |

**Three lessons went straight back into the skill.** First, a judge can be confidently wrong for a boring reason: the agent invented "camera-left" to freeze its want card, and the tile works lost all 6 pairs. With the invented side removed it won 8 of 8 in each model family, while better wording made no measurable difference. So anything invented is now marked assumed and can never be a core criterion. Second, finding out early that only a person can find something, and writing the link, is a good result. Third, the best route, walking Wikimedia Commons categories, was not in our helper at all, so now it is.

## From your request to a set of queries

**1. Write the brief first.** Eleven fields: idea (what the viewer should believe afterwards), feeling (two adjectives and one opposite: "quiet, earned; not cosy"), subject, world (place and decade), medium, audience, platform, method (coded, generated, hybrid, filmed), constraints, loves, hates. The agent marks each one said, assumed or asked. It asks at most two questions: what you hate, and the method if it cannot tell.

**2. If the request is vague, show pictures.** For "make something cool for my coffee brand", the agent writes three territories that differ in light and world, runs one cheap query each, and shows a 3 × 3 sheet: "Which row is nearest, and which is worst?" Nearest sets feeling, world and light. Worst seeds the never board.

**3. Run the obvious search first, and ban what repeats.** The safe middle can be counted: on Refs, `dark UI` in the launch category returned 2,277 films (tested). What the top results share becomes the never list, along with what you told it you hate. Say what the search really showed: for ads, the real picture of a category is in Meta Ad Library and TikTok Creative Center, which only you can open.

**4. Write one query pack per job, and spend the most on light.** These are starting floors, and our proposal. Stop a job when two queries in a row add nothing new: light took 26 queries on a hard brief, and that is fine.

| Job | Queries | Sources |
|----|----|----|
| Light | 6 | 3 sources |
| Framing | 4 | 2 to 3 |
| People | 4 | 2 to 3 |
| Location | 3 | 2 |
| Motion | 3 | 2 |
| Music | 3 | 2 |
| Texture | 3 | 2 |
| Type | 3 | 2 |
| Never | 2 | 2, run first |
| Palette | 2 | 2, from chosen frames |

Queries per job. Light 6, framing 4, people 4, location, motion, music, texture and type up to 3, never and palette 2.

**5. Fill up to five slots in each pack.**

| Slot | What it is | Use on |
|----|----|----|
| L, literal | the source's own facets and words | every source |
| C, caption | one sentence describing the imagined frame | semantic search only |
| N, named | a maker or work you will open and check | archives |
| A, adjacent | the same job from painting, print, architecture, local words | Met, Commons, Discogs, Are.na |
| X, excluded | what must not appear | keyword minus terms; otherwise filter afterwards |

**6. Search in each source's own words.** Keyword sources want one or two catalogue words. A silent zero usually means the wrong vocabulary, so open one good result, read its tags and reuse them. Never write "no X" into a semantic query: vision-language models score about chance on negation ([NegBench](https://arxiv.org/abs/2501.09425)).

| Job | Safe middle | One step further | What came back (tested 2026-11-03) |
|----|----|----|----|
| Light | `cinematic lighting` | Met `candlelight`, medium Paintings | 6 objects; of two opened, one exact, one with no candle |
| Light | `description=candlelight` | Rijksmuseum `description=kaarslicht` | 3 against 10 |
| Framing | `vertical video composition` | Met `hanging scroll`, medium Paintings | 906 |
| People | `old fisherman face weathered` | LoC FSA `fisherman` | Openverse 0, LoC 243 |
| Location | `moody liminal diner night cinematic` | Commons category `Diners in the United States` | category found |
| Texture | `vintage film look` | Flickr tag `superia400` | 20 |
| Motion | `cool animation` | Refs `kinetic type`, category motion, `ai_made:false` | 1,827 of CPU coolers and cars against 64 on target |
| Music | `chill background music` | Discogs style `Dub Techno`, year 1996 | 47 |

**7. Fuse, then open every survivor.** Reciprocal rank fusion, `sum of 1 / (60 + rank)`, merges duplicates across queries. Different sources rarely share items (6 of 119 in our run), so read the top of each query too. Open each one and say only what you can see, because keyword hits lie. One pick per maker happens only at the shortlist, after you have looked.

![Holy Family with Saint Anne: one low candle lights faces from below against black](https://varg.ai/how-to/guide-pages/find-references-for-an-ai-video/img/inline-702365658f.jpg)

**Met, `candlelight`: right.** One low candle, faces lit from below, the room falling to black. [Holy Family with Saint Anne](https://www.metmuseum.org/art/collection/search/436344), early 17th century.

![Saint Catherine of Alexandria: flat gold ground, no candle, no directional light](https://varg.ai/how-to/guide-pages/find-references-for-an-ai-video/img/inline-5e06b38716.jpg)

**Same search: wrong.** Flat gold ground, no candle, no direction to the light. [Saint Catherine](https://www.metmuseum.org/art/collection/search/436908), Lorenzetti, ca. 1342.

**8. Turn feelings into hypotheses.** No validated dictionary exists, so this is a starting guess that a chosen frame overrides. Music has the strongest evidence ([Eerola et al.](https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2013.00487/full) explained 77 to 89% of rating variance). The full table, marked measured, craft or hypothesis per cell, is in [`references/queries.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/queries.md).

**9. Feed a model far fewer references than it accepts.** Vendor limits are ceilings: Nano Banana 2.1 takes 14 and Kling 4.0 takes 15. In [MultiBanana](https://arxiv.org/html/2511.22989), scores fell from 7.817 with one reference to 4.891 with two (older models). Use 1 to 5, each with one role: `@Image1 defines the light only. Do not copy the room, the person or the colours.` Keep identity sheets flatly lit, because [adherence falls](https://arxiv.org/html/2609.37709) when a reference already carries a strong state of the thing you are trying to control.

## For code, and for generation

The same brief needs different references depending on how the piece gets made. Generation needs references a model can absorb, so they become images with roles, or words. Code needs references that can be measured and rebuilt, so they become numbers. **The priority changes too:** in a generated film, light comes first. In a coded film, type, motion and palette come first, and light matters only where a shot has it: a 3D scene, a single still, an HDRI.

|  | Coded (HyperFrames, Remotion, three.js) | Generated (Seedance, Kling, Veo, Nano Banana) |
|----|----|----|
| Light | HDRI choice, key angle, shadow softness, gradient and glow values | real-looking source: direction, hardness, colour |
| Framing | grid, margins, scale ratios, safe zones | shot size, lens, staging |
| Texture | noise, grain shader, PBR maps | material words, or a neutral close-up |
| Palette | exact hex and contrast | named colours and a chosen frame, loosely held |
| Type | exact licensed font, tracking, size in px | avoid in frame; overlay in code |
| Motion | seconds per beat, ease curve, what moves first, stagger | camera verb, subject action, cut rate |
| Rights question | shipped fonts, textures, code licences | every fed image |
| Output | `DESIGN.md` and `timing.md`, every value labelled measured, record, by eye or assumed | role lines and a look description |

Hybrid is often the answer: generate plates, and set type and data in code.

**What this looked like on a real coded brief,** a 45-second launch film for an invoicing app, for a person who loves Swiss railway posters and hates everything fading in. A fresh agent came back with a palette taken from a real 1930 poster (`#1F2D2E` 37.2%, `#E2E2CB` 20.9%, `#5A3932` 16.1%, `#166B99` 13.2%), a timing primitive measured from a Swiss station clock (hold 1.4 to 1.6 s, then a jump in 2 to 3 frames at 25 fps), and a type class from Müller-Brockmann's *Der Film* (Akzidenz-Grotesk, named on Fonts In Use). It also found that Libre Franklin and Host Grotesk have no tabular figures in their latin 400 files, which matters when the film shows invoices. Nothing it found gave a whole-film structure, so the beats were assumed and labelled as assumed. That is normal, and labelling it is what counts. No person has judged this result yet.

## Light: the main priority

A light reference proves one thing: this source, from this side, with this edge, can make this picture. You can point at the shadow and at what made it. It lends light only.

![Vermeer, Young Woman with a Water Pitcher: daylight from a window at frame left](https://varg.ai/how-to/guide-pages/find-references-for-an-ai-video/img/inline-6956c936c7.jpg)

[Young Woman with a Water Pitcher](https://www.metmuseum.org/art/collection/search/437881), Vermeer, ca. 1662. Public domain.

**How to read it, always in this order**

1.  **Cast shadows.** ["What direction is the light coming from?" "The shadows will tell you."](https://strobist.blogspot.com/2006/04/reverse-engineering-other-shooters.html)
2.  **Nose and chin.** [Start there](https://fstoppers.com/how-to-read-light-in-photography-part-2): short and straight down means in front and a little above.
3.  **Catchlights** in the eyes, if there are any.
4.  **Number of sources:** count shadow directions.
5.  **Falloff:** how fast it goes dark. Near sources fall off fast.
6.  **Shadow edge:** a crisp line means small or far, a gradient means large or near.
7.  **Ratio in stops:** lit side against shadow side of one surface. 1 stop = 2:1, 2 = 4:1, 3 = 8:1.
8.  **Colour** of highlights and shadows, on a neutral surface.
9.  **Motivation:** what in this scene could make this light?

**A frame can show** side, height, hardness, relative contrast and apparent colour. **It cannot show** the lamp, whether a strobe fired, the on-set ratio or the true Kelvin, so the agent answers "unknown" to those every time.

**Then measure it.** The window is on the left, and the script agrees. It measures the frame as graded, so `lr_ratio` is not a key-to-fill ratio.

```bash
$ python3 scripts/frame_light.py DP353257.jpg
{"left_mid_right": [0.125, 0.101, 0.071], "bright_side": "left", "lr_ratio": 1.75, "contrast_stops": 4.9,
 "p5": 0.009, "p50": 0.063, "p95": 0.265, "highlight_k": 5060, "shadow_k": 8019, "source_size": "555x624"}
```

**Split the spec before you search.** `single practical tungsten lamp, 4:1 ratio, hard falloff, interior night` is a good board line and a bad query. Visible words go in the search box, numbers stay on the board.

| Feeling | Visible words to search | Numbers for the board |
|----|----|----|
| Lonely | one distant source, a small pool, surroundings fall to dark, cold ambient | key to shadow 3+ stops |
| Tense | single hard source, shadow edge across the eyes, top or side, unwell colour | 3 to 4+ stops, hard edge |
| Tender | large soft window from one side, shadow wraps, warm | 1 to 2 stops |
| Nostalgic | low sun through a curtain or haze, warm highlights, lifted blacks | low contrast, sun under 10° |
| Luxury | big controlled soft sources, clean black, a defined edge line | low key but soft, background 3+ stops under |
| Documentary truth | only what the location has, uneven, mixed colour left uncorrected | unset, measure after |

This table is a convention from teaching sources and prompt guides, with no experiment behind it.

**Where to search light, in order**

| Source | How | What came back (tested) | Who |
|----|----|----|----|
| [Deakins: Looking at Lighting and forum](https://www.rogerdeakins.com/jesse-james-x-3/) | `rogerdeakins.com/?s=window+light`, read his replies | his plans, frames and words on one scene | agent; never feed the frames |
| [FrameThrower](https://framethrower.ai/api/v1/openapi.json) | `POST /api/v1/search` with `lighting`: sun, window, moonlight, practical, neon, fluorescent, firelight, candlelight, streetlamp, screen_glow, headlight, lightning | not tested, needs your account. The only library with a filter for what lights the frame | token |
| [Poly Haven HDRIs](https://api.polyhaven.com/assets?t=hdris) | filter `attributes` on your side | `night + artificial + outdoor + high contrast` 15 | agent, CC0; real light you can also use in code |
| [Met](https://metmuseum.github.io) | `q=Georges de La Tour&artistOrCulture=true&isPublicDomain=true` | Vermeer 6, Caravaggio 6, Rembrandt 43. Search by artist more than by light word | agent, feedable |
| [Rijksmuseum](https://data.rijksmuseum.nl/docs/search) | `description=kaarslicht&type=painting` | 10; `maanlicht` 12; `venster` 55. Translate first | agent |
| [Wikimedia Commons](https://commons.wikimedia.org/w/api.php) | `incategory:"Rembrandt lighting"`, `-deepcat:"AI-generated images"` | 13\. Plain `chiaroscuro` gave 19,808 with dahlias and cosplay | agent |
| [Library of Congress FSA/OWI colour](https://www.loc.gov/collections/fsa-owi-color-photographs/?q=night&fo=json&c=3) | `?q=night&fo=json` | 25; real practical light in colour | agent |
| [SunCalc](https://github.com/mourner/suncalc) | `getPosition(date, lat, lng)` | sun height and direction for any place and time | agent |
| Film-Grab, ShotDeck, Frame Set | links in `links.md` | named by 11 and 10 independent authors on X. In ShotDeck, [`逆光` and `ローキー` work](https://x.com/ksd_illust/status/2099998194906087701) | person only |

Illustrators explain why dated sources matter. Lighting artist [yutorikoubo](https://x.com/yutorikoubo/status/2051506121362534756) says that since AI images appeared you cannot tell whether an image is safe to study light from. [Mo1H recommends film](https://x.com/Mo1HNumjeU45057/status/2051562785348501689) because its colour and light have a known origin (9,852 bookmarks).

**For generation** the reference must prove a sentence, your right to use the image, and that the model obeys. **For code** it must prove numbers: HDRI choice, key angle, shadow softness, gradient values. The full file has HDRI measurements, verification by round trip and three.js notes: [`references/light.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/light.md).

## Framing

Shot size and angle can be filtered and read fairly well. Lens is the weak point (37.7% mean in ShotBench), so look it up on [ShotOnWhat](https://shotonwhat.com/sicario-2015) or state only a class: "wide, close to the subject". The mm on your board is a decision, not a reading.

Read framing as measurements: subject height as a share of the frame for shot size, head to frame edge for headroom, which side has the empty space, horizon height for camera height. For vertical video reach for hanging scrolls, and for framing grammar without light in the way try storyboards (Internet Archive `title:storyboard AND mediatype:texts` returned 161). Text embeddings are weak on pose and viewpoint, so prefer filters and "more like this" to sentences. Tod Campbell: ["We would try to build our story within our composition"](https://www.motionpictures.org/2017/04/mr-robots-cinematographer-season-threes-wild-ride/). Vertical drama has its own craft: Hao (Hunter) Deng uses ["centered compositions to highlight a character's loneliness or sense of pressure"](https://flanellemag.com/?p=104790). [`references/framing.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/framing.md)

## Texture

A texture reference proves that one named process leaves these marks at pixel level. **Name the stock, not the flaw.** On Openverse, `halation` returned 3 unrelated hits, while `kodachrome` returned 240+. On Flickr, `unretouched,portrait` led with a photo tagged `aigenerated`, while `portra160,portrait` led with a large-format portrait (both tested).

| Claim | Passes at 100% crop | Fails |
|----|----|----|
| Film grain | clumps vary with brightness, weakest in clipped highlights and deep blacks | same strength everywhere, a visible tile |
| Halation | red or orange fringe only where a very bright source meets dark | white glow on every edge |
| VHS | damage at the bottom lines, colour smear wider than luma detail | scanlines with sharp luma underneath |
| Skin | pores vary by zone, fine hair, broken highlights on nose and forehead | even pores or none |

Best routes: Flickr's public feed by stock tag, Internet Archive (`collection:vhsvault` 126,295), Library of Congress FSA colour masters, [A/V Artifact Atlas](https://www.avartifactatlas.com/artifacts/head_switching_noise.html) for VHS words, [Poly Haven](https://api.polyhaven.com/categories/textures) and [ambientCG](https://ambientcg.com/api/v2/full_json?type=Material&q=paper&limit=10&include=downloadData,tagData) for CC0 materials. Open libraries hold nothing usable for skin. [`references/texture.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/texture.md)

## Palette

A palette is real if you can name the frame it came from. Code extracts the hex, never an LLM, and weights matter as much as colours.

```bash
magick frame.jpg -resize 400x400 -colorspace LAB -colors 6 -colorspace sRGB -format "%c" histogram:info: | sort -rn
```

Run on a real [FSA/OWI photograph](https://www.loc.gov/pictures/item/2017878934/?fo=json), that gives:

- `#1F1E13` 56.5%
- `#DBDABD` 12.7%
- `#5C442D` 11.5%
- `#BA9666` 9.0%
- `#9C6743` 7.4%
- `#78866A` 2.8%

**For code**, use the exact hex, because the renderer obeys it. **For generation**, attach a frame you may feed, or describe the grade in words: in our 48-still test the hex line was obeyed best (89%), yet frames looked less like film with it, a small result that is only suggestive. Skip Color Hunt, Coolors and other trend generators as evidence, since nothing ties them to a frame. Good real sources: [Meditations in Color](https://meditationsincolor.com/directors/wes-anderson/) (hex read from real posters, by director), [Wada's 1933 combinations as JSON](https://raw.githubusercontent.com/mattdesl/dictionary-of-colour-combinations/master/colors.json), [Wellcome](https://api.wellcomecollection.org/catalogue/v2/images?query=poster&locations.license=cc0,pdm&color=d7372c&pageSize=3) (real images by hex). [`references/palette.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/palette.md)

## Type and graphics

A type reference proves a real designer made a real thing with this typeface for this audience and year. A pretty specimen proves nothing about use. Judge results with five questions: is the typeface named and credited, is there a year, is it a photo or scan of a real object, does it match the format (a poster does not prove a lower third), and is there hierarchy?

**Genre names beat mood words.** In the Google Fonts tag file, `/Expressive/Vintage` gives costume fonts, while `/Theme/Woodtype` gives Rye and Sancreek, and `/Slab/Clarendon` gives Besley.

| Source | Route | Tested |
|----|----|----|
| [Fonts In Use](https://fontsinuse.com/in/2/formats/15/film-video) | numbered paths such as `/in/2/formats/15/film-video`, `/tags/242/science-fiction`. Never `/search`: it is for a person | 1,192 film and video uses |
| [Art of the Title](https://www.artofthetitle.com/style/1970s/) | `/style/{slug}/`, `/designer/{slug}/` | `live-action` 553, `1970s` 92, `stop-motion` 43 |
| [Poster House](https://collection.posterhouse.org/wp-json/wp/v2/poster?keyword=12674&decade=17431&per_page=3&_fields=title,link) | REST with keyword and decade | 343 film posters from the 1970s |
| [Internet Archive](https://archive.org/advancedsearch.php?q=identifier%3ALFAID%2A&fl%5B%5D=identifier&fl%5B%5D=title&rows=60&output=json) | `identifier:LFAID*` | 54 Letterform Archive manuals (Mobil, Air Canada, IBM) |
| [Typeset In The Future](https://typesetinthefuture.com/2016/06/19/bladerunner/) | film by film | best for science fiction |
| [Google Fonts tags](https://raw.githubusercontent.com/google/fonts/main/tags/all/families.csv), [Fontsource](https://api.fontsource.org/v1/fonts) | fonts you may load in code | 2,103 families, 2,059 under OFL-1.1 |

**In generation**, borrow layout and hierarchy and set the words in code, because models still misspell. [`references/type-graphics.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/type-graphics.md)

## Motion design

**A search query and a motion spec are different things.** `kinetic type, hard cut on the beat, 2-frame holds, overshoot 1.2` is a good spec and a bad query: on Refs no film matched every word (tested). So use a format noun plus filters, pick by eye, measure the clip, and write the spec from the numbers.

```text
{"query":"kinetic type","category":"motion","ai_made":false,"limit":8}    -> Refs: 64 results; ai_made:true: 15
```

| Job | Tool | Result (tested on clips with known motion and on one CC BY film) |
|----|----|----|
| Cuts | `motion_read.py cuts` (PySceneDetect `detect-adaptive`) | 93 cuts, against 37 for ffmpeg `scene>0.3`; 12 of 12 sampled extra cuts were real |
| Holds | `motion_read.py holds` | twos and threes recovered. Grain hides them unless you denoise |
| Pan and tilt | `motion_read.py camera` | right ease where optical flow failed |
| Elements on flat ground | `motion_read.py elements` | overshoot 9.7% against a true 10%; stagger exactly 3 frames |
| Beat grid | `librosa`, compared with chance | one film thought to cut on the beat: 16.1% within ±1 frame, chance 14.4% |

Then translate. Models need one move, one action and a duration. Code needs frame counts and curves.

| From the reference | Generation prompt | GSAP |
|----|----|----|
| 17 frames, 10% overshoot | "The card snaps in, slides a little past its mark, and settles back." | `{duration:17/24, ease:"back.out(1.7)"}` |
| 3-frame stagger | "The five words land one after another, in quick succession." | `stagger:3/24` |

Refs has the only working AI filter we found, with two catches. `ai_made:false` also removes code-made films, and `ai_made:true` mixes them with generated ones, so for a coded piece use `made_with` (`hyperframes` 3, `remotion` 4 when we ran it). Its cards give a summary and a thumbnail, with no clip, and in our run all 89 were locked, so you still have to find the film and watch it. For an ad, open clips rarely match, so expect to supply the clip yourself.

Other sources that read: [Sakugabooru](https://www.sakugabooru.com/help/api) (`smears` 62,126, metadata for study), [Motionographer breakdowns](https://motionographer.com/tag/project_breakdown/), [LottieFiles featured](https://graphql.lottiefiles.com/2022-08) (real bezier handles), [Codrops on GitHub](https://github.com/codrops). For a person: Instagram Reels, Meta Ad Library, TikTok Creative Center, Vimeo Staff Picks, Dribbble, CodePen, Shadertoy, Video Static. [`references/motion.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/motion.md)

## People: who the person really is

The reference is not for the pose, the location, the expression or the clothes. It is for who this person is. Casting people talk about that plainly:

> "the stories behind the faces" [Jennifer Venditti](https://www.dazeddigital.com/film-tv/article/47745/1/how-to-spot-a-movie-star-uncut-gems-euphoria-casting-director-jennifer-venditti)

> "people who wore the city on their skin" [Eleonore Hendricks](https://www.moviemaker.com/eleonore-hendricks-on-how-to-street-cast-your-film-street-casting/)

> "A lot of the time it's the way someone carries themselves" [Sarah Small](https://1granary.com/fashion-image/how-does-street-casting-work-good-catch-director-sarah-small-shares-her-process)

**We found nobody on X framing it this way.** The most-saved advice is the opposite: a character sheet cloned from a found photo, keeping "100% of face, hair, body, clothing" ([4,033 bookmarks](https://x.com/simonecanciello/status/2116268465463976312)). That copies a stranger's likeness, so it goes on the never list.

![Walker Evans, New Orleans garage mechanic, Louisiana, 1936](https://varg.ai/how-to/guide-pages/find-references-for-an-ai-video/img/inline-7ad17cb87d.jpg)

Search the cataloguer's job word: `mechanic` in FSA returned 211. [New Orleans garage mechanic](https://www.loc.gov/item/2017762251/), Walker Evans, 1936. Library of Congress. **A words reference: public domain does not clear likeness.**

**Write an identity card, in words** (our proposal)

| Field | Example: fisherman, 62 |
|----|----|
| Bones | long narrow head, heavy brow, nose broken once, big ears, wiry frame |
| History on the body | sun-cured neck, gold molar, missing fingertip |
| Work marks | rope scars on palms, deep squint lines, rolling walk |
| Carriage | stands still, feet wide, does not fill silence |
| One line of biography | "Cooperative boat captain, Cambados, 44 years at sea, sons left for Vigo" |
| Never | no model bone symmetry, no veneers, not "weathered" as a costume |

**Five tests keep it honest.** *Strip:* describe a candidate in ten phrases and delete pose, place, expression and clothes. If fewer than four remain, it is a wardrobe or mood reference. *Swap:* would you know this person in a different coat, place and mood? *Format:* for the portraits, prefer direct to camera, mouth at rest, plain background. Pictures of people at work are there for work marks and carriage, so they are exempt. *Three people:* a trait taken from real people enters the card only if three or more of them show it, which builds a type and protects against reproducing a real face. A trait you invent for a fictional person is fine, marked as invented. *Caption:* keep references with a job-and-place caption, because who they are comes from the record.

**Search with the job word plus a place or decade, and delete adjectives.** Openverse `old fisherman face weathered` returned 0, and LoC `fisherman` returned 243. "Tuesday-night mechanic" becomes `garage mechanic`, `repairman`. The exact phrase `"occupational portrait"` at LoC returned 33.

**The safe workflow.** References become words. Words generate a fictional person. You check by eye that it resembles nobody real, and only then lock it on a neutral sheet as the reference you feed. For one still used once, skip the sheet. Never upload a stranger's photo, name a real person in a prompt or use a real minor. An LLM never infers character, class or trust from a face. New York's [synthetic performer disclosure](https://www.manatt.com/insights/newsletters/client-alert/new-york-synthetic-performer-law-what-advertisers-need-to-know) has been in effect since June 9, 2026, and can apply to a fully fictional face in an ad. This is research, not legal advice. [`references/people.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/people.md)

Non-human characters use the same card with different fields: silhouette at thumbnail size, shape language, material and wear, scale next to a human, signature movement. [`references/characters.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/characters.md)

## Location

Name the feeling, convert it to building type, decade and region, find it in an archive, then go to ground level. "Late-night, forgotten, fluorescent" becomes `diner` + `1970s` + `New Jersey`.

- [Wikimedia Commons categories](https://commons.wikimedia.org/w/api.php?action=query&list=search&srsearch=gas+stations+1970s&srnamespace=14&srlimit=6&format=json): the pattern "Gas stations in the United States photographed in the 1970s" does this almost directly. Walk them with `search.py commons-cat`. This was the best route in our real run. Read the author field of good hits, because institutions upload whole collections.
- [Library of Congress HABS](https://www.loc.gov/collections/historic-american-buildings-landscapes-and-engineering-records/?q=gas+station&fo=json&c=5): `gas station` 150, `garage` 1,223, with exact addresses.
- [TheFilmMap MCP](https://thefilmmap.com/mcp): no key, and it warns that "Which scene was shot where is not recorded and must not be inferred."
- [Prelinger](https://archive.org/advancedsearch.php?q=collection%3Aprelinger+AND+%28diner+OR+%22lunch+counter%22%29&fl%5B%5D=identifier&fl%5B%5D=title&fl%5B%5D=year&rows=6&output=json) for period motion, [Socks Studio](https://socks-studio.com/wp-json/wp/v2/posts?search=house&per_page=3&_fields=title,link) and [Hidden Architecture](https://hiddenarchitecture.net/wp-json/wp/v2/posts?search=concrete&per_page=3&_fields=title,link) for unusual buildings, and Street View for a person's eyes only.

Check provenance first: people spot AI [worst on landscapes](https://arxiv.org/abs/2507.18640). [`references/location.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/location.md)

## Style: Pinterest, Are.na and other boards

Boards answer how it should feel. Archives answer who and where. So start boards from a feeling word, and start archives from a job or place word.

| Board | Your agent | AI content | Use it for |
|----|----|----|----|
| [Are.na](https://www.are.na) | channel search and connections, with limits | no filter, and most blocks have no source | taste, the one board an agent can read |
| [Pinterest](https://www.pinterest.com) | **person only**: its [guidelines](https://policy.pinterest.com/en/developer-guidelines) ban scraping | [labels and a tuner](https://help.pinterest.com/en/article/gen-ai-labels) reduce it | you browse; the agent writes the links |
| [Cosmos](https://help.cosmos.so/en/articles/11717948-content-filtering) | no API found | the best filter: Show, Blur or Hide | you, with AI hidden |
| [Same Energy](https://same.energy/about) | no API | no filter stated | your visual walk from one image |
| [Savee](https://savee.com/mcp) | paid MCP, not tested | not checked | if you pay |
| [Aesthetics Wiki](https://aesthetics.fandom.com/api.php?action=query&list=search&srsearch=liminal&srlimit=5&format=json), [CARI](https://cari.institute/aesthetics) | wiki API; CARI needs JavaScript | community-written | naming a style, not evidence |

**The connection walk is the strongest move.** One good block leads to the channels of everyone else who saved it. Search Are.na with one or two words, sort by followers, read 12 blocks of the top channel, pick the 2 or 3 closest, fetch each block's channels, and rank channels by how many of your blocks they share. Stop at two hops and stay under 30 reads a minute. Tested: block 12977078 sits in 44 channels, including "PEOPLE & POSES" (1,391 blocks, 615 followers). [`references/style-boards.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/style-boards.md)

## Music

An agent cannot hear. What it finds is on target by metadata and curator fit only, and you choose. Supervisors start from story, so write a cue brief before any search: scene and beat, job of the music (motor, emphasis, clarification, irony, none), whose music it is, where it enters and leaves, tempo range, 3 to 5 instruments, era, lyric or not, reference with the three attributes borrowed, what it must not be. Thomas Golubić: ["Not using music is as powerful as using music"](https://www.awardsdaily.com/2019/08/28/better-call-saul-music-supervisor-thomas-golubic-on-storytelling-with-songs).

| Source | Exact call | Came back (tested) |
|----|----|----|
| ListenBrainz | `api.listenbrainz.org/1/lb-radio/tags?tag=library%20music&...` | Alan Hawkshaw, Roger Roger |
| MusicBrainz | `tag:"library music" AND firstreleasedate:[1970 TO 1979]` | 7, on target. `tag:"felt piano"` 0 |
| Discogs API | `style=Berlin-School&type=master&year=1976` | Tangerine Dream, Klaus Schulze |
| NTS | `nts.live/api/v2/search?q=library%20music` then the tracklist (undocumented) | curated tracklists |
| Are.na | channel search `library music` | "LIBRARY SOUNDS" 147 blocks |
| [Bandcamp Daily](https://daily.bandcamp.com/lists/library-music-album-guide) | articles | expert lists |
| Openverse audio | `room tone`, licence filter | CC0 room tones |

**For a person, as links:** Rate Your Music, Every Noise (frozen since 2023), Bandcamp tag pages (the [best human source for non-AI music](https://djmag.com/news/bandcamp-bans-ai-generated-music), with AI banned since January 2026), Music-Map, Gnoosic, Tunefind, WhatSong, WhoSampled, Radiooooo, Cosine.club.

**Traps.** Discogs returns an empty 200 for a style that does not exist, such as `Library Music`, so treat a silent zero as a vocabulary failure. CC BY-ND music cannot go under video, because [syncing counts as an adaptation](https://creativecommons.org/licenses/by-nd/4.0/legalcode.en). Deezer and Last.fm APIs are non-commercial only. Never download store previews: Apple says they [must be streamed only](https://performance-partners.apple.com/search-api).

**Borrow** tempo, meter, instruments, recording era, arrangement, dynamics. **Never borrow** melody, hook, lyrics, a recognisable voice or an artist's name: [Midler v. Ford](https://static.case.law/f2d/849/cases/0460-01.json), and [ElevenLabs bans real names by contract](https://elevenlabs.io/music-terms). So `epic` becomes "sparse felt piano, tape hiss, 62 BPM, no percussion until 0:18, 1970s Italian library music". Reports of tempo are a range with its half and double: two tools disagreed on one file (172.3 and 165.2). [`references/music.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/music.md)

## Never references: what must not appear

Build the never board from the default, not from opinion. Run the laziest version of the brief and ban what comes out. Write each entry as a test a stranger can apply to any frame in five seconds, with a positive wording for the prompt.

| Bad | Good entry |
|----|----|
| "no AI look" | **Reject if** at 100% crop the skin shows one even sheen and no pores. **Prompt as:** "visible pores, uneven tone, matte T-zone, fine flyaway hairs" |
| "no bad text" | **Reject if** OCR of any frame differs from the script by one character |
| "not cinematic" | **Reject if** the backlit haze and rim light have no source in frame. **Prompt as:** "single tungsten lamp frame left, daylight from the window, shadows fall right" |
| "no floaty camera" | **Reject if** camera speed stays constant from first frame to last with no start, stop or reason. A taste rule |
| "don't look like a template" | **Reject if** the same entrance animation plays on more than one section |

**Say it positively in the prompt.** Across 11 text-to-image models, [41.5% of failed negated statements rendered exactly what the prompt forbade](https://arxiv.org/abs/2610.03084). [Veo](https://docs.cloud.google.com/vertex-ai/generative-ai/docs/video/video-gen-prompt-guide) and [Runway](https://help.runwayml.com/hc/en-us/articles/35694045317139-Gen-4-Image-Prompting-Guide) warn against negatives, and [Kling](https://kling.ai/quickstart/kling-4-model-user-guide) says only "no subtitles and no background music" are truly necessary.

**Tells expire, so date yours.** Six fingers and garbled text are stale on leading models. Purple gradients gave way to [cream near \#F4F1EA with a terracotta accent](https://raw.githubusercontent.com/anthropics/skills/main/skills/frontend-design/SKILL.md) within about a year. What still holds: functional and physics errors ([Kamali et al.](https://arxiv.org/html/2502.11989)), impossible performance in music ([MUSEBENCH](https://arxiv.org/html/2610.20310)), and cloned voices drifting [warm, with less variation](https://arxiv.org/abs/2605.16578). Do not stop at bans: "every published 'use this instead' list has become the next wave of tells within months" ([taste-skill](https://github.com/Leonxlnx/taste-skill/blob/main/skills/taste-skill/references/tells.md)).

### Keep AI out of the search

Eyes and detectors both fail: people scored [76% on AI images from 2024 models](https://arxiv.org/html/2502.11989) and [52.6% on 5-second fakes from 2026 models](https://arxiv.org/abs/2609.07369), and curated images, the ones a reference search finds, are the hardest. So **check provenance before pixels**, and sort sources by when the collection closed.

| Label | Means |
|----|----|
| HUMAN-PROVEN | a film title or a holding museum or archive, or a named author, a date before 2022 and a body of work |
| LIKELY HUMAN | a named author or a date, nothing against. Fine for measuring light and framing |
| UNKNOWN | mood only: no measurements, no feeding |
| AI | a marker, or the maker says so. Never board only |

"No AI marker" and "the detector says human" are never a pass. A byte scan is one-way: 15 of 15 of our generated stills carried `trainedAlgorithmicMedia`, and all five re-encode methods we tried erased it. So a hit rejects, and a miss means nothing (`scripts/ai_marker.py`). Filters help and their makers say they do not finish the job: DuckDuckGo's list is ["not exhaustive"](https://duckduckgo.com/duckduckgo-help-pages/results/how-to-filter-out-ai-images-in-duckduckgo-search-results), Kagi says there is ["no reliable way"](https://help.kagi.com/kagi/features/exclude-ai-images.html). Date control that worked for agents: Commons with `-deepcat:"AI-generated images"`, Internet Archive `addeddate:[* TO 2022-11-30]`, LoC `dates=1900/1970`.

**Human references can make slop too**, when everyone uses them, when only the surface is copied, or when the model's defaults pull them back. If a name has its own prompt pack, go to what its makers looked at. Change the brief and see if your board stays the same: if it does, the board is a default. [`references/never.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/never.md)

## LLM as a judge: rank references without bias

Use a judge to get from 30 candidates to the 3 you look at. It is a filter, and the taste stays with you. You need it mostly for generated pieces, where light candidates pile up. A coded piece gets most of its answers from records and code. **Ask about fit to the brief, never about beauty.**

The only direct test we found of machine judges against designers on images is [Design Crit / TASTE](https://arxiv.org/html/2605.20731): 10 designers, 14,400 ratings. Agreement with the panel majority, where chance is 0.50: best off-the-shelf judge 0.543, prompted vision models 0.509 to 0.539, a small head trained on the labels 0.611, the human ceiling 0.741. A bigger model did not help. Labels from the person whose taste counts did. Designers themselves agree more on fidelity than on beauty: "text as described" tau 0.224, colour harmony 0.103. So clear criteria are the fix you suspected, as long as each one is a yes/no about something visible.

### We tested it: a naive judge against a checklist judge

Two model families at low effort (`claude-sonnet-5-5`, `gpt-6.1-sol`), 876 reads, real images from the Met, Commons and the Library of Congress, one want card: hard light from camera-left. The checklist prompts were tuned once on these same images. **This measures bias and stability, not accuracy:** no person labelled these images, so nothing here says either judge picks the right light. Samples are small.

| Test | Naive: "score 1 to 10", "which is better?" | Checklist judge | Reading |
|----|----|----|----|
| The same image twice | picked the first image **10 of 10** | no difference **10 of 10** | A forced choice lets position decide. Always allow a tie |
| Polished copy against the original | polished won **38 of 40** | polished 0, original 0, no difference 40 of 40 | We told it not to compare contrast, so polish buys no win. It cannot show there is no lean |
| Left-lit frame against another, both orders | not run | left-lit 14 of 16, other 0, no difference 2 | Against one person's quick sort. It has not become a judge that always abstains |
| Unreadable images, black or 64 px | one family scored a thumbnail up to 7 | cannot tell **48 of 48** | Abstaining works |
| Read 3 times, reshuffled | noise 0.19 and 0.12 of the spread between images | noise 0.20 and 0.16; pass to fail 0 of 96 | No difference shown. Our first wording was noisier: 0.40 and 0.27 |
| Near-equal pairs, both orders | opposite image in 4 of 20 pairs | opposite image in 1 of 20, any change in 5 of 20 | Not supported either way. Order still matters on a close pair |
| Labels: "Oscar-winning film", "AI-generated" (first round) | largest shift -0.42 of 10, within read noise | at most one pass moved on 12 images | Labels moved neither here. 12 images can hide a moderate effect, and published work finds one, so keep stripping them |
| AI against human (first round) | AI won 0 of 40 | AI 2, real 26, no difference 12 | **Cannot say:** our AI images matched the card less well |

- **Raw scores do not travel.** One rail yard scored \[1, 1, 1\] on one family and \[8, 8, 8\] on the other, each perfectly stable. The two families agreed on 41 to 44 of 48 checklist answers. Compare verdicts, never scores.
- **Wording is the bias you control.** Our first rule treated "no edge exists" and "I cannot see an edge" alike. Splitting them halved "cannot tell" (121 to 61 of 288) and cut repeat flips from 26 to 14 of 96. A field named `mirror_ok: false` was read as "no mirror allowed" in 4 of 8 reads of one pair.

Stable is not correct either: one family passed "key from the left" on a sunlit wall 3 of 3 times, with the light on the other side as far as one person could tell.

**The biggest bias we found was our own.** In a real run (see "One real run, start to finish" above) the agent invented a light direction to fill in its want card, and the room closest to the brief lost 6 of 6 pairs. With that value removed it won 8 of 8 in each family. Rewording the questions for rooms made no measurable difference. So only freeze what the person said or the brief implies. Checklist and pairs can also disagree: the same room came fourth of 5 on the checklist and first in pairs, and you see both.

Still unknown: whether this judge agrees with a person, a second want card, and images it was not tuned on.

### What people on X get right and wrong

On X, bookmarks on this topic track how copyable a post is. A post advising ["scored 1-10 by an llm judge. under 8 goes back"](https://x.com/gregisenberg/status/2117734977312047537) has 3,725 bookmarks, while posts with measured numbers on bias have 2 to 114. Persona councils inside one model spread widely, though [Karpathy's original](https://x.com/karpathy/status/1992381094667411768) used anonymised ranking across models.

The method worth copying comes from [Hamel Husain](https://x.com/HamelHusain/status/1851645894887940323) and [Shreya Shankar](https://x.com/sh_reya/status/2081444175061598455): one domain expert, pass or fail with written critiques, tested as a classifier on held-out labels, because an "LLM judge is a complement to human experts, not a replacement". [Andrew Ng](https://x.com/AndrewYNg/status/2057146565500998024) adds yes/no questions for video, such as "does the camera motion match?". [Anthropic's harness post](https://www.anthropic.com/engineering/harness-design-long-running-apps) warns that criteria wording steers output: "the best designs are museum quality" pushed designs towards one look.

Measured numbers to know: [Lech Mazur](https://x.com/LechMazur/status/2046661738339430489) found the median model flips in 45% of decisive pairs on near-equal stories, with the first-shown picked 63% of the time. [Sword](https://x.com/SwordHQ/status/2102792080808354251) saw a judge pass 38% of its own failed tests against 1.9% of others'. [Noy Sternlicht](https://x.com/NoySternlicht/status/2108185359016243319): one line of context flips over half of verdicts. [Ian Arawjo](https://x.com/IanArawjo/status/2079302428558524690): a kappa of 0.85 does not mean trust the scores. The contrarian case is worth keeping: ["experts disagree a lot"](https://x.com/NoySternlicht/status/2108454161050382839), and ["I stopped letting a judge settle disagreements and only let it flag"](https://x.com/k0nOO/status/2108253210561368257).

### Measured biases and what fixes them

| Bias | Evidence | Fix |
|----|----|----|
| Order | Rubric order alone flips the top pick on [15% to 41% of prompts](https://arxiv.org/abs/2602.02219) | Shuffle per read, 3 to 5 reads, pairs in both orders. Send unstable items to a person: [κ 0.52 to 0.56 at 39% lower cost](https://arxiv.org/html/2305.17926) |
| Labels | A name on an image cost accuracy, and ["rely only on the image" helped marginally](https://arxiv.org/html/2505.23941v4) | Remove labels at input. Do not ask the judge to ignore them |
| Self-preference | [More than 50% more likely](https://arxiv.org/abs/2604.06996) to pass its own failed items | Separate maker and judge. Use another family |
| Numeric scales | Binary questions raised agreement, [α 0.09 to 0.48](https://arxiv.org/html/2403.18771v3) (text) | Yes/no for fit, pairs among those who pass |
| Reasoning | On art, plain chain of thought hurt 16 to 18%, [structured prompts helped about 44%](https://arxiv.org/html/2501.09012) | Evidence with a location, then a verdict |
| Never abstaining | Wrong on [over 80% of unanswerable items](https://arxiv.org/html/2604.14799v1) under standard prompts | A strong abstain clause, and abstain in code |
| Faces | Models [overrate attractiveness](https://www.psypost.org/chatgpt-claude-grok-and-gemini-overrate-facial-attractiveness-compared-to-human-judges/), and give [fewer competency words to old and obese subjects](https://arxiv.org/html/2405.20152) | Never ask. Who a person is comes from a record and a person |

### The protocol: six stages, with code before the LLM

1.  **Write a want card before you see candidates, and freeze it.** Values only, no praise words: `job: light | direction: camera-left | hardness: hard | source: window or practical lamp`
2.  **Gates, with no LLM verdict:** opened, provenance from a record, source allowed, rights, identity safety, not a duplicate.
3.  **Code measures** what it can: brightness per side, contrast, clipping, palette, cuts, tempo. Do not show these numbers to the judge, because they become an anchor.
4.  **Blind the packet:** same size, no metadata, random ids, no title, maker, date, query or rank. `python3 scripts/judge.py blind refs/light/ blinded/light/`
5.  **Checklist reads.** One image per read in a fresh context, order reshuffled, 3 reads per family, two or more families. Location and evidence come before the verdict, and cannot tell is allowed and enforced in code. No score out of ten.
6.  **Pairs on the best 10, both orders,** a win counts only if it holds both ways, a tie is allowed, and one identical pair goes in per 20 as a check. Then **three go to you, shuffled, with no scores.** It reports "these three pass the checks", never "the best".

In a simulation with an assumed noise model, not a measurement, this funnel (150 to 240 calls for 20 to 50 candidates) put the true best first only about 59 to 74% of the time. So top-1 is never safe, and that is why you get three.

### Clear criteria: every question is yes or no, about something visible

Each criterion has an owner: code, a record, the LLM or you. Here is Light, the only job we ran. Split "it does not exist" (fail) from "I cannot see it" (cannot tell), and move anything that rewards contrast or polish to code. The other nine jobs are in [`references/judge.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/judge.md), as a draft to test.

| ID | Owner | Question | Pass / fail | Cannot tell when |
|----|----|----|----|----|
| L1, core | LLM | Is there a visible source, or a cast shadow that shows where the main light comes from? | window at frame left / flat even light | crop hides all shadow areas |
| L2, core | LLM | Does the key come from the side on the want card? | lit cheek frame-left / other side, frontal, or no single direction | too small or too dark to read |
| L3 | LLM | Name one shadow edge. Is it crisp or gradual, as asked? | crisp along nose or wall / gradient, or no edge because the light is flat | motion blur, compression, too dark |
| L4 | Code | Are p5, p95 and clipping inside the want range? | p5 ≤ 0.03 / p5 = 0.15 for near black | under 512 px |
| L5 | LLM | Could something in this scene produce this light, and do shadows agree? | street lamp visible / rim from nowhere | tight close-up |
| L6, core | You | Is this the light I meant? | yes / no | never |

L5 is not an AI detector: it failed 2 of 60 reads on AI images and 0 of 72 on real ones, too few to mean anything. Keep the provenance gate. The judge never asks about lens, film stock, ratio, exact hex, beauty, or a person's character, class or looks.

### Calibrate it on yourself, and test it

**Thirty minutes:** label 48 images blind, made of 30 candidates, 10 planted controls and 8 hidden repeats. Run `python3 scripts/judge.py agree labels.json enforced.jsonl`, read up to 10 disagreements, and rewrite what is vague. Keep a criterion if your own repeats agree 7 of 8, TPR and TNR are both at least 0.80, and κ is at least 0.60 (our bars). This can reject a bad judge and cannot certify a good one. Real validation takes [about 100 labels per criterion](https://hamel.dev/blog/posts/llm-judge/). If two people disagree on a criterion, it is a taste question, not a checklist item.

**Then run the bias tests on your own images:** shuffle, label swap, AI against human, polish, duplicate, plants, and a demographic swap before you use a judge on people. Setups and bars are in [`references/judge.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/judge.md), and the exact prompts we ran are there too.

**Never leave these to an LLM:** final taste; who someone is from their face; identifying real people, likeness and consent; rights; whether something is AI, as a verdict; lens, camera movement and exact light values, until your own labels say otherwise; the feel of motion and music; cultural meaning; grading its own family's output.

## Who may read what

The source's permission sets the route. A 403 means blocked for this agent, not down for people, and nobody should retry past it. [`references/sources.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/sources.md) has every source and each unstable endpoint.

| Tier | Sources |
|----|----|
| **Agent, no key** (`scripts/search.py` reaches 22) | Met, Rijksmuseum, Art Institute of Chicago, Library of Congress, Commons, Internet Archive, Poly Haven, Lantern, Flickr's public feed, ambientCG, Wellcome, Fonts In Use numbered paths, Art of the Title, Poster House, Google Fonts, Refs search, Sakugabooru metadata, Motionographer, MusicBrainz, ListenBrainz, Discogs API, NTS |
| **Agent, unstable** | Are.na, Openverse: keep a fallback |
| **Your account** | FrameThrower, Are.na v3, Flickr API, Mapillary, Unsplash, Pexels, YouTube Data API, Freesound, Epidemic Sound MCP, Savee, Refs Pro, Mobbin, Refero |
| **Person only: links** | Pinterest, Instagram and Reels, Film-Grab, ShotDeck, Shot Cafe, Eyecannndy, Frame Set, Flim, Google Images, Yandex, TinEye, Cosmos, Same Energy, Vimeo Staff Picks, filmdev.org, Camera-wiki, Lomography, ArtStation, Dribbble, CodePen, Shadertoy, Video Static, Ads of the World, Meta Ad Library, TikTok Creative Center, Rate Your Music, Every Noise, Bandcamp pages, Tunefind, WhatSong, WhoSampled |
| **Dead or skip** | Maroofy (HTTP 402), Kive (now generates images), appmotion.design (404) |

## Who to learn from

X works for AI filmmakers and lighting-minded illustrators, and works poorly for cinematographers, type designers and music supervisors. The most-saved honest film-and-light reference posts are by Japanese and Korean illustrators. A test that holds up: shipped work with specific failure reports.

| Job | Who | Start with |
|----|----|----|
| Light | Roger Deakins, Shane Hurlbut ASC, Wandering DP, David Hobby, James Gurney | [Jesse James x 3](https://www.rogerdeakins.com/jesse-james-x-3/), [RED interview](https://www.reddigitalcinema.com/stories/behind-the-look-with-shane-hurlbut), [Ratios 101](https://wanderingdp.com/cinematography/cinematography-school-lighting-ratios-101/), [Strobist](https://strobist.blogspot.com/2006/04/reverse-engineering-other-shooters.html) |
| Framing | Tod Campbell, Hao (Hunter) Deng, Gray Kotze | [The Credits](https://www.motionpictures.org/2017/04/mr-robots-cinematographer-season-threes-wild-ride/), [Flanelle](https://flanellemag.com/?p=104790), [In Depth Cine](https://www.indepthcine.com/videos/focal-length) |
| Motion | Miyazaki via Animation Obsessive, Emil Kowalski | [Running](https://animationobsessive.substack.com/p/hayao-miyazaki-on-running), [Great animations](https://emilkowal.ski/ui/great-animations) |
| People | Jennifer Venditti, Eleonore Hendricks, Sarah Small | [Dazed](https://www.dazeddigital.com/film-tv/article/47745/1/how-to-spot-a-movie-star-uncut-gems-euphoria-casting-director-jennifer-venditti), [MovieMaker](https://www.moviemaker.com/eleonore-hendricks-on-how-to-street-cast-your-film-street-casting/), [1 Granary](https://1granary.com/fashion-image/how-does-street-casting-work-good-catch-director-sarah-small-shares-her-process) |
| AI film | Henry Daubrez, Monique Pryce, Dave Clark, Paul Trillo, Kavan | [Junkyard King](https://x.com/henrydaubrez/status/2033932648905904508), [FAQ](https://x.com/second_bassoon/status/2117703324321694077), [breakdown](https://x.com/paultrillo/status/1782477068925796388) |
| Music | Thomas Golubić, Randall Poster | [AwardsDaily](https://www.awardsdaily.com/2019/08/28/better-call-saul-music-supervisor-thomas-golubic-on-storytelling-with-songs), [WIPO](https://www.wipo.int/en/web/wipo-magazine/articles/music-and-the-movies-an-interview-with-randall-poster-39133) |
| Slop | Negar Kamali and Matthew Groh, Hany Farid, Paul Bakaus | [guide](https://arxiv.org/abs/2406.08651), [Berkeley](https://www.ischool.berkeley.edu/news/2025/bbc-interviews-hany-farid-clues-give-away-ai-generated-footage), [Impeccable](https://impeccable.style/slop) |
| LLM judges | Hamel Husain, Shreya Shankar, Eugene Yan, Contra Labs | [guide](https://hamel.dev/blog/posts/llm-judge/), [paper](https://arxiv.org/abs/2404.12272), [review](https://eugeneyan.com/writing/llm-evaluators/), [TASTE](https://arxiv.org/html/2605.20731) |

No maintained awesome list exists for cinematography references, film stills, lighting, moodboards or sound effects, and no public skill or MCP server is built around light. [`references/experts.md`](https://github.com/vargHQ/skills/blob/main/find-references/references/experts.md)

## What nobody has tested yet

No published end-to-end test of any brief-to-reference method exists, and this method is no exception. Nothing here shows yet that a reference, a role line or a light sentence changes a final video, or that non-obvious references beat top-of-search ones. FrameThrower, Unsplash, Pexels, YouTube and Epidemic were not queried with an account, so their result quality is unknown, and FrameThrower's is the largest gap for light. No shortlisted track was heard. Chinese short-drama vocabulary needs a native reviewer. Legal notes are research, not advice.

The cheapest next test: repeat our 48-still study with this method against one-query search, with real film frames as controls and a person as the anchor.

Links and counts checked on 2026-11-03. Searches return different counts over time. Legal notes are research, not legal advice. Paintings and photographs shown here are public domain, held by The Metropolitan Museum of Art and the Library of Congress.

## Go deeper

- The skill: [find-references](https://github.com/vargHQ/skills/tree/main/find-references) (`npx skills add vargHQ/skills --skill find-references`)
- The designed version of this guide, with every picture and clip: https://varg.ai/how-to/find-references-for-an-ai-video
- Every claim of the ten steps traced to its source: [the evidence bank](https://varg.ai/how-to/guide-pages/evidence-bank/)

## All 10 steps

The route, with the one line that hands it to an agent: [How to make a video with an AI agent in ten steps](https://varg.ai/how-to/make-a-video-in-ten-steps.md)

1. How to find references for an AI video (this page)
2. [How to make a moodboard for an AI video](https://varg.ai/how-to/make-a-moodboard-for-an-ai-video.md)
3. [How to write a video script with an AI agent](https://varg.ai/how-to/write-a-video-script-with-an-agent.md)
4. [How to design sound and voice for an AI video](https://varg.ai/how-to/design-sound-and-voice-for-ai-video.md)
5. [How to design characters and props for AI video](https://varg.ai/how-to/design-characters-and-props-for-ai-video.md)
6. [How to previz a video in Three.js or Blender](https://varg.ai/how-to/previz-a-video-in-threejs-or-blender.md)
7. [How to animate a previz with AI video models](https://varg.ai/how-to/animate-a-previz-with-ai-video-models.md)
8. [How to edit a video with HyperFrames and AI agents](https://varg.ai/how-to/edit-a-video-with-hyperframes-and-agents.md)
9. [How to judge an AI video: measure, don't grade](https://varg.ai/how-to/judge-an-ai-video-without-bias.md)
10. [How to keep an AI video project in GitHub](https://varg.ai/how-to/keep-a-video-project-in-github.md)
