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. This is the first step. Next: How to make a moodboard for an AI video.

For your agent

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

npx skills add vargHQ/skills --skill find-references
/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

Why agents need this

Without a reference, an agent falls back to its default look: "centered text, gradient background, everything fading in". More adjectives do not fix that. Three facts shape everything below.

So each part does what it can do.

WhoOwns
Codefacts in pixels and timing: brightness, colour, cuts, tempo
Recordswho made it, when, and the rights
The LLMliteral yes/no checks and the shortlist
Youmeaning, 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.

/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.

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

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, Jet Lowe.

De Hooch, The Visit: one window at frame left lights a wall, the room falls dark

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, Pieter de Hooch, ca. 1657.

JobWhat came backWould you use it?
NeverFrom 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 tooYes. It describes Nespresso more than small roasteries, so the agent wrote Meta Ad Library links for a person
Light26 queries where we budgeted 6. Words like dawn matched captions and not light. One word pair changed everything: interior tileYes
LocationCommons category walk through Shop signs in Lisbon gave real lettering and tile, with author, date, camera and licence in one callPartly. 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"
TypeOne real Lisbon sign with a named typeface, through Fonts In UseYes, for hierarchy and ageing
MotionRefs cards were all locked, with no clip to measure. Open clips did not match an ad briefNo. A person has to watch and supply the clip
MusicA 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.

JobQueriesSources
Light63 sources
Framing42 to 3
People42 to 3
Location32
Motion32
Music32
Texture32
Type32
Never22, run first
Palette22, 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.

SlotWhat it isUse on
L, literalthe source's own facets and wordsevery source
C, captionone sentence describing the imagined framesemantic search only
N, nameda maker or work you will open and checkarchives
A, adjacentthe same job from painting, print, architecture, local wordsMet, Commons, Discogs, Are.na
X, excludedwhat must not appearkeyword 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).

JobSafe middleOne step furtherWhat came back (tested 2026-11-03)
Lightcinematic lightingMet candlelight, medium Paintings6 objects; of two opened, one exact, one with no candle
Lightdescription=candlelightRijksmuseum description=kaarslicht3 against 10
Framingvertical video compositionMet hanging scroll, medium Paintings906
Peopleold fisherman face weatheredLoC FSA fishermanOpenverse 0, LoC 243
Locationmoody liminal diner night cinematicCommons category Diners in the United Statescategory found
Texturevintage film lookFlickr tag superia40020
Motioncool animationRefs kinetic type, category motion, ai_made:false1,827 of CPU coolers and cars against 64 on target
Musicchill background musicDiscogs style Dub Techno, year 199647

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

Met, candlelight: right. One low candle, faces lit from below, the room falling to black. Holy Family with Saint Anne, early 17th century.

Saint Catherine of Alexandria: flat gold ground, no candle, no directional light

Same search: wrong. Flat gold ground, no candle, no direction to the light. Saint Catherine, 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. explained 77 to 89% of rating variance). The full table, marked measured, craft or hypothesis per cell, is in 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, 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 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)
LightHDRI choice, key angle, shadow softness, gradient and glow valuesreal-looking source: direction, hardness, colour
Framinggrid, margins, scale ratios, safe zonesshot size, lens, staging
Texturenoise, grain shader, PBR mapsmaterial words, or a neutral close-up
Paletteexact hex and contrastnamed colours and a chosen frame, loosely held
Typeexact licensed font, tracking, size in pxavoid in frame; overlay in code
Motionseconds per beat, ease curve, what moves first, staggercamera verb, subject action, cut rate
Rights questionshipped fonts, textures, code licencesevery fed image
OutputDESIGN.md and timing.md, every value labelled measured, record, by eye or assumedrole 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

Young Woman with a Water Pitcher, 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."
  2. Nose and chin. Start there: 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.

$ 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.

FeelingVisible words to searchNumbers for the board
Lonelyone distant source, a small pool, surroundings fall to dark, cold ambientkey to shadow 3+ stops
Tensesingle hard source, shadow edge across the eyes, top or side, unwell colour3 to 4+ stops, hard edge
Tenderlarge soft window from one side, shadow wraps, warm1 to 2 stops
Nostalgiclow sun through a curtain or haze, warm highlights, lifted blackslow contrast, sun under 10°
Luxurybig controlled soft sources, clean black, a defined edge linelow key but soft, background 3+ stops under
Documentary truthonly what the location has, uneven, mixed colour left uncorrectedunset, measure after

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

