How to make a changelog video in React
Turn every release into a changelog video with Remotion — one React composition, the release notes passed in as props, rendered from the CLI or CI with a single command.
To make a changelog video in React, build one Remotion composition that
takes the release as props — a version and a list of changes — and render it
per release with npx remotion render --props=release.json. Let
calculateMetadata size the video to the number of changes, and every release
gets its video from a JSON file.
1. Describe the release as data
{
"version": "v2.4",
"tagline": "Faster renders, dark mode, and a new CLI.",
"changes": ["Renders 2× faster", "Dark mode everywhere", "npx acme deploy"]
}This file is the only thing that changes between releases. Generate it from your changelog, your tags or your PR titles — it is just JSON.
2. One composition, driven by props
A title card for the version, then one card per change.
Announce Title opens;
Punch Lines cuts hard between the changes, one card
each (| starts a new card):
// src/Changelog.tsx
import { Series } from "remotion";
import { AnnounceTitle } from "@/components/snap-cn/announce-title";
import {
PunchLines,
punchLinesDuration,
} from "@/components/snap-cn/punch-lines";
export type Release = {
version: string;
tagline: string;
changes: string[];
};
export const TITLE_FRAMES = 170;
export const HOLD = "48"; // frames per change card
export const changesScript = (changes: string[]) => changes.join(" | ");
export const Changelog = ({ version, tagline, changes }: Release) => (
<Series>
<Series.Sequence durationInFrames={TITLE_FRAMES}>
<AnnounceTitle eyebrow="What's new" title={version} tagline={tagline} />
</Series.Sequence>
<Series.Sequence
durationInFrames={punchLinesDuration(changesScript(changes), HOLD)}
>
<PunchLines script={changesScript(changes)} holds={HOLD} accentBeat={0} />
</Series.Sequence>
</Series>
);punchLinesDuration() is exported by the component for exactly this: change
the script and the sequence length follows.
3. Let the video size itself
Five changes need a longer video than three. calculateMetadata computes the
duration from the props before anything renders:
// src/Root.tsx
import { Composition } from "remotion";
import {
Changelog,
changesScript,
HOLD,
TITLE_FRAMES,
type Release,
} from "./Changelog";
import { punchLinesDuration } from "@/components/snap-cn/punch-lines";
export const RemotionRoot = () => (
<Composition
id="Changelog"
component={Changelog}
fps={30}
width={1920}
height={1080}
defaultProps={{
version: "v2.4",
tagline: "Faster renders, dark mode, and a new CLI.",
changes: ["Renders 2× faster", "Dark mode everywhere", "npx acme deploy"],
} satisfies Release}
calculateMetadata={({ props }) => ({
durationInFrames:
TITLE_FRAMES + punchLinesDuration(changesScript(props.changes), HOLD),
})}
/>
);4. Render it per release
--props takes a JSON string or a path to a JSON file:
npx remotion render Changelog out/v2.4.mp4 --props=./release.jsonPut that in CI on every tag and the MP4 is waiting when you write the
announcement. Render a square cut for social by changing width and height;
the components size themselves to the frame.
What makes a changelog video worth watching
- Three changes, not twelve. A video is the trailer, not the notes. Link the full changelog.
- Name the outcome, not the ticket. "Renders 2× faster" beats "Refactor render queue".
- Show one change working. If a change has UI, cut to it — a screen recording with a camera or a terminal typing the new command.
- End on how to get it. A version number and an install command.
Both components install as source you own:
npx shadcn@latest add @snapcn/announce-title @snapcn/punch-linesNext: how to make a product demo video in React.
FAQ
How do you make a changelog video automatically?
Build one Remotion composition that takes the release as props, a version and a list of changes, then render it per release with npx remotion render and --props pointing at a JSON file. The same template produces a new video every release.
How long should a changelog video be?
15 to 30 seconds. A title card, one short card per change, and a closing line with where to get it. Pick the three changes people will care about; link the full notes.
Can the video length change with the number of changes?
Yes. Remotion's calculateMetadata lets a composition compute its durationInFrames from its props, so five changes render longer than three without editing anything.
Can I render a changelog video in CI?
Yes. npx remotion render runs headless, so a GitHub Action or any CI job can render the video on every tag and attach the MP4 to the release.

