Create one narrated 1920×1080 MP4 at 30 fps in /workspace. Use the baked
/opt/remotion harness and dependencies. Never install or download anything.
The sandbox has no network.
Draft the complete deck specification first. For every slide include its
on-screen text and narration line. Keep this specification unchanged: pass its
narration lines to synthesize_narration, and later use the full specification
as markdown_representation. It is the durable accessible and editable source;
scene files and props.json are ephemeral.
Refuse requests above the 12-scene product limit rather than silently shortening them. The selected composition must also be at most 180 seconds.
Inter for normal text,
Lora for editorial titles or quotes, and JetBrains Mono for code and
figures. No other family is available reliably offline. Do not use
loadFont, @font-face, or @remotion/google-fonts.node_modules.Use this exact module shape:
import type React from "react";
import {AbsoluteFill, useCurrentFrame, useVideoConfig} from "remotion";
import {stagger} from "../../stagger";
const Scene: React.FC = () => {
const frame = useCurrentFrame();
const {fps} = useVideoConfig();
const entrance = stagger(frame, fps, 0, 1);
return (
<AbsoluteFill
style={{
alignItems: "center",
backgroundColor: "#101828",
color: "white",
fontFamily: "Inter",
justifyContent: "center",
}}
>
<h1 style={{fontSize: 96, ...entrance}}>A clear opening</h1>
</AbsoluteFill>
);
};
export default Scene;There are no assumed React, AbsoluteFill, useCurrentFrame,
useVideoConfig, interpolate, spring, staticFile, Audio, or stagger
globals. Import only what that scene uses.
/opt/remotion to a fresh per-render work directory.synthesize_narration once with every {slide_number, transcript} and
that work directory. It writes files under public/ and returns filenames.
Never fetch audio yourself.props.json with fps, min_duration_in_frames, and ordered
{slide_number, code, audio} scenes. Use returned audio filenames exactly.node render.mjs --preflight props.json. It validates input, writes the
verbatim modules, bundles them, selects the composition, and enforces the
180-second limit without rendering frames.node render.mjs --stills props.json /tmp/stills. Inspect each scene's
start, middle, and end PNG plus contact-sheet.png for clipping, overflow,
contrast, hierarchy, blank frames, and safe margins.node render.mjs props.json /workspace/out.mp4. The harness
measures narration with parseMedia, derives timing, segments long renders,
and concatenates them. Do not hand-calculate audio frame counts.verify_artifact(path="/workspace/out.mp4", format="video"). If it reports a blocking
finding, make one final repair, then run preflight, still review, render, and
verification once more. A second verification failure is terminal.save_artifact only after the exact MP4 verifies, passing the step-1
deck specification as markdown_representation.The workflow permits at most two repairs total: one compile/still repair and one final verification repair.
A render must fit the sandbox operation timeout. The harness controls segment
size; do not bypass it. A successful save removes the render work directory;
if rendering or verification fails terminally, remove that directory before
reporting the failure. For revisions, regenerate from the restored Markdown
specification plus the user's instruction, then render and verify a new MP4.
Do not edit current.mp4 in place.
014e47a
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.