Where to search light, in order

SourceHowWhat came back (tested)Who
Deakins: Looking at Lighting and forumrogerdeakins.com/?s=window+light, read his replieshis plans, frames and words on one sceneagent; never feed the frames
FrameThrowerPOST /api/v1/search with lighting: sun, window, moonlight, practical, neon, fluorescent, firelight, candlelight, streetlamp, screen_glow, headlight, lightningnot tested, needs your account. The only library with a filter for what lights the frametoken
Poly Haven HDRIsfilter attributes on your sidenight + artificial + outdoor + high contrast 15agent, CC0; real light you can also use in code
Metq=Georges de La Tour&artistOrCulture=true&isPublicDomain=trueVermeer 6, Caravaggio 6, Rembrandt 43. Search by artist more than by light wordagent, feedable
Rijksmuseumdescription=kaarslicht&type=painting10; maanlicht 12; venster 55. Translate firstagent
Wikimedia Commonsincategory:"Rembrandt lighting", -deepcat:"AI-generated images"13. Plain chiaroscuro gave 19,808 with dahlias and cosplayagent
Library of Congress FSA/OWI colour?q=night&fo=json25; real practical light in colouragent
SunCalcgetPosition(date, lat, lng)sun height and direction for any place and timeagent
Film-Grab, ShotDeck, Frame Setlinks in links.mdnamed by 11 and 10 independent authors on X. In ShotDeck, 逆光 and ローキー workperson only

Illustrators explain why dated sources matter. Lighting artist yutorikoubo says that since AI images appeared you cannot tell whether an image is safe to study light from. Mo1H recommends film 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.

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 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". Vertical drama has its own craft: Hao (Hunter) Deng uses "centered compositions to highlight a character's loneliness or sense of pressure". 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).

ClaimPasses at 100% cropFails
Film grainclumps vary with brightness, weakest in clipped highlights and deep blackssame strength everywhere, a visible tile
Halationred or orange fringe only where a very bright source meets darkwhite glow on every edge
VHSdamage at the bottom lines, colour smear wider than luma detailscanlines with sharp luma underneath
Skinpores vary by zone, fine hair, broken highlights on nose and foreheadeven 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 for VHS words, Poly Haven and ambientCG for CC0 materials. Open libraries hold nothing usable for skin. 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.

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

Run on a real FSA/OWI photograph, that gives:

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 (hex read from real posters, by director), Wada's 1933 combinations as JSON, Wellcome (real images by hex). 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.

SourceRouteTested
Fonts In Usenumbered paths such as /in/2/formats/15/film-video, /tags/242/science-fiction. Never /search: it is for a person1,192 film and video uses
Art of the Title/style/{slug}/, /designer/{slug}/live-action 553, 1970s 92, stop-motion 43
Poster HouseREST with keyword and decade343 film posters from the 1970s
Internet Archiveidentifier:LFAID*54 Letterform Archive manuals (Mobil, Air Canada, IBM)
Typeset In The Futurefilm by filmbest for science fiction
Google Fonts tags, Fontsourcefonts you may load in code2,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

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.

{"query":"kinetic type","category":"motion","ai_made":false,"limit":8}    -> Refs: 64 results; ai_made:true: 15
JobToolResult (tested on clips with known motion and on one CC BY film)
Cutsmotion_read.py cuts (PySceneDetect detect-adaptive)93 cuts, against 37 for ffmpeg scene>0.3; 12 of 12 sampled extra cuts were real
Holdsmotion_read.py holdstwos and threes recovered. Grain hides them unless you denoise
Pan and tiltmotion_read.py cameraright ease where optical flow failed
Elements on flat groundmotion_read.py elementsovershoot 9.7% against a true 10%; stagger exactly 3 frames
Beat gridlibrosa, compared with chanceone 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 referenceGeneration promptGSAP
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 (smears 62,126, metadata for study), Motionographer breakdowns, LottieFiles featured (real bezier handles), Codrops on GitHub. For a person: Instagram Reels, Meta Ad Library, TikTok Creative Center, Vimeo Staff Picks, Dribbble, CodePen, Shadertoy, Video Static. 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

