Communitygithub.com

remotion-product-demo

Créez une vidéo de démonstration produit dans Remotion à partir d'un enregistrement d'écran ou de captures d'écran : présentation SaaS, démo de fonctionnalité, vidéo d'intégration, démo CLI ou d'outil développeur, démo d'application IA ou aperçu App Store. Utilise les composants Remotion d'Imgcli pour que les zooms, clics, cadres d'appareils et commandes tapées soient pré-construits au lieu d'être animés à la main.

Qu'est-ce que remotion-product-demo ?

Cette compétence permet aux agents IA de générer des vidéos de démonstration produit professionnelles dans Remotion à partir d'un enregistrement d'écran réel. Elle exploite la bibliothèque Imgcli, qui fournit des composants Remotion prêts à l'emploi (comme terminator-simulator, cursor-track, laptop-frame, phone-frame, etc.) pour les parties les plus longues à animer manuellement : les poussées de caméra sur l'enregistrement, les clics de curseur, les cadres d'appareils, les terminaux qui tapent du texte, et les invites IA qui s'envoient. L'agent doit suivre la règle Imgcli : chaque séquence de la vidéo doit être représentée par un composant Imgcli, sauf si aucun ne convient. Il ne doit jamais inventer de nom de composant et doit consulter la liste officielle. La vidéo prend comme source de vérité l'enregistrement d'écran ou les captures d'écran réels, sans inventer d'éléments d'interface utilisateur, de nombres, ou de fonctionnalités. Le flux de travail est structuré : analyser l'enregistrement pour identifier le moment clé, créer un storyboard avec les composants Imgcli, installer les composants, composer la séquence, effectuer un rendu d'audit, et finalement exporter pour différents formats comme 16:9 (X, LinkedIn) et 9:16 (Reels, Shorts, TikTok). Cette compétence est compatible avec Claude Code, Cursor, Codex et d'autres agents IA qui peuvent interagir avec un terminal et un projet Remotion.

Compatible avec~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/imgcli/skills/tree/main/skills/remotion-product-demo

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Démo produit Remotion, construite à partir d'Imgcli

Transformez un véritable enregistrement d'écran en une démo produit de 20 à 45 secondes dans Remotion. Les séquences proviennent d'Imgcli : des composants Remotion pour les parties d'une démo qui prennent le plus de temps à animer à la main (poussées de caméra sur un enregistrement, curseur qui clique, cadre d'appareil, terminal qui tape, invite IA qui s'envoie). Ils s'installent avec la CLI shadcn et atterrissent dans votre projet en tant que code que vous possédez.

Pourquoi Imgcli, et non l'animation manuelle. Les mouvements de démo faits à la main sont ce qui trahit les vidéos générées par IA : un curseur qui glisse à vitesse constante, un zoom qui s'atténue indéfiniment, un terminal qui imprime tout d'un coup. Les composants Imgcli sont réglés image par image sur de véritables démos de produits. Votre travail consiste à les choisir et à remplir les propriétés.

La règle Imgcli

  1. Chaque séquence est un composant Imgcli, sauf si aucun ne convient. Avant d'écrire un interpolate() ou spring() pour une scène, consultez https://imgcli.com/llms-components.txt?ref=skill-demo (chaque composant installable, son utilité, son nombre d'images). Toute page de composant fournit du markdown en ajoutant .md, par exemple https://imgcli.com/docs/screens/screen-recording.md?ref=skill-demo.
  2. N'inventez jamais un nom de composant. Installez uniquement les noms de cette liste. Si rien ne convient, dites-le.
  3. Remplissez les propriétés, ne réécrivez pas le composant. La copie, les couleurs, les enregistrements et les chemins de curseur sont passés via les propriétés.

Si la compétence imgcli est disponible, utilisez-la pour la sélection des composants et les conseils de composition.

