Skip to content

Commit e496d12

Browse files
committed
fix(marketing): give every trailer still the prompt that rendered it
The six cards described their frames loosely and the storyboard cast described a different film: shot 1 read "the engine block blows out; the wreck coasts to a stop on the salt" over a frame of a supercharger spitting fire at speed, and shot 4's "bike" is a long-fork chopper. A card whose prompt does not match its still teaches the reader the wrong thing about what to write. Each card now carries the prompt for that exact frame — subject, action, camera, what is in the background — with the style bible named once above the grid. The cast's shot titles, action lines and camera notes were rewritten against the stills too, so the storyboard screenshot is accurate to the same six frames, and the board's brief no longer opens on a dead engine that is not in the film. Re-shot the storyboard frame, and trimmed its viewport to the height of the six cards.
1 parent 27f4cdc commit e496d12

6 files changed

Lines changed: 116 additions & 54 deletions

File tree

6.86 KB
Loading

marketing/src/app/use-cases/movie-trailer/page.tsx

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,54 @@ import FaqSection from "../../../components/FaqSection";
2323
import { movieTrailerUseCase } from "../../../data/useCaseEntries";
2424
import { SmartDownloadButton } from "../../SmartDownloadButton";
2525

26+
/**
27+
* The six frames from one run, each with the prompt that rendered it. The
28+
* prompts describe these exact frames — a card whose prompt does not match its
29+
* still teaches the reader the wrong thing about what to write.
30+
*/
2631
const shots = [
27-
{ src: "/trailer-shot-1.png", caption: "Blown supercharger spits fire down the straight" },
28-
{ src: "/trailer-shot-2.png", caption: "A raider hauls the war-rig in by the chain" },
29-
{ src: "/trailer-shot-3.png", caption: "Tires tear through the canyon floor" },
30-
{ src: "/trailer-shot-4.png", caption: "A lone rider guns it through the ruins" },
31-
{ src: "/trailer-shot-5.png", caption: "Last repairs before the run" },
32-
{ src: "/trailer-shot-6.png", caption: "The getaway car breaks loose across the flats" },
32+
{
33+
src: "/trailer-shot-1.png",
34+
title: "The blower",
35+
prompt:
36+
"Low tracking shot, tight on the exposed blown V8 of a black wasteland muscle car at speed — chrome supercharger, flame off the side pipe, dust plume behind it, the chase car small in the haze.",
37+
},
38+
{
39+
src: "/trailer-shot-2.png",
40+
title: "The chain",
41+
prompt:
42+
"A masked raider in rags and goggles hauls a chain taut, dragging a caged buggy in from the right, its driver behind the grille, sparks off the tire, ruined refinery towers in the haze.",
43+
},
44+
{
45+
src: "/trailer-shot-3.png",
46+
title: "The rock bed",
47+
prompt:
48+
"Ground-level close-up of a rear wheel churning through loose rock, stones thrown at the lens, sparks under the chassis, canyon wall to the left.",
49+
},
50+
{
51+
src: "/trailer-shot-4.png",
52+
title: "The chopper",
53+
prompt:
54+
"Wide tracking shot of a long-fork chopper flat out through a ruined city, rider in black leather and goggles, dust rolling off the rear tire, collapsed scaffolding behind.",
55+
},
56+
{
57+
src: "/trailer-shot-5.png",
58+
title: "The cut",
59+
prompt:
60+
"Close-up of a grease-covered mechanic leaning into an angle grinder on a frame rail, sparks spraying toward the lens, stacked wrecks behind him.",
61+
},
62+
{
63+
src: "/trailer-shot-6.png",
64+
title: "The getaway",
65+
prompt:
66+
"Wide, low three-quarter front: a rusted muscle car with an exposed blower breaking loose across a cracked dry lake bed, dirt off the rear tire, mountains on the horizon.",
67+
},
3368
];
3469

