Communitygithub.com

remotion-product-demo

실제 화면 녹화나 스크린샷을 바탕으로 Remotion에서 제품 데모 비디오를 제작합니다. SaaS 워크스루, 기능 데모, 온보딩 클립, CLI 또는 개발자 도구 데모, AI 앱 데모, 앱 스토어 프리뷰 등에 적합합니다. Imgcli의 Remotion 컴포넌트를 사용하여 카메라 푸시, 클릭, 디바이스 프레임, 타이핑 명령어를 수동 애니메이션 대신 사전 제작된 형태로 제공합니다.

remotion-product-demo란 무엇인가요?

이 스킬은 Imgcli의 Remotion 컴포넌트를 활용하여 실제 화면 녹화를 기반으로 20~45초 분량의 제품 데모 비디오를 제작합니다. 사용자는 shadcn CLI를 통해 필요한 컴포넌트를 설치하고, 자신의 프로젝트에서 코드로 소유할 수 있습니다. 주요 기능으로 터미널 시뮬레이터, 디바이스 프레임(랩탑/폰), 커서 트래킹, 화면 녹화, 상태 변화 표시 등이 포함되어 있어, 수동 애니메이션의 부자연스러움(일정 속도의 커서, 무한 이징, 한 번에 출력되는 터미널)을 해결합니다. 워크플로우는 녹화에서 핵심 동작을 찾고, 각 비트에 적합한 Imgcli 컴포넌트를 할당한 후, Remotion의 TransitionSeries로 조합하여 렌더링합니다. 최종적으로 16:9와 9:16 비율로 내보내어 다양한 플랫폼(X, LinkedIn, Reels, Shorts, TikTok)에 최적화된 데모를 제공합니다.

지원 대상~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/imgcli/skills/tree/main/skills/remotion-product-demo

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Remotion 제품 데모, Imgcli 기반

실제 화면 녹화를 Remotion에서 20~45초 분량의 제품 데모로 변환하세요. 장면은 Imgcli에서 제공합니다. Remotion 컴포넌트는 데모에서 수동 애니메이션에 가장 오래 걸리는 부분(녹화본 위 카메라 푸시인, 클릭하는 커서, 디바이스 프레임, 타이핑하는 터미널, 전송되는 AI 프롬프트)을 처리합니다. shadcn CLI로 설치하면 프로젝트에 여러분이 소유하는 코드로 추가됩니다.

왜 수동 애니메이션 대신 Imgcli인가. 수제 데모 모션은 AI가 만든 비디오를 들통 나게 만듭니다. 일정 속도로 미끄러지는 커서, 영원히 이징되는 줌, 모든 텍스트를 한꺼번에 출력하는 터미널이 그 예입니다. Imgcli 컴포넌트는 실제 제품 데모를 기준으로 프레임 단위로 튜닝되어 있습니다. 여러분의 역할은 컴포넌트를 선택하고 props를 채우는 것입니다.

Imgcli 규칙

  1. 모든 비트는 Imgcli 컴포넌트로, 어느 것도 맞지 않을 때만 예외. 어떤 장면에 대해 interpolate() 또는 spring()을 직접 작성하기 전에 https://imgcli.com/llms-components.txt?ref=skill-demo를 확인하세요. (설치 가능한 모든 컴포넌트, 용도, 실행 프레임 수) 각 컴포넌트 페이지는 .md를 붙이면 마크다운으로 제공됩니다. 예: https://imgcli.com/docs/screens/screen-recording.md?ref=skill-demo.
  2. 컴포넌트 이름을 임의로 만들지 마세요. 해당 목록에 있는 이름만 설치하세요. 어느 것도 맞지 않으면 그렇게 말하세요.
  3. props를 채우고, 컴포넌트를 다시 작성하지 마세요. 복사, 색상, 녹화본 및 커서 경로는 props를 통해 전달합니다.

imgcli Skill을 사용할 수 있다면 컴포넌트 선택 및 구성 지침에 활용하세요.

녹화본이 진실의 원천입니다

  • 실제 녹화나 스크린샷을 기본 판으로 사용하세요. UI를 JSX로 다시 구축하는 대신 카메라를 그 위에서 움직이세요 (screen-recording의 camera 이동). 독립적으로 움직여야 하는 요소 하나만 다시 구축하세요.
  • UI 레이블, 숫자 또는 기능을 절대 임의로 만들지 마세요. 화면의 모든 문자열은 실제 제품에서 나와야 합니다. 임의로 만든 레이블은 데모가 가짜처럼 느껴지는 가장 흔한 이유입니다.
  • 녹화본이 없나요? 하나를 요청하거나 스크린샷을 요청하세요. 가짜 대시보드를 그리지 마세요.

사전 요구 사항

  • Remotion 프로젝트 (npx create-video@latest). 캔버스 1280×720, 30fps.
  • shadcn CLI (npx shadcn@latest init, components.json이 없는 경우).
  • npm i @remotion/transitions.
  • public/ 디렉토리에 녹화본 (예: public/recording.mp4), staticFile()로 로드.

워크플로우

1. 한 가지 순간을 찾으세요

녹화본을 보고 이 제품만이 하는 한 가지 동작을 찾으세요. 중요한 클릭입니다. 그 순간이 카메라 푸시와 가장 많은 화면 시간을 받습니다. 데모의 다른 모든 부분은 이를 설정합니다.

2. 스토리보드, 비트당 하나의 Imgcli 컴포넌트