"people who wore the city on their skin" Eleonore Hendricks

"A lot of the time it's the way someone carries themselves" Sarah Small

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). That copies a stranger's likeness, so it goes on the never list.

Walker Evans, New Orleans garage mechanic, Louisiana, 1936

Search the cataloguer's job word: mechanic in FSA returned 211. New Orleans garage mechanic, Walker Evans, 1936. Library of Congress. A words reference: public domain does not clear likeness.

Write an identity card, in words (our proposal)

FieldExample: fisherman, 62
Boneslong narrow head, heavy brow, nose broken once, big ears, wiry frame
History on the bodysun-cured neck, gold molar, missing fingertip
Work marksrope scars on palms, deep squint lines, rolling walk
Carriagestands still, feet wide, does not fill silence
One line of biography"Cooperative boat captain, Cambados, 44 years at sea, sons left for Vigo"
Neverno 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 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

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

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.

Check provenance first: people spot AI worst on landscapes. 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.

BoardYour agentAI contentUse it for
Are.nachannel search and connections, with limitsno filter, and most blocks have no sourcetaste, the one board an agent can read
Pinterestperson only: its guidelines ban scrapinglabels and a tuner reduce ityou browse; the agent writes the links
Cosmosno API foundthe best filter: Show, Blur or Hideyou, with AI hidden
Same Energyno APIno filter statedyour visual walk from one image
Saveepaid MCP, not testednot checkedif you pay
Aesthetics Wiki, CARIwiki API; CARI needs JavaScriptcommunity-writtennaming 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

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".

SourceExact callCame back (tested)
ListenBrainzapi.listenbrainz.org/1/lb-radio/tags?tag=library%20music&...Alan Hawkshaw, Roger Roger
MusicBrainztag:"library music" AND firstreleasedate:[1970 TO 1979]7, on target. tag:"felt piano" 0
Discogs APIstyle=Berlin-School&type=master&year=1976Tangerine Dream, Klaus Schulze
NTSnts.live/api/v2/search?q=library%20music then the tracklist (undocumented)curated tracklists
Are.nachannel search library music"LIBRARY SOUNDS" 147 blocks
Bandcamp Dailyarticlesexpert lists
Openverse audioroom tone, licence filterCC0 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, 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. Deezer and Last.fm APIs are non-commercial only. Never download store previews: Apple says they must be streamed only.

Borrow tempo, meter, instruments, recording era, arrangement, dynamics. Never borrow melody, hook, lyrics, a recognisable voice or an artist's name: Midler v. Ford, and ElevenLabs bans real names by contract. 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

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.

BadGood 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. Veo and Runway warn against negatives, and Kling 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 within about a year. What still holds: functional and physics errors (Kamali et al.), impossible performance in music (MUSEBENCH), and cloned voices drifting warm, with less variation. Do not stop at bans: "every published 'use this instead' list has become the next wave of tells within months" (taste-skill).

Keep AI out of the search

Eyes and detectors both fail: people scored 76% on AI images from 2024 models and 52.6% on 5-second fakes from 2026 models, 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.

LabelMeans
HUMAN-PROVENa film title or a holding museum or archive, or a named author, a date before 2022 and a body of work
LIKELY HUMANa named author or a date, nothing against. Fine for measuring light and framing
UNKNOWNmood only: no measurements, no feeding
AIa 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", Kagi says there is "no reliable way". 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

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: 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.

TestNaive: "score 1 to 10", "which is better?"Checklist judgeReading
The same image twicepicked the first image 10 of 10no difference 10 of 10A forced choice lets position decide. Always allow a tie
Polished copy against the originalpolished won 38 of 40polished 0, original 0, no difference 40 of 40We told it not to compare contrast, so polish buys no win. It cannot show there is no lean
Left-lit frame against another, both ordersnot runleft-lit 14 of 16, other 0, no difference 2Against one person's quick sort. It has not become a judge that always abstains
Unreadable images, black or 64 pxone family scored a thumbnail up to 7cannot tell 48 of 48Abstaining works
Read 3 times, reshufflednoise 0.19 and 0.12 of the spread between imagesnoise 0.20 and 0.16; pass to fail 0 of 96No difference shown. Our first wording was noisier: 0.40 and 0.27
Near-equal pairs, both ordersopposite image in 4 of 20 pairsopposite image in 1 of 20, any change in 5 of 20Not 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 noiseat most one pass moved on 12 imagesLabels 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 40AI 2, real 26, no difference 12Cannot say: our AI images matched the card less well

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" 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 used anonymised ranking across models.

