---
title: "Breaking-News Flash — cinematic b-roll + a real broadcast UI overlay, in one reel"
tier: hero
format: short-form-video
theme: broadcast | news | finance | explainer
persona: news creator, finance channel, social desk, explainer creator
duration: "1 topic → 25–40s vertical reel in ~6–12 min"
budget_usd: "$0.80–$4.00 per reel (5–7 beat keyframes + Ken-Burns/motion + TTS + music + hyperframes overlay)"
caps: ["generate_project", "ltx-q-i2v", "chatterbox-tts", "music", "ffmpeg-concat", "ffmpeg-audio-mix", "hyperframes-render"]
skills: ["short-form-video", "hyperframes-overlays"]
showcases: ["/chapters/breaking-news-flash-example.html"]
status: "live (2026-06-09) — rendered E2E. The example reel ('Markets Flash') was produced exactly via this recipe (Ken-Burns base + a broadcast-UI hyperframes-render overlay)."
reliability: 4.6 # computed: 5.0 − 0.3 (beat keyframes) − 0.2 (tts) − 0.2 (music) − 0.2 (6th stage overflow); Ken-Burns default + ffmpeg + hyperframes are deterministic −0.0 (i2v upgrade path adds −0.6); +0.5 proven E2E showcase (Markets Flash)
---

# Breaking-News Flash — cinematic b-roll + a pixel-perfect broadcast UI, in one reel

Point this at any timely topic — a market move, a tech launch, a weather event — and it builds a **broadcast-grade vertical news flash**: cinematic AI b-roll for the *feel*, and a single timed-HTML overlay that *is* a real news graphics package. The b-roll carries the mood; the overlay carries the broadcast UI — a flashing red **BREAKING** pill, a channel header, a live stat box, **timed lower-third headlines** that swap per beat, and a **CSS scrolling ticker**. AI video can never render a legible ticker or a clean ▲ +1.2% stat box — so this playbook never asks it to. That UI lives in the HTML layer.

## What you'll get

