back

demo-video

Plan, script, build, and verify Remotion product demos, walkthroughs, launch clips, and explainers. Use when a product or technical claim needs a storyboard or rendered video.

Category
workflow
Package
demo-video/SKILL.md
License
MIT
Author
@tushaarmehtaa
Tags
remotionvideodemoexplainerproduct-videoanimation

Install

Swipe for more runtimes.

Codex

Skills directory: ~/.codex/skills

available to install

Install globally

$npx skills add tushaarmehtaa/tushar-skills --skill demo-video -g -a codex -y

Invoke

$demo-video or /skills

You can also describe the task naturally; runtimes may select the skill from its description.

Required access

project filesterminal commands

local coding agent required

This skill requires project files and terminal commands. Uploading it to a chat app does not provide equivalent execution.

ChatGPT Skills

This workflow needs a local coding environment or capabilities that a chat-only Skills upload does not provide.

Why local agent required →

Instructions

Source: SKILL.md

Demo video

Turn one defensible message into a visual sequence that works in its viewing context, then implement it with the repository's Remotion setup. Story, evidence, and comprehension determine the treatment; transitions do not.

Establish the brief from available evidence

Inspect the product, existing media, brand assets, UI, documentation, and Remotion configuration before asking questions. Establish:

  • target viewer and what they know before watching;
  • destination, aspect ratio, sound-on or sound-off context, and duration range;
  • one primary claim or learning outcome;
  • product action, result, data, or demonstration that can prove it;
  • call to action or final implication;
  • available footage, UI states, narration, music, fonts, and brand constraints;
  • deadline, rendering environment, and required deliverables.

Ask only for missing information that changes the claim, evidence, production scope, or rights to use an asset. If creative direction is open, propose a treatment and storyboard rather than asking the user to invent scenes.

Choose the format

  • Product walkthrough — chronological task completion with legible UI and minimal editorial interruption.
  • Launch or social clip — compressed proposition, product evidence, payoff, and action; must work muted if the destination commonly autoplays without sound.
  • Technical explainer — mechanism, observation, interpretation, limitation, and implication. Read explainer writing before scripting.
  • Feature demo — one capability, starting state, action, visible result, and boundary.
  • Narrated tutorial — paced instruction with prerequisites, cursor intent, captions, recovery, and a reproducible result.

Do not combine every format into one video. When several outputs are requested, define a master narrative and decide which beats survive each cut.

Write a proof-led treatment

Before code, produce:

Viewer:
Destination and format:
Primary claim:
Visible proof:
What must be understood by the end:
Narration/caption approach:
Treatment:
Beat list with approximate timing:
Required assets or captures:
Risks or unknowns:

Each beat must change what the viewer knows, sees, or can do. Pair every material narration line with visible evidence or necessary context. Cut decorative scenes that merely repeat the voiceover.

Use real product states and truthful data. Label representative fixture data and avoid presenting it as customer proof.

Script for time and sound context

Draft narration and on-screen copy together. Estimate timing by reading the script aloud at the intended delivery pace, then validate against recorded or generated audio rather than relying only on word count.

  • Keep critical on-screen text readable long enough to parse.
  • Caption spoken content when the deliverable requires accessibility or muted comprehension.
  • Do not make captions compete with product UI or platform overlays.
  • State specialist terms after explaining the mechanism, then use them consistently.
  • Keep claims within what the visible demonstration establishes.

For voiceover, music, sound effects, caption generation, or loudness work, read audio and captions before adding media.

Plan formats deliberately

Do not render one unchanged composition into every aspect ratio. For each requested format, define safe areas, text measure, crop behavior, product-UI scale, and any beat that needs recomposition or omission.

Share components and timeline data when useful, but allow format-specific composition. Register only deliverables the user needs.

Implement in the existing Remotion project

Inspect installed versions, module format, project entry point, configuration, scripts, and existing primitives. Use those APIs and conventions. For a new standalone project, select compatible current versions rather than copying pinned versions from this skill.

Separate concerns where the project size benefits from it:

  • composition registration and input props;
  • narrative/timeline data;
  • scenes or shots;
  • shared visual primitives;
  • media and font loading;
  • captions and audio mix;
  • tests or frame assertions.