The method worth copying comes from Hamel Husain and Shreya Shankar: 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 adds yes/no questions for video, such as "does the camera motion match?". Anthropic's harness post warns that criteria wording steers output: "the best designs are museum quality" pushed designs towards one look.

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

Measured biases and what fixes them

BiasEvidenceFix
OrderRubric order alone flips the top pick on 15% to 41% of promptsShuffle 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
LabelsA name on an image cost accuracy, and "rely only on the image" helped marginallyRemove labels at input. Do not ask the judge to ignore them
Self-preferenceMore than 50% more likely to pass its own failed itemsSeparate maker and judge. Use another family
Numeric scalesBinary questions raised agreement, α 0.09 to 0.48 (text)Yes/no for fit, pairs among those who pass
ReasoningOn art, plain chain of thought hurt 16 to 18%, structured prompts helped about 44%Evidence with a location, then a verdict
Never abstainingWrong on over 80% of unanswerable items under standard promptsA strong abstain clause, and abstain in code
FacesModels overrate attractiveness, and give fewer competency words to old and obese subjectsNever 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, as a draft to test.

IDOwnerQuestionPass / failCannot tell when
L1, coreLLMIs there a visible source, or a cast shadow that shows where the main light comes from?window at frame left / flat even lightcrop hides all shadow areas
L2, coreLLMDoes the key come from the side on the want card?lit cheek frame-left / other side, frontal, or no single directiontoo small or too dark to read
L3LLMName one shadow edge. Is it crisp or gradual, as asked?crisp along nose or wall / gradient, or no edge because the light is flatmotion blur, compression, too dark
L4CodeAre p5, p95 and clipping inside the want range?p5 ≤ 0.03 / p5 = 0.15 for near blackunder 512 px
L5LLMCould something in this scene produce this light, and do shadows agree?street lamp visible / rim from nowheretight close-up
L6, coreYouIs this the light I meant?yes / nonever

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. 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, 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 has every source and each unstable endpoint.

TierSources
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, unstableAre.na, Openverse: keep a fallback
Your accountFrameThrower, Are.na v3, Flickr API, Mapillary, Unsplash, Pexels, YouTube Data API, Freesound, Epidemic Sound MCP, Savee, Refs Pro, Mobbin, Refero
Person only: linksPinterest, 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 skipMaroofy (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.

JobWhoStart with
LightRoger Deakins, Shane Hurlbut ASC, Wandering DP, David Hobby, James GurneyJesse James x 3, RED interview, Ratios 101, Strobist
FramingTod Campbell, Hao (Hunter) Deng, Gray KotzeThe Credits, Flanelle, In Depth Cine
MotionMiyazaki via Animation Obsessive, Emil KowalskiRunning, Great animations
PeopleJennifer Venditti, Eleonore Hendricks, Sarah SmallDazed, MovieMaker, 1 Granary
AI filmHenry Daubrez, Monique Pryce, Dave Clark, Paul Trillo, KavanJunkyard King, FAQ, breakdown
MusicThomas Golubić, Randall PosterAwardsDaily, WIPO
SlopNegar Kamali and Matthew Groh, Hany Farid, Paul Bakausguide, Berkeley, Impeccable
LLM judgesHamel Husain, Shreya Shankar, Eugene Yan, Contra Labsguide, paper, review, TASTE

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

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

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

  1. How to find references for an AI video (this page)
  2. How to make a moodboard for an AI video
  3. How to write a video script with an AI agent
  4. How to design sound and voice for an AI video
  5. How to design characters and props for AI video
  6. How to previz a video in Three.js or Blender
  7. How to animate a previz with AI video models
  8. How to edit a video with HyperFrames and AI agents
  9. How to judge an AI video: measure, don't grade
  10. How to keep an AI video project in GitHub