broll_place
AI agent that places existing video clips from your project into gaps on the broll timeline level, matching clip content to what the speaker is saying.
When to use
Use when you have a folder of broll clips and want AI to select and place them based on transcript content. Run before broll_veo_generate so existing clips get first pick of gaps. See the Broll guide for the full workflow.
In the editor
Add it from the Library (B-Roll group), or with + add step and a search for broll_place, after your transcript and your main cut.
Under Inputs, add transcript as a step input, clips as a file input naming the folder of footage you want it to choose from, and backbone as a step input pointing at your cut so that changing the cut makes it think again. The step's Prompt is where you say how it should choose, and eval_prompt is the bar a clip has to clear to be used at all. min_gap_sec and max_duration_sec control the rhythm: how far apart placements sit and how much of any one clip is used. Turn on full_coverage if you want no gaps left anywhere.
Tick Review gate so the run stops and shows you the choices before anything else is built on them.
The chosen clips appear on the b-roll level in the run timeline, over the gaps where you are not the focus, and you can preview, retime or remove any of them there. Run this before any generating step: it costs nothing to use footage you already have, so give it first pick of the gaps.
YAML Example
- id: broll
processor: broll_place
input:
- id: transcript
step: transcribe_main
- id: clips
file: broll-clips
- id: backbone
step: ai_cut
params:
min_gap_sec: 8
max_gap_sec: 20
max_duration_sec: 8
backbone_step: ai_cut
eval_prompt: >
Accept: direct visual match to spoken content.
Reject: vague topic overlap, people facing away, blurry footage.
output:
timeline: broll
prompt: |
Analyze every unanalyzed clip first (free, mandatory).
Then fill backbone timeline gaps using approved clips where the content
directly matches what the speaker is saying.
Each clip should be placed at most once.
Leave unfilled gaps blank; a broll_veo_generate step will handle those.
review: true
cache: true
Inputs
| ID | Source | Description |
|---|---|---|
transcript |
step | Word-level timestamps from generate_transcript |
clips |
file (glob) | Broll clips folder |
segment_plan |
step (optional) | A SegmentPlan (e.g. from video_director) constraining where b-roll may go |
backbone |
step (optional) | Backbone timeline (used as a cache dep: re-run when the cut changes) |
Params
| Param | Type | Default | Description |
|---|---|---|---|
eval_prompt |
text | none | Accept/reject criteria for clip analysis. Drives what qualifies as a good match. |
context |
text | none | Background context injected into the system prompt. Supports text:, file:, dir:, files:. |
min_gap_sec |
duration (s) | 5 |
Minimum spacing between placed clips |
max_gap_sec |
duration (s) | 0 |
Gaps longer than this need coverage (0 = AI decides) |
max_duration_sec |
duration (s) | 8 |
Max seconds to use from any single clip |
min_clip_sec |
duration (s) | 2 |
Shortest b-roll clip allowed after trimming. |
min_use_sec |
duration (s) | 0 |
Minimum clip use duration. Placements shorter than this are rejected. |
target_clip_sec |
duration (s) | 4 |
Ideal b-roll clip length. |
trim_style |
select: conservative, balanced, aggressive |
"aggressive" |
How aggressively to trim clips to their most impactful moment. |
full_coverage |
bool | false |
Require every second of the backbone to be covered: no gaps allowed |
required_clips |
list | none | Filenames that must be placed. The agent retries until all are placed. |
no_clip_reuse |
bool | false |
Reject placements that reuse overlapping in/out ranges from the same source file |
max_generate |
number | 0 |
Maximum number of clips to place. 0 = no limit. |
backbone_step |
string | none | Step ID to read backbone timeline from (optional: enables backbone-aware placement) |
Output
EditDecisions on the broll level.
Notes
- Uses Puffin Ship's built-in AI: no API key required.
- Clip analysis is cached in
broll/manifest.json. Ask the AI Assistant to clear the step's saved work, or re-run from that step with the per-step control on the run page, to force re-analysis. - Matching is strict by design: clips are only placed where they directly illustrate the spoken content.
- This processor sees all broll clips placed by all previous pipeline steps, so two
broll_placesteps with different clip sources won't overlap.