Pass local timeline time to scenes when their animation is scene-relative. Use global time only for deliberately continuous behavior. Clamp interpolation only when values can travel outside the intended range; do not add ceremonial options to bounded inputs.

Read Remotion primitives only when the treatment needs reusable scene lifecycle, text-reveal, transition, or typing patterns. Adapt the primitives to the chosen visual language; none is mandatory.

Read implementation cheatsheet when choosing animation parameters, responsive sizing, font loading, or render commands. Verify APIs against the installed Remotion version.

Design motion from meaning

Choose cuts, dissolves, spatial continuity, reveals, zooms, or pauses based on the relationship between beats. Avoid applying springs, stagger, grain, glow, terminal simulation, bouncing buttons, or animated gradients as a signature recipe.

Animation must be deterministic under frame seeking. Support reduced motion when the video is embedded as an interactive or web experience. Do not animate fine detail that disappears at the final delivery size.

Handle product capture

When showing a live product:

  1. define the exact state and data needed;
  2. remove secrets and personal information;
  3. control viewport, cursor, zoom, and animation settings;
  4. capture at sufficient resolution;
  5. preserve UI chronology so actions and results remain believable;
  6. record limitations when a mock or fixture substitutes for a live state.

Output contract

Deliver the requested combination of:

  • treatment and timed beat sheet;
  • narration and on-screen script;
  • asset/capture manifest with provenance;
  • Remotion source and composition IDs;
  • caption file or embedded captions;
  • rendered files named by format;
  • representative stills or review frames;
  • verification report including technical and editorial checks.

State which formats share a timeline and which were independently composed.

Verify

Technical

  1. Install or reuse dependencies according to repository policy.
  2. Run typecheck, build, and relevant tests.
  3. List compositions and render every requested deliverable.
  4. Seek representative frames around scene boundaries and confirm deterministic output.
  5. Check missing-media, font-loading, long-text, and format-specific branches.
  6. Confirm output resolution, frame rate, duration, codec, and file size match the delivery contract.

Editorial and visual

  1. Watch each final render from beginning to end at normal speed.
  2. Confirm the opening establishes relevance, the proof is visible, and the ending resolves the stated claim.
  3. Review at actual feed or player size, muted and with sound when applicable.
  4. Check text duration, caption synchronization, safe areas, platform overlays, UI legibility, and visual continuity.
  5. Confirm narration never outruns the evidence or claims unavailable product behavior.

Audio and accessibility

  1. Listen on headphones and ordinary speakers; check peaks, clipping, abrupt edits, intelligibility, and consistent loudness.
  2. Verify captions against the final audio, including names and technical terms.
  3. Confirm essential meaning survives muted playback when required.

Report every check actually performed and any limitation caused by unavailable assets, services, codecs, or deployment context.

Bundled references

4 files · 295 lines

references/audio.md

source ↗

Audio and captions

Read this reference only when the deliverable includes narration, music, sound effects, captions, or a muted-playback requirement.

Build an audio plan

Record each source, owner or license, duration, format, intended role, and whether it may be redistributed. Do not download or generate media unless the user authorized that production path.

Prioritize intelligibility:

  1. narration or essential product sound;
  2. supporting sound effects;
  3. music and ambience.

Music should not be programmatically pulsed on every beat merely because the BPM is known. Shape volume around narration, editorial transitions, and the track's own dynamics. Use automation sparingly and listen to the rendered result.

Synchronize to final media

Use the actual audio duration and waveform when setting scene boundaries. Keep timeline values derived from fps and composition duration rather than hardcoded frame counts.

const secondsToFrames = (seconds: number, fps: number) =>
  Math.round(seconds * fps);

When using Remotion audio components, verify the installed API and whether volume callbacks receive source-relative or composition-relative frames. Keep fades within the source's audible region.

const clamp01 = (value: number) => Math.max(0, Math.min(1, value));