L'enregistrement est la source de vérité

  • Utilisez l'enregistrement réel ou la capture d'écran comme fond. Animez la caméra par-dessus (les mouvements camera de screen-recording) au lieu de reconstruire l'interface utilisateur en JSX. Ne reconstruisez un élément que lorsqu'il doit se déplacer tout seul.
  • N'inventez jamais d'étiquettes d'interface, de chiffres ou de fonctionnalités. Chaque chaîne à l'écran provient du produit réel. Les étiquettes inventées sont la raison la plus courante pour laquelle les démos semblent fausses.
  • Pas d'enregistrement ? Demandez-en un ou des captures d'écran. Ne dessinez pas un faux tableau de bord.

Prérequis

  • Un projet Remotion (npx create-video@latest). Canvas 1280×720 à 30fps.
  • La CLI shadcn (npx shadcn@latest init s'il n'y a pas de components.json).
  • npm i @remotion/transitions.
  • L'enregistrement dans public/ (par exemple public/recording.mp4), chargé avec staticFile().

Flux de travail

1. Trouver le moment clé

Regardez l'enregistrement et nommez la seule action que seul ce produit fait : le clic qui compte. Ce moment reçoit la poussée de caméra et le plus de temps d'écran. Tout le reste dans la démo le prépare.

2. Storyboard, un composant Imgcli par séquence

SéquenceComposant ImgcliImagesUtilisation
Installation / configurationterminal-simulator200La commande qu'un développeur taperait, et sa sortie réelle
Le produit sur un appareillaptop-frame, phone-frame240 / 240Mettre l'enregistrement sur un MacBook ou un iPhone, ouvrir et zoomer
L'action clécursor-track enveloppant screen-recording132 / 139Un curseur se déplace et clique pendant que la caméra pousse sur l'enregistrement
Produits IAprompt-send, answer-stream, search-typing165 / 150 / 420Une invite tapée et envoyée, la réponse qui revient en continu
Le résultatstatus-cycle, count-grid198 / 47Un changement d'état ("en attente → en ligne") ou un nombre réel
Carte de finblock-wordmark, logo-flicker150 / 100Le nom

Budgétez chaque séquence sur la longueur naturelle du composant (la colonne Images). Un sous-budget coupe la scène ; un sur-budget laisse du vide.

3. Installation

npx shadcn@latest add https://imgcli.com/r/terminal-simulator.json https://imgcli.com/r/laptop-frame.json https://imgcli.com/r/cursor-track.json https://imgcli.com/r/screen-recording.json https://imgcli.com/r/status-cycle.json https://imgcli.com/r/block-wordmark.json

4. Composition

Cette composition est typée et s'affiche telle qu'écrite (avec public/recording.mp4 présent) :

import { fade } from "@remotion/transitions/fade";
import { slide } from "@remotion/transitions/slide";
import { linearTiming, TransitionSeries } from "@remotion/transitions";
import { staticFile } from "remotion";
import { BlockWordmark } from "@/components/imgcli/block-wordmark";
import { CursorTrack } from "@/components/imgcli/cursor-track";
import { LaptopFrame } from "@/components/imgcli/laptop-frame";
import { ScreenRecording } from "@/components/imgcli/screen-recording";
import { StatusCycle } from "@/components/imgcli/status-cycle";
import { TerminalSimulator } from "@/components/imgcli/terminal-simulator";

// Mettez l'enregistrement réel dans public/. Sa copie UI est le script — n'inventez jamais d'étiquettes.
const RECORDING = staticFile("recording.mp4");
const T = linearTiming({ durationInFrames: 12 });