70+
/** One line, under every prompt above — the whole look of the film. */
71+
const STYLE_BIBLE =
72+
"Blown-out sun, dust in every frame, 35mm, heavy grain · 16:9 · no on-screen text";
73+
3574
/** Step text is shared with the page's HowTo schema — see data/useCaseEntries. */
3675
const stepIcons = [FileText, Clapperboard, ImageIcon, Film];
3776
const steps = movieTrailerUseCase.steps.map((step, i) => ({
@@ -221,9 +260,9 @@ export default function MovieTrailerUseCase() {
221260
</div>
222261
<Image
223262
src="/trailer-storyboard.webp"
224-
alt="NodeTool's storyboard: six shot cards down the board — Dead engine, The chain, The rollover, The bike, The cut, The getaway — each with its still, its action line, its camera notes, and a Still ready status, next to the assistant that directed them"
263+
alt="NodeTool's storyboard: six shot cards down the board — The blower, The chain, The rock bed, The chopper, The cut, The getaway — each with its still, its action line, its camera notes, and a Still ready status, next to the assistant that directed them"
225264
width={3200}
226-
height={3120}
265+
height={2460}
227266
className="h-auto w-full"
228267
/>
229268
</div>
@@ -270,9 +309,12 @@ export default function MovieTrailerUseCase() {
270309
</h2>
271310
<p className="mt-4 text-lg text-slate-400 leading-relaxed">
272311
This is a single run of the board, straight out of NodeTool. Each
273-
card holds one beat and its still. Re-roll a card you don&apos;t
274-
like — stills cost cents, and the rest of the board doesn&apos;t
275-
move.
312+
card holds one beat, the prompt behind it, and the still that
313+
prompt rendered. Re-roll a card you don&apos;t like — stills cost
314+
cents, and the rest of the board doesn&apos;t move.
315+
</p>
316+
<p className="mt-4 font-mono text-xs leading-relaxed text-slate-500">
317+
Style bible · {STYLE_BIBLE}
276318
</p>
277319
</div>
278320

@@ -289,6 +331,9 @@ export default function MovieTrailerUseCase() {
289331
<div className="flex items-center justify-between gap-3 border-b border-white/5 px-4 py-2.5">
290332
<span className="font-mono text-xs text-amber-400">
291333
Shot {String(i + 1).padStart(2, "0")}
334+
<span className="ml-2 font-sans text-sm font-semibold text-white">
335+
{shot.title}
336+
</span>
292337
</span>
293338
<span className="inline-flex items-center gap-1.5 rounded-full border border-emerald-500/25 bg-emerald-500/10 px-2.5 py-0.5 text-xs font-medium text-emerald-300">
294339
<Check className="h-3 w-3" />
@@ -297,14 +342,19 @@ export default function MovieTrailerUseCase() {
297342
</div>
298343
<Image
299344
src={shot.src}
300-
alt={shot.caption}
345+
alt={shot.prompt}
301346
width={1672}
302347
height={941}
303348
className="aspect-video w-full object-cover"
304349
/>
305-
<p className="border-t border-white/5 px-4 py-3 text-sm leading-relaxed text-slate-400">
306-
{shot.caption}
307-
</p>
350+
<div className="border-t border-white/5 px-4 py-3">
351+
<div className="text-xs font-medium uppercase tracking-wide text-slate-500">
352+
Prompt
353+
</div>
354+
<p className="mt-1.5 font-mono text-xs leading-relaxed text-slate-400">
355+
{shot.prompt}
356+
</p>
357+
</div>
308358
</motion.div>
309359
))}
310360
</div>

web/scripts/build-storyboard-cast-stills.mjs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ const OUT = path.join(WEB, "src/demo/assets/storyboardStills.ts");
1919

2020
/** One per `trailer-shot-<n>.png`, in cut order. */
2121
const STILLS = [
22-
{ name: "DEAD_ENGINE", shot: "the engine block blows out over the salt" },
23-
{ name: "THE_CHAIN", shot: "a rider swings a chain at the chase truck" },
24-
{ name: "THE_ROLLOVER", shot: "a wheel churns rock as the truck goes over" },
25-
{ name: "THE_BIKE", shot: "the bike cuts through the ruins" },
26-
{ name: "THE_CUT", shot: "an angle grinder throws sparks across the wreck" },
27-
{ name: "THE_GETAWAY", shot: "the car breaks away across open flats" },
22+
{ name: "THE_BLOWER", shot: "the supercharger spits fire down the straight" },
23+
{ name: "THE_CHAIN", shot: "a raider hauls the buggy in on a chain" },
24+
{ name: "THE_ROCK_BED", shot: "a rear wheel churns loose rock at the lens" },
25+
{ name: "THE_CHOPPER", shot: "the chopper runs flat out through the ruins" },
26+
{ name: "THE_CUT", shot: "a grinder throws sparks off a frame rail" },
27+
{ name: "THE_GETAWAY", shot: "the car breaks loose across the dry lake" },
2828
];
2929

3030
const uris = [];

web/scripts/screenshot-trailer-surfaces.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ const SHOTS = [
4242
id: "storyboard",
4343
url: `${BASE}/demo.html?doc=storyboard-assistant&t=24000&bare=1`,
4444
file: "trailer-storyboard.webp",
45-
// Tall enough for all six cards; the board is a vertical list.
45+
// Tall enough for all six cards, with no dead space under them.
4646
width: 1600,
47-
height: 1560,
47+
height: 1230,
4848
},
4949
{
5050
id: "timeline",

web/src/demo/assets/storyboardStills.ts

Lines changed: 12 additions & 12 deletions
Large diffs are not rendered by default.

web/src/demo/doc/storyboardAssistantCast.ts

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,43 +45,55 @@ const SHOTS: Shot[] = [
4545
shot(
4646
"shot-1",
4747
0,
48-
"Dead engine",
49-
"The engine block blows out; the wreck coasts to a stop on the salt.",
48+
"The blower",
49+
"The supercharger spits fire down the straight, the chase car closing behind.",
5050
{
51-
camera: { framing: "wide", movement: "slow push in" },
51+
camera: { framing: "close-up", movement: "tracking" },
52+
duration_seconds: 4
53+
}
54+
),
55+
shot(
56+
"shot-2",
57+
1,
58+
"The chain",
59+
"A masked raider hauls the buggy in on a chain, sparks off the tire.",
60+
{
61+
camera: { framing: "medium", movement: "tracking" },
5262
duration_seconds: 4
5363
}
5464
),
55-
shot("shot-2", 1, "The chain", "A rider swings a chain at the chase truck.", {
56-
camera: { framing: "medium", movement: "tracking" },
57-
duration_seconds: 4
58-
}),
5965
shot(
6066
"shot-3",
6167
2,
62-
"The rollover",
63-
"A wheel churns rock as the truck goes over.",
68+
"The rock bed",
69+
"A rear wheel churns loose rock, stones thrown at the lens.",
6470
{
6571
camera: { framing: "close-up", movement: "handheld" },
6672
duration_seconds: 3
6773
}
6874
),
69-
shot("shot-4", 3, "The bike", "The bike cuts through the ruins, flat out.", {
70-
camera: { framing: "wide", movement: "tracking" },
71-
duration_seconds: 4
72-
}),
75+
shot(
76+
"shot-4",
77+
3,
78+
"The chopper",
79+
"The rider guns the chopper flat out through the ruins.",
80+
{
81+
camera: { framing: "wide", movement: "tracking" },
82+
duration_seconds: 4
83+
}
84+
),
7385
shot(
7486
"shot-5",
7587
4,
7688
"The cut",
77-
"An angle grinder throws sparks across the wreck.",
89+
"A grinder throws sparks off a frame rail in the wreck yard.",
7890
{ camera: { framing: "close-up", movement: "static" }, duration_seconds: 4 }
7991
),
8092
shot(
8193
"shot-6",
8294
5,
8395
"The getaway",
84-
"The car breaks away across open flats and is gone.",
96+
"The car breaks loose across the dry lake and is gone.",
8597
{
8698
camera: { framing: "wide", movement: "slow pull out" },
8799
duration_seconds: 5
@@ -116,7 +128,7 @@ const BOARD: StoryboardCastDoc = {
116128
screenplay: null,
117129
shots: [],
118130
title: "SCRAPHEART — Desert Chase (Teaser)",
119-
brief: "A 24-second chase teaser: a dead engine, a stolen car, one way out.",
131+
brief: "A 24-second chase teaser: a blown blower, a stolen car, one way out.",
120132
style: "",
121133
entityIds: [],
122134
aspectRatio: "16:9",
@@ -129,8 +141,8 @@ const BOARD: StoryboardCastDoc = {
129141

130142
const ANSWER = [
131143
"Six shots, twenty-four seconds: ",
132-
"the blowout, the chain, the rollover, ",
133-
"the bike, the cut, the getaway. ",
144+
"the blower, the chain, the rock bed, ",
145+
"the chopper, the cut, the getaway. ",
134146
"Stills are in — ",
135147
"say go and I'll render the clips."
136148
];
@@ -186,7 +198,7 @@ export const storyboardAssistantCast: StoryboardDocCast = {
186198
status(0, "connected"),
187199
userMessage(
188200
400,
189-
"Board a 24-second chase teaser: a dead engine, a stolen car, one way out. Then render the stills."
201+
"Board a 24-second chase teaser: a blown blower, a stolen car, one way out. Then render the stills."
190202
),
191203
status(900, "streaming"),
192204

0 commit comments

Comments
 (0)