const fadeEnvelope = (
  frame: number,
  start: number,
  end: number,
  fadeInFrames: number,
  fadeOutFrames: number,
) => {
  const inGain = fadeInFrames > 0 ? (frame - start) / fadeInFrames : 1;
  const outGain = fadeOutFrames > 0 ? (end - frame) / fadeOutFrames : 1;
  return clamp01(Math.min(inGain, outGain));
};

Adapt this envelope to actual edit points. Do not reuse arbitrary desktop, phone, or transition multipliers.

Narration

  • Write for one hearing: concrete nouns, manageable clauses, and stable terms.
  • Read the script aloud before recording.
  • Match delivery to the viewer and subject; do not default to launch-video hype.
  • Remove breaths or noise only when the edit remains natural.
  • Keep a clean narration stem so the mix can be revised.

If narration is generated, disclose the production method when required and verify pronunciation, names, numbers, and technical vocabulary.

Captions

Create captions from the final narration, not an earlier script. Preserve meaning rather than mechanically filling a fixed character count.

  • split at phrase boundaries;
  • keep each caption on screen long enough to read;
  • avoid covering product controls or platform UI;
  • use sufficient contrast and a background treatment that survives changing footage;
  • verify punctuation, names, units, and specialist terms;
  • export the requested sidecar format and/or burn-in version.

For sound effects that convey information, provide an equivalent caption or visual cue.

Mix and verify

Render the final composition before judging the mix. Check:

  1. speech intelligibility throughout;
  2. no clipping, abrupt source boundaries, or unexplained level jumps;
  3. consistent perceived loudness across cuts and deliverables;
  4. no music masking consonants or product sounds;
  5. clean intro and outro boundaries;
  6. caption timing against the final encoded file;
  7. muted playback still communicates essential meaning when required.

Use available metering tools for peaks and loudness, but do not claim a broadcast or platform standard was met unless it was measured against that specified standard.

references/cheatsheet.md

source ↗

Remotion implementation cheatsheet

Read this reference only when implementing animation, responsive composition, font loading, or render commands. Confirm every API against the versions installed in the target repository.

Animation parameters

Start from the interaction's meaning, then tune while watching at normal speed.

const progress = spring({
  frame: localFrame,
  fps,
  config: { damping: 18, stiffness: 120, mass: 1 },
});
  • Increase damping to reduce oscillation.
  • Increase stiffness for a faster response.
  • Increase mass for a heavier response.
  • Prefer non-oscillating timing for routine UI, data, and instructions.
  • Review at final scale; a movement visible in Studio may disappear in a feed.

Use interpolate() clamping when the input can precede or exceed its range:

const opacity = interpolate(localFrame, [0, enterFrames], [0, 1], {
  extrapolateLeft: "clamp",
  extrapolateRight: "clamp",
});

Responsive composition

Derive layout from composition dimensions and safe areas. Do not scale a desktop frame uniformly into portrait.

const { width, height } = useVideoConfig();
const orientation = height > width ? "portrait" : "landscape";
const shortEdge = Math.min(width, height);

Branch composition when the information hierarchy changes. Test long copy, product UI, captions, and platform overlays independently in every requested format.

Font loading

Use the font mechanism supported by the installed Remotion version. Load fonts before rendering dependent frames, bundle only licensed files, and provide a predictable fallback. Test missing and slow font paths rather than masking them with an arbitrary renderer timeout.

Render workflow

Inspect project scripts first. Typical commands may include:

npx remotion compositions
npx remotion studio
npx remotion still <composition-id> --frame=<frame> out/review.png
npx remotion render <composition-id> out/video.mp4

Use composition IDs, props, codecs, and timeouts defined by the project. Render representative stills around transitions before paying the cost of a full render.

Determinism checks

  • Seek directly to a frame and compare it with playback reaching the same frame.
  • Avoid wall-clock time, random values without stable seeds, and mutable module state.
  • Pass local frame values to scene-relative animation.
  • Verify asynchronous media and data use Remotion's supported render-delay mechanism.
  • Test the first and last frame of every sequence for flashes or stale layers.

Review checklist

Check the final encoded file, not only Studio: resolution, frame rate, duration, safe areas, text rendering, media presence, audio sync, caption sync, and representative device playback.

references/explainer-writing.md

source ↗

Explainer writing

Use this for product demos and technical explainers that must work when heard once.