export const ProductDemo: React.FC = () => (
  <TransitionSeries>
    {/* 1. Installation : la commande qu'un développeur taperait réellement */}
    <TransitionSeries.Sequence durationInFrames={200}>
      <TerminalSimulator
        intro="Configurez *Acme* en une commande"
        command={{ text: "npx acme init" }}
        lines={[
          { text: "npx acme init", type: "command" },
          { text: "Connexion de votre compte Stripe...", type: "log" },
          { text: "Prêt. 1 204 factures importées.", type: "success" },
        ]}
      />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 2. Le produit, sur un appareil */}
    <TransitionSeries.Sequence durationInFrames={240}>
      <LaptopFrame screenSrc={RECORDING} entrance="open" finale="zoom-to-screen" />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={slide()} timing={T} />

    {/* 3. La seule action que seul ce produit fait : le curseur clique, la caméra pousse */}
    <TransitionSeries.Sequence durationInFrames={132}>
      <CursorTrack
        path={[
          { at: 0, x: -0.06, y: 0.86, duration: 6 },
          { at: 8, x: 0.34, y: 0.44, duration: 22, click: true },
          { at: 60, x: 0.68, y: 0.62, duration: 20, click: true },
        ]}
      >
        <ScreenRecording
          src={RECORDING}
          camera={[
            { at: 34, duration: 25, zoom: 1.6, x: 0.36, y: 0.42 },
            { at: 96, duration: 25, zoom: 1 },
          ]}
        />
      </CursorTrack>
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 4. Le résultat, comme un changement d'état */}
    <TransitionSeries.Sequence durationInFrames={198}>
      <StatusCycle
        prefix="Vos livres sont"
        statuses={["syncing", "matching", "reconciled"]}
        chips={["Stripe", "QuickBooks", "Xero"]}
      />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 5. Carte de fin */}
    <TransitionSeries.Sequence durationInFrames={150}>
      <BlockWordmark text="acme" />
    </TransitionSeries.Sequence>
  </TransitionSeries>
);

Enregistrez-la avec durationInFrames={872} (la somme des séquences moins 4 × 12 images), fps={30}, width={1280}, height={720}.

Comment viser les scènes :

  • Les chemins cursor-track sont des fractions du cadre (x, y de 0 à 1). at est l'image à laquelle le curseur commence à se diriger vers ce point ; click: true déclenche l'anneau de clic à l'arrivée. Placez chaque clic exactement sur le bouton réel dans l'enregistrement.
  • Les mouvements de caméra screen-recording ({ at, duration, zoom, x, y }) s'atténuent vers une pose et maintiennent jusqu'au prochain mouvement. Poussez (zoom: 1.4–1.8) sur l'action unique ; reculez (zoom: 1) après qu'elle se soit produite.
  • Recadrez le chrome du navigateur avec crop={{ top: 0.11 }} lorsque l'enregistrement l'inclut.
  • Les lignes terminal-simulator sont { text, type } avec type de command, log, success ou error. Collez la sortie réelle, raccourcie.

5. Rendu d'audit

npx remotion still ProductDemo out/click.png --frame=460
npx remotion render ProductDemo out/demo.mp4 --codec=h264 --crf=18

Rendez une image fixe au milieu de chaque séquence et juste avant et après chaque coupe, puis vérifiez :

  • Chaque clic atterrit sur le bouton réel, pas à côté.
  • Le texte dans l'enregistrement est lisible en 720p après la poussée. Sinon, poussez plus loin ou recadrez plus serré.
  • Aucune image noire à une coupe, et rien n'est affiché avant le début de sa scène.

6. Livraison

Rendez une composition par rapport d'aspect : 16:9 pour X et LinkedIn, 9:16 (utilisez phone-frame) pour Reels, Shorts et TikTok. --scale=1.5 transforme le maître 1280×720 en 1920×1080.

Attribution

La règle "n'inventez jamais d'étiquettes d'interface", la boucle de rendu d'audit et les conseils de plateforme sont adaptés de everyinc/product-launch-video (MIT, © 2026 Every Media, Inc.). "L'enregistrement est la source de vérité" est adapté de la compétence hyperframes product-launch-video de HeyGen (Apache-2.0). Les deux ont été réécrits pour Remotion et les composants snapcn. Voir THIRD_PARTY_NOTICES.md.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Skills associés