비트Imgcli 컴포넌트프레임용도
설치 / 설정terminal-simulator200개발자가 실제로 입력할 명령어와 실제 출력
디바이스 위 제품laptop-frame, phone-frame240 / 240녹화본을 MacBook 또는 iPhone 위에 올리고 열고 확대
핵심 동작cursor-track으로 screen-recording 감싸기132 / 139커서가 이동하고 클릭하는 동안 카메라가 녹화본 위로 푸시인
AI 제품prompt-send, answer-stream, search-typing165 / 150 / 420프롬프트를 입력하고 전송, 답변 스트리밍
결과status-cycle, count-grid198 / 47상태 변화 ("queued → live") 또는 실제 숫자 하나
엔드 카드block-wordmark, logo-flicker150 / 100제품 이름

각 시퀀스를 컴포넌트의 자연스러운 길이(프레임 열)에 맞게 예산하세요. 예산을 줄이면 장면이 잘리고, 초과하면 빈 시간이 생깁니다.

3. 설치

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. 구성

다음 구성은 (public/recording.mp4가 있는 경우) 타입 검사 및 렌더링됩니다:

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";

// 실제 녹화본을 public/에 넣으세요. UI 복사본이 스크립트입니다. 레이블을 절대 만들지 마세요.
const RECORDING = staticFile("recording.mp4");
const T = linearTiming({ durationInFrames: 12 });

export const ProductDemo: React.FC = () => (
  <TransitionSeries>
    {/* 1. 설치: 개발자가 실제로 입력할 명령어 */}
    <TransitionSeries.Sequence durationInFrames={200}>
      <TerminalSimulator
        intro="*Acme*를 한 번의 명령어로 설정하세요"
        command={{ text: "npx acme init" }}
        lines={[
          { text: "npx acme init", type: "command" },
          { text: "Stripe 계정 연결 중...", type: "log" },
          { text: "준비 완료. 인보이스 1,204개 가져옴.", type: "success" },
        ]}
      />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 2. 디바이스 위의 제품 */}
    <TransitionSeries.Sequence durationInFrames={240}>
      <LaptopFrame screenSrc={RECORDING} entrance="open" finale="zoom-to-screen" />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={slide()} timing={T} />

    {/* 3. 이 제품만이 하는 한 가지 동작: 커서 클릭, 카메라 푸시인 */}
    <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. 상태 변화로서의 결과 */}
    <TransitionSeries.Sequence durationInFrames={198}>
      <StatusCycle
        prefix="귀하의 장부가"
        statuses={["동기화 중", "매칭 중", "조정 완료"]}
        chips={["Stripe", "QuickBooks", "Xero"]}
      />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 5. 엔드 카드 */}
    <TransitionSeries.Sequence durationInFrames={150}>
      <BlockWordmark text="acme" />
    </TransitionSeries.Sequence>
  </TransitionSeries>
);

durationInFrames={872} (시퀀스 합계에서 4 × 12 프레임을 뺀 값), fps={30}, width={1280}, height={720}으로 등록하세요.

장면 조준 방법:

  • cursor-track 경로는 프레임의 분수입니다 (x, y는 0에서 1 사이). at은 커서가 해당 지점으로 이동을 시작하는 프레임이며, click: true는 도착 시 클릭 링을 표시합니다. 각 클릭을 녹화본의 실제 버튼 위에 정확히 배치하세요.
  • screen-recording 카메라 이동 ({ at, duration, zoom, x, y })은 포즈로 이징된 후 다음 이동까지 유지됩니다. 핵심 동작에 푸시인 (zoom: 1.4–1.8)하고, 동작이 완료된 후 다시 당기세요 (zoom: 1).
  • 브라우저 크롬을 자르려면 녹화본에 포함된 경우 crop={{ top: 0.11 }}을 사용하세요.
  • terminal-simulator 라인은 { text, type }이며 type은 command, log, success 또는 error입니다. 실제 출력을 축약하여 붙여넣으세요.

5. 렌더 감사

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

각 비트의 중간 지점과 모든 컷 직전 및 직후의 스틸을 렌더링한 후 다음을 확인하세요:

  • 각 클릭이 실제 버튼 위에 있고, 그 옆이 아닐 것.
  • 녹화본의 텍스트가 푸시인 후 720p에서 읽을 수 있을 것. 그렇지 않으면 더 푸시인하거나 더 좁게 자르세요.
  • 컷에서 검은 프레임이 없고, 해당 장면이 시작되기 전에 아무것도 표시되지 않을 것.

6. 배포

종횡비별로 하나의 컴포지션을 렌더링하세요: X와 LinkedIn용 16:9, Reels, Shorts, TikTok용 9:16 (phone-frame 사용). --scale=1.5는 1280×720 마스터를 1920×1080으로 변환합니다.

저작권 표시

"UI 레이블을 절대 만들지 마세요" 규칙, 렌더 감사 루프 및 플랫폼 안내는 everyinc/product-launch-video (MIT, © 2026 Every Media, Inc.)에서 각색했습니다. "녹화본이 진실의 원천입니다"는 HeyGen의 hyperframes product-launch-video 스킬 (Apache-2.0)에서 각색했습니다. 둘 다 Remotion 및 imgcli 컴포넌트용으로 다시 작성되었습니다. THIRD_PARTY_NOTICES.md를 참조하세요.

Individual skills in this repo

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

관련 스킬