Build the narrative

  1. Start from a concrete situation the viewer recognizes.
  2. State the question or problem the video will resolve.
  3. Explain the mechanism before introducing specialist vocabulary; then use the correct term consistently.
  4. Demonstrate the product or experiment chronologically. Let visible actions carry claims that prose would otherwise have to assert.
  5. Move from each finding to the next question explicitly enough that the viewer does not lose the thread.
  6. Separate observation, interpretation, and limitation. Deflate conclusions the evidence cannot support.
  7. End with the practical implication or next action, not a generic mission statement.

Write for speech

Use contractions and concrete nouns. Vary sentence length, but reserve very short sentences for real emphasis. Repeat a hard concept when the viewer cannot scroll back. Remove written-prose transitions, retention bait, empty hype, and perfectly balanced cadence.

Read the script aloud at delivery speed. Revise anything that trips the tongue, overloads working memory, or claims more than the visual evidence shows.

Pair narration with evidence

For every line, identify what the viewer sees: a product action, cursor movement, interface state, diagram, data point, or purposeful pause. If a line has no supporting visual and adds no necessary context, cut it.

references/primitives.md

source ↗

Remotion primitives

Read this reference only when the selected treatment benefits from reusable scene lifecycle, transition, text-reveal, or typing behavior. These are adaptable patterns, not mandatory visual signatures.

Contents

Scene lifecycle

Keep scene-relative timing explicit and handle zero-length fades without duplicate interpolation points.

import { AbsoluteFill, interpolate } from "remotion";

type SceneProps = {
  children: React.ReactNode;
  frame: number;
  duration: number;
  fadeIn?: number;
  fadeOut?: number;
};

export const Scene = ({
  children,
  frame,
  duration,
  fadeIn = 0,
  fadeOut = 0,
}: SceneProps) => {
  const enter = fadeIn > 0
    ? interpolate(frame, [0, fadeIn], [0, 1], {
        extrapolateLeft: "clamp",
        extrapolateRight: "clamp",
      })
    : 1;
  const exit = fadeOut > 0
    ? interpolate(frame, [duration - fadeOut, duration - 1], [1, 0], {
        extrapolateLeft: "clamp",
        extrapolateRight: "clamp",
      })
    : 1;

  return <AbsoluteFill style={{ opacity: Math.min(enter, exit) }}>{children}</AbsoluteFill>;
};

Add backgrounds only when the shot should occlude earlier layers. Transparent scenes are valid for intentional compositing.

Text reveal

Reveal by line, word, or character only when sequencing helps comprehension. Use semantic text and preserve natural spacing.

const words = text.split(/(\s+)/);

return words.map((token, index) => {
  if (/^\s+$/.test(token)) return token;
  const opacity = interpolate(frame - index * stagger, [0, enterFrames], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });
  return <span key={`${token}-${index}`} style={{ opacity }}>{token}</span>;
});

Avoid springing every word or scaling type from extreme sizes unless the treatment specifically calls for that emphasis.

Transition overlay

Use an overlay only when a cut or direct scene overlap does not express the relationship.

export const FadeOverlay = ({ frame, duration, color }: {
  frame: number;
  duration: number;
  color: string;
}) => {
  const midpoint = duration / 2;
  const opacity = interpolate(frame, [0, midpoint, duration], [0, 1, 0], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });
  return <AbsoluteFill style={{ backgroundColor: color, opacity, zIndex: 100 }} />;
};

Set stacking relative to the actual composition rather than assuming 100 is universally sufficient.

Typing behavior

Use typing only for a real command, search, message, or input whose sequence matters.

const typed = Math.floor(
  interpolate(frame, [start, end], [0, text.length], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  }),
);
const visibleText = text.slice(0, typed);

Keep the cursor subordinate, stop or change it when entry completes, and ensure the full value remains visible long enough to read.

Selection rules

  • Prefer a cut when continuity is already clear.
  • Prefer local transforms over layout-property animation.
  • Keep effects tied to a narrative or state change.
  • Parameterize tokens through the composition's design system.
  • Test primitives at sequence boundaries, in every requested format, and under direct frame seeking.