> **A finished reel = vertical 9:16 + voiceover + music bed + a convincing broadcast-UI HTML overlay + 25–40s.** Pass `aspect_ratio: "9:16"` to `generate_project` (it threads to every scene; the model often returns 4:3 keyframes, so the Ken-Burns step cover-crops to exactly 1080×1920 — see the note below), animate in waves of ≤4–5 (or use the Ken-Burns stills fallback when fal's video tier is flaky), mux `chatterbox-tts` anchor narration over a ducked `music` bed, stitch with `ffmpeg-concat`, then lay a single `hyperframes-render` document — the news graphics package — over the whole reel. A silent montage with the ticker baked into a blurry frame is a draft, not a deliverable — see the `short-form-video` skill's *definition of done* and the `hyperframes-overlays` skill for the overlay pattern.

A 25–40s **vertical (9:16, 1080×1920)** news flash: a cold headline → context → 2–3 developing beats → outlook script, 5–7 cinematic beat keyframes, slow motion (i2v or Ken-Burns), an authoritative anchor VO over an urgent bed, **and** a pixel-perfect HTML broadcast overlay — flashing BREAKING pill, channel header, a live stat box, per-beat lower-third headlines that swap at their timestamps, a scrolling ticker, and an honesty disclaimer.

## The cap chain (the PROVEN recipe)

```
topic (the news angle — keep it neutral / on-policy)
  → agent writes the script: cold headline → context → developing beats → outlook
       (this is BOTH the anchor VO AND the on-screen lower-third headlines)
  → generate_project           # one cinematic 9:16 keyframe per beat
       aspect_ratio: "9:16"
       image: gpt-image | flux-dev | recraft-v4 | mai-image-2.5
       PICK ON-POLICY SUBJECTS — markets / skylines / trading floors / abstract data
                                 sidestep fal's content filter (NO real people, NO violence)
  → motion (pick ONE):
       (a) Ken-Burns DEFAULT   # ffmpeg zoompan slow-zoom on each 9:16 still → ~6s clips
                               # deterministic, exactly 9:16, zero fal risk. The example reel used THIS.
       (b) i2v upgrade (OPTIONAL) # ltx-q-i2v slow cinematic push per keyframe — pass resolution:"auto"
                               # — or alt caps seedance-i2v / kling-i2v / pixverse-i2v / cosmos-3-i2v.
                               # Only offer when the user asks for "real motion" and accepts +$1–2 and fal latency.
  → chatterbox-tts             # authoritative news anchor narrator
  → music                      # urgent instrumental bed — pass lyrics_prompt:"[Instrumental]"
                               #   ("tense news-broadcast underscore, no vocals")
  → ffmpeg-concat              # stitch the clips → silent base reel
  → ffmpeg-audio-mix           # VO over a ducked music bed, mixed onto the base reel.
                               #   Set audio_fill:"loop" so the bed covers the whole 25–40s
                               #   (the music clip is often shorter than the reel)
  → hyperframes-render         # THE BROADCAST LAYER — one timed HTML doc over the whole base reel
                               # ≤15s reel → create_media model_override:"hyperframes-render"
                               # >15s reel → call the cap directly (tool /run/hyperframes-render
                               #             or raw SDK /inference) with duration:N
```

## How the agent should run this (interaction contract)

1. **CONFIRM (one message, ≤1 question):** restate in 1 line ("30s 9:16 news flash on <topic>, 6 beats, anchor VO + urgent bed + broadcast HTML overlay, ~$0.80–4, ~6–12 min") + real choices: Ken-Burns default (proven, deterministic) vs i2v "real motion" upgrade (+$1–2, fal latency) · 5 vs 7 beats. Only ask if the topic risks being off-policy (real people / disaster footage) — otherwise state assumptions and start.
2. **PREVIEW CHECKPOINT:** show the SCRIPT + the overlay copy (headlines, ticker symbols, stat values — $0) and then the 5–7 beat keyframes (~$0.30) BEFORE any motion or `hyperframes-render` fires; a wrong stat value in the overlay is worse than a bad image.
3. **NARRATE:** 1-liner per step with ETA ("keyframes ~60–90s", "Ken-Burns pass ~1 min", "overlay render ~1–2 min for a 28s reel"); poll `get_create_media` every 10–15s, ≤4–5 video jobs in flight, never silent >2 min.
4. **FAIL GRACEFULLY:** gpt-image 422 → soften to an on-policy subject (skyline, not crowd) → nano-banana; i2v hang/"fetch failed" → retry once → `ltx-q-i2v` (`num_frames:241`, resolution "auto") → Ken-Burns stills (the example reel's proven path anyway); overlay >15s rejected by `create_media` → call `/run/hyperframes-render` directly with `duration:N`. ≤2 retries per step; deliver the base reel without the overlay rather than nothing.
5. **DELIVER:** final MP4 + one honest line ("ticker/stat values are illustrative — the on-screen disclaimer says so; base is Ken-Burns, not true motion") + ONE next step (i2v motion upgrade, or run the next topic).

## The differentiator — the broadcast-UI overlay HTML

`hyperframes-render` runs an agent-generated HTML document in Chromium and composites it over the base reel for `duration` seconds. The whole layer is **one** HTML file driven by CSS `@keyframes` on a fixed timeline. It doesn't just caption — it reconstructs a real news graphics package:

- a **flashing red BREAKING pill** (CSS opacity pulse) + a channel header ("MARKETS FLASH"),
- a **stat box** ("S&P 500 ▲ +1.2%") that AI video would melt into glyph soup,
- **timed lower-third headlines** — one per beat, fading in/out at their timestamps,
- a **CSS scrolling ticker** (AAPL / NVDA / XOM … with green/red deltas) running the full width,
- a small **"Illustrative — AI-generated b-roll, not live footage"** disclaimer (deliberate honesty).

```html
<!-- broadcast overlay: BREAKING pill + ticker + per-beat lower thirds -->
<style>
  body { margin:0; width:1080px; height:1920px; font-family:'Inter',sans-serif; color:#fff; }
  /* flashing BREAKING pill */
  .breaking { position:absolute; top:70px; left:48px; background:#d2222d; font-weight:800;
              letter-spacing:.12em; padding:10px 18px; border-radius:6px; font-size:30px;
              animation:flash 1s steps(2,end) infinite; }
  @keyframes flash { 50% { opacity:.35; } }
  .header { position:absolute; top:74px; right:48px; font-size:30px; font-weight:700; opacity:.92; }
  /* live stat box */
  .stat { position:absolute; top:140px; left:48px; background:rgba(8,12,22,.78);
          border-left:6px solid #2ec27e; padding:14px 22px; border-radius:8px; font-size:38px; font-weight:700; }
  .stat .up { color:#2ec27e; }
  /* per-beat lower-third headline — staggered by animation-delay */
  .lt { position:absolute; bottom:230px; left:0; width:100%; opacity:0;
        background:linear-gradient(90deg,rgba(210,34,45,.92),rgba(10,12,20,.6)); padding:22px 40px; }
  .lt h2 { margin:0; font-size:46px; font-weight:800; }
  @keyframes show { 0%{opacity:0;transform:translateX(-24px)} 8%,92%{opacity:1;transform:none} 100%{opacity:0} }
  .l1 { animation:show 9s  0s forwards; }   /* beat 1: 0–9s   */
  .l2 { animation:show 9s  9s forwards; }   /* beat 2: 9–18s  */
  .l3 { animation:show 10s 18s forwards; }  /* beat 3: 18–28s */
  /* scrolling ticker */
  .ticker { position:absolute; bottom:60px; left:0; width:100%; overflow:hidden;
            background:#0a0c14; border-top:2px solid #2ec27e; padding:14px 0; white-space:nowrap; }
  .ticker .run { display:inline-block; font-size:30px; font-weight:600; animation:scroll 18s linear infinite; }
  .ticker .up { color:#2ec27e; } .ticker .dn { color:#e0524b; }
  @keyframes scroll { to { transform:translateX(-50%); } }
  .disclaimer { position:absolute; bottom:8px; left:0; width:100%; text-align:center;
                font-size:18px; color:rgba(255,255,255,.55); }
</style>
<div class="breaking">BREAKING</div>
<div class="header">MARKETS FLASH</div>
<div class="stat">S&amp;P 500 <span class="up">▲ +1.2%</span></div>
<div class="lt l1"><h2>Wall Street opens sharply higher</h2></div>
<div class="lt l2"><h2>Tech megacaps lead the rally</h2></div>
<div class="lt l3"><h2>Energy lags as crude slips</h2></div>
<div class="ticker"><span class="run">
  AAPL <span class="up">▲1.8%</span> &nbsp; NVDA <span class="up">▲3.1%</span> &nbsp; XOM <span class="dn">▼0.9%</span> &nbsp;
  AAPL <span class="up">▲1.8%</span> &nbsp; NVDA <span class="up">▲3.1%</span> &nbsp; XOM <span class="dn">▼0.9%</span> &nbsp;
</span></div>
<div class="disclaimer">Illustrative — AI-generated b-roll, not live footage</div>
```

**The 15s cap split:** a 28s reel exceeds `create_media`'s 15s `duration` cap. For long reels, call the capability directly — the tool endpoint `/run/hyperframes-render` or raw SDK `/inference` — with `duration: 28`. Reels ≤15s can go through `create_media model_override: "hyperframes-render"`.

## Script structure (beats)

1. **Headline (0–4s)** — the cold lead, stated like an anchor. "Wall Street opens sharply higher."
2. **Context (1 beat)** — why now, in one sentence. "After a week of inflation jitters…"
3. **Developing beats (2–3, 1 beat each)** — the moving parts, one per beat. Each gets a lower-third headline.
4. **Outlook (last beat)** — the "what to watch" close that earns the share.

## Quality bar

- **Native 9:16** — every keyframe and every clip is 1080×1920, NOT post-cropped from 16:9.
- **Deterministic broadcast UI** — the BREAKING pill, stat box, lower thirds, and ticker live in the `hyperframes-render` layer, never baked into a generated image.
- **VO + music covers the whole reel** — `chatterbox-tts` anchor narration over a ducked urgent bed, mixed with `ffmpeg-audio-mix` and `audio_fill:"loop"` so the bed never dies before the reel ends; silent is a draft.
- **25–40s** — long enough to land one story, short enough to finish.
- **Honest by construction** — neutral b-roll + the on-screen disclaimer. This is a *format demo*, not a real newsroom.

## Watch-outs

- **Keep the topic neutral and on-policy — this is deliberate, not a limitation.** Real people, likenesses, violence, and disaster footage trip fal's content filter (422) AND raise real likeness / misinformation concerns. Pick markets, skylines, abstract data, weather systems, trading floors. The example reel is "Markets Flash" for exactly this reason. The "Illustrative — AI-generated b-roll, not live footage" disclaimer is part of the overlay, not an afterthought.

- **fal video tier is flaky — mitigate, don't fight it.** The video tier has real latency and rejects edgy prompts. Mitigations, in order: (1) prompt **on-policy, image-led** subjects; (2) try alternate video caps (`kling-i2v`, `pixverse-i2v`, `cosmos-3-i2v`, `ltx-q-i2v`); (3) render in **waves of ≤4–5** and poll each to *done* before firing the next; (4) fall back to the **Ken-Burns stills** path (ffmpeg `zoompan` slow-zoom on each 9:16 keyframe → ~6s clips). The example reel honestly used the Ken-Burns fallback — reliable and exactly 9:16.

- **4:3 keyframes → cover-crop to 1080×1920.** The image model often returns 4:3 even with `aspect_ratio:"9:16"`. The Ken-Burns step's `zoompan`/`scale`+`crop` cover-crops to exactly 1080×1920 — so the base reel is true vertical regardless of what the model handed back.

- **`hyperframes-render` runs agent-generated HTML in Chromium with `file://` access.** Only ever feed it **agent-authored** HTML — never paste untrusted third-party markup into the overlay. Treat the overlay document as code you wrote.

- **Don't put the ticker or the stat in the image.** That's the whole point. AI text rendering is the hardest known failure mode — a garbled ticker or a melted "+1.2%" kills the broadcast illusion instantly. Render the UI in the HTML layer.

## Pairs with

- **`live-stream-commentary`** — when you want a *running* commentary track over a live feed rather than a packaged flash. Same broadcast sensibility, different chassis.

## Cross-surface (MCP / CLI / Webapp)

- **MCP:** `generate_project` (9:16 beats) → `create_media` (TTS, music) → `ffmpeg-concat` → `hyperframes-render` overlay (≤15s via `create_media model_override`, >15s via the cap directly with `duration:N`).
- **CLI:** `livepeer story "<news angle> flash, 9:16, neutral on-policy subjects"` → TTS + music via `livepeer media create` → `livepeer media export` to stitch → call `hyperframes-render` for the broadcast overlay (long reels via raw `/inference duration:N`). Ken-Burns fallback via `ffmpeg zoompan` if the video tier rejects.
- **Webapp chat:** `make a breaking-news flash about <neutral topic> with a broadcast UI overlay` — the agent drafts the headline→context→beats→outlook script, renders 9:16 b-roll, and offers the timed broadcast-overlay finishing as a follow-up.

## Execution mode (autopilot / director / auto)

This is a multi-scene project, so pass a `mode` to `generate_project` to control the **pre-finish gate** (after every scene renders, before delivery): `autopilot` (certain brief → ship in one call, no pause), `director` (always pause for a human pick/steer before delivery), or `auto` (recommended — ship UNLESS the auto-critic is unsure: score < `confidence_threshold` (default 0.8), verdict `iterate`, or a flagged shot). Setting `mode` runs the project async (returns a `job_id`); resume a director/auto pause with `review_checkpoint` + `resume_from_checkpoint` (decision `continue` to deliver / `abort` to discard). Omit `mode` for legacy straight-through behavior.
