Skip to content
Visuals

What Studio puts on screen.
And where every piece of it comes from.

Cards, b-roll, stock video, generated stills and six colour looks. This page is the honest inventory of the picture layer: how many cards you asked for, what each one has to pass before it is drawn, and which parts are generated rather than filmed.

No card shows a word nobody said Your own footage is used first Only a text query leaves the server Six looks, three at a time

Three of the fifteen preference keys decide what appears on top of your footage: visuals, hook and link. Nothing on this page is a new subsystem — the preference file, the plan-time check, the stock search and the six looks all exist today.

How many cards you get prefs.py:24 · prefs.py:43
The visuals preference and the density it multiplies
You chooseThe plain wordsDensity
nonevisual cards: none0.0
fewervisual cards: fewer0.2
normalvisual cards: normalautomatic
morevisual cards: more0.75

DENSITY is a multiplier on the cards the planner would otherwise draw: 0.0 draws none, 0.2 keeps about one in five, 0.75 about three in four, and normal leaves the number to the Studio. At none, the footage you uploaded still stays — only the cards Studio adds go away.

The word check

No card will ever show a word nobody said.

Every number and phrase planned for a card is checked against your transcript at plan time, before a single frame is drawn. A card holding an unspoken word is dropped, and that sentence is planned again on your face instead — as a shot of you talking, with captions.

The rule Checked at plan time, before anything is drawn. The check does not run on the finished file. It runs while the plan is still a plan, so a three-hour job cannot fail at the end for something its own plan already contained. The safety net has a name in the code — pipeline.drop_unspoken — and the ordinal rule has one too, autoplan.headline_numbers.

Where the rule came from

A 54-minute talk was rendered for three hours and then failed its last check. The planner had built a number card reading “11 / th grade” out of the sentence “10th and 11th grade”: the recogniser had split an ordinal into a number and a stray word, and the card took both. Three hours of work, lost at the final gate, for a reason the plan already contained.

Two things changed, and neither of them is a promise. An ordinal counts nothing, so “10th”, “11th grade” and “21st” produce no counting card at all. And the same test that failed the finished file now runs when the plan is made.

Rule F22 · autoplan.headline_numbers · rule PL5 · the S5 test at plan time — GATES.md O-17 · studio/tests/honesty_check.py:1-7

$ python studio/tests/honesty_check.py PASS no unspoken word PASS ordinal rule: "10th and 11th grade" is not a number card PASS a card's words do not end mid-thought PASS a number card carries its unit dropped 1 card ("almost there") — sentence replanned on the face honesty: 5 of 5 pass

The block above is the real output shape of that test. On the live job the same mechanism reported unspoken_shots -> [('119', 2194.9, ['th'])] before the fix, and 5 number cards, 0 unspoken words after it. Source: GATES.md O-10 and O-17.

A drop is not a silent edit
The dropped card and the sentence that replaced it are both written into the video's decisions, with the reason. You can read that a card was removed before you watch the video.
Before it is drawn

Six checks stand between a planned card and your video.

These are the six conditions a visual has to satisfy. The first four are named gates in the project's own gate file; the last two are measured by the layout and have no gate id of their own, which is a gap listed here rather than hidden.

Every visual, every time GATES.md · report.json
S5The words on the card were spoken in this videopass
NW1The figure matches what was said, and carries its unitpass
S4The card does not cover a facepass
R-11The card does not collide with a caption — labels sit in the upper part, clear of the caption bandpass
—The card reads at phone size, in the frame it will actually be watched inlayout
—The card is on screen long enough to be read before the next one arriveslayout
What the gate can still do
S4 warns rather than blocks. On a real conversation job it reported 6 cards within 0.7 s of their shot's end — cards that arrive too late to be read. The file was still delivered, with the warning written down, because refusing a finished video is worse than telling you exactly what is imperfect about it.
Captions are not visuals
Captions are built from the transcript word by word, so they are a different system with a different gate (S3 — captions match the speech). They are drawn in your caption size and words-per-line, or switched off entirely by the captions key.
Where the picture comes from

Three sources, in this order.

Studio reaches for your own material first and only leaves your uploads when it has nothing of its own to use for that sentence.

Your own footage and pictures B-roll clips and stills you uploaded, chosen by what is being said at that moment. Files marked broll and image are yours, filmed and photographed by you, and they are always preferred. file roles: broll · image — studio/web.py:80
A search for a fitting clip When your uploads cannot cover a line, Studio looks for a clip that fits that moment, using a short set of keywords. The clip is labeled as found, not filmed by you. used only when your own pictures do not cover the line
A generated image Last, and only if the search finds nothing usable, Studio generates an image from a text description. It is generated, not filmed — it is not a photograph of anything that happened, and it should not be read as one. Pollinations image — app.py:9722
Or nothing at all A sentence with no honest picture stays on your face with captions. That is the fourth answer, and it is used more often than people expect — the visuals preference can also switch the whole layer off. visual cards: none · density 0.0
What is sent to those services
A text query. A handful of keywords written for that moment in the video, and nothing else — not your video, not your audio, not your transcript, not your name. The request is a search string and it is the only thing that crosses the boundary. of 2–5 words — app.py:3037, :9606

A keyword can pull a found clip or a generated still for a moment in the edit. Your video, audio, and transcript stay on this server. You choose whether a visual is used.

A found clip carries its own license, and a generated image is generated. Both are reasons a person may want the layer turned down or off — which is what the visuals preference is for.

Six colour looks

The grade is a named look, not a slider you have to guess at.

Each look is a real filter chain applied after the layout. Up to three combine with a + — brighter+warmer is a common pair — and natural cancels the rest.

natural No filter at all. Your footage is drawn exactly as it was recorded. no filter · cancels anything combined with it
brighter A little more light, a little more contrast and a little more colour. The smallest of the six changes. brightness +0.05 · contrast ×1.04 · saturation ×1.06
warmer Reds lifted and blues held back, in both the shadows and the highlights. Skin reads warmer; a room lit by a window looks like late afternoon. colorbalance rs +0.06 · bs −0.06
cooler The same shift the other way — blues up, reds down. Good for offices, screens and anything that should read as clinical rather than cozy. colorbalance rs −0.05 · bs +0.06
punchy Contrast and saturation raised together, brightness untouched. The strongest look, and the one most likely to look wrong on already-contrasty footage. contrast ×1.12 · saturation ×1.18
soft Contrast and saturation pulled back with a touch of extra light. It flatters hard light and unflattering rooms. contrast ×0.94 · saturation ×0.92 · brightness +0.02
natural   (no filter)
brighter  eq=brightness=0.05:contrast=1.04:saturation=1.06
warmer    colorbalance=rs=0.06:gs=0.01:bs=-0.06:rm=0.04:bm=-0.04
cooler    colorbalance=rs=-0.05:bs=0.06:rm=-0.03:bm=0.04
punchy    eq=contrast=1.12:saturation=1.18
soft      eq=contrast=0.94:saturation=0.92:brightness=0.02

Quoted from studio/engine/prefs.py:44-47. Combinations are joined in the order you asked for them and capped at three: brighter+warmer, cooler+punchy. An unknown look is dropped rather than guessed at, and natural plus anything is kept as natural alone. You can also ask for a look in the chat — “brighter”, “warmer”, “more colourful”, “natural colours” are four of the documented commands.

See it on your own footage.

Your first 30 minutes are free: one real episode, edited end to end, with the visuals layer working on your own b-roll first. If the picture layer is not what you want, say so in a sentence and it changes the next version.

Or read how the word check is proven, and how a video is made.

The three keys on this page
visuals none · fewer · normal · more
hook auto · off
link up to 80 characters, or empty

hook draws the opening line on frame one from what is actually said; link is what the end card shows, with http:// and a trailing slash removed. An empty link means no end card at all.