Community코딩 & 개발github.com

JZnebel/AutoDemo

자동 데모 비디오 파이프라인 - 웹 앱 탐색, 녹화, 내레이션, 렌더링을 단일 명령으로 처리합니다.

AutoDemo란 무엇인가요?

AutoDemo는 웹 애플리케이션의 데모 비디오를 자동으로 생성하는 AI 에이전트 스킬입니다. URL 하나로 앱 탐색, 화면 녹화, 내레이션 작성, 비디오 렌더링까지 전체 파이프라인을 자동화합니다. Claude Code, Cursor, Codex와 같은 AI 코딩 도구에서 실행되며, `--brief` 인자로 데모 범위를 자연어로 지정할 수 있습니다. 또한 로그인 자격 증명 처리, 브랜드 색상 및 로고 자동 추출, 사용자 정의 Remotion 비디오 구성을 지원하여 전문적인 프로덕션 데모를 제작합니다. 자동 세그먼트 분할, 배경 음악, 자막, 커서 애니메이션 등이 내장되어 있어 기술적인 설정 없이도 고품질 데모를 빠르게 만들 수 있습니다.

지원 대상~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/JZnebel/AutoDemo/tree/main/.claude/skills/demo

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

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

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

문서

/demo — 자동 데모 비디오 파이프라인

웹 애플리케이션의 내레이션이 포함된 데모 비디오를 제작합니다. 탐색, 녹화, 내레이션, 렌더링 전체 흐름이 단일 명령으로 처리됩니다.

인자

$ARGUMENTS에서 파싱:

  • 첫 번째 위치 인자: 데모할 URL (필수)
  • --login <credentials>: email:password 형식의 로그인 자격 증명. 제공되면 녹화 전에 로그인합니다.
  • --brief <"보여줄 내용">: 데모가 다룰 내용을 자연어로 설명. 매우 짧아도 됩니다 — "대시보드 보여주고 프로젝트 생성" 정도면 충분합니다. 생략하면 자유롭게 탐색합니다.
  • --name <name>: 출력 이름 (기본값: URL 호스트명에서 파생)
  • --duration <seconds>: 대상 비디오 길이 (기본값: 60)
  • --voice <voice>: TTS 음성 (기본값: en-US-GuyNeural)
  • --preset <draft|production>: 품질 프리셋 (기본값: draft)

인자는 URL 뒤에 자연어로도 전달할 수 있습니다. 다음은 모두 동일합니다:

/demo https://app.com --login [email protected]:pass123 --brief "결제 페이지 보여주고 결제 방법 추가"
/demo https://app.com — [email protected] / pass123로 로그인, 결제 보여주고 결제 방법 추가
/demo https://app.com login: [email protected] pass123. 결제 페이지 보여줘.

파싱 가능한 만큼 처리합니다. 사용자가 평문 영어로 자격 증명과 지침을 제공하면 그대로 사용합니다.

파이프라인

1단계: 앱 정찰

녹화 전에 작업할 내용을 이해합니다:

  1. new_page 또는 navigate_page를 통해 URL 열기
  2. 자격 증명이 제공된 경우 (--login), 로그인 양식을 찾아 먼저 로그인합니다. /login, /sign-in, "Sign In" 링크 등 일반적인 패턴을 찾습니다. 이메일/비밀번호 필드에 fill을 사용한 후 제출을 클릭합니다. 계속 진행하기 전에 대시보드/홈 페이지가 로드될 때까지 기다립니다.
  3. 스크린샷과 스냅샷을 찍어 앱 이해하기
  4. 브랜드 캡처: 앱의 로고와 강조/브랜드 색상을 식별합니다.
    • 로고 이미지를 출력 디렉토리(2단계에서 확인)에 logo.png(또는 .svg/.webp)로 다운로드합니다. 정찰 중에는 임시 위치에 저장한 후 고유 이름이 확인되면 최종 출력 디렉토리로 이동합니다. evaluate_script를 사용하여 로고 <img> src URL을 찾은 후 Bash curl 또는 wget으로 저장합니다. 파이프라인이 자동으로 감지하여 인트로 카드에 사용합니다.
    • 앱의 기본 버튼/브랜드 색상에서 강조 색상을 선택하여 narration.json의 accentColor(rgba 형식)로 사용합니다.
  5. 브리프가 제공된 경우 (--brief), 이를 탐색 가이드로 사용합니다. 브리프는 사용자가 중요하게 생각하는 내용을 알려줍니다 — 해당 기능을 우선시합니다. 브리프가 없으면 자유롭게 탐색합니다.
  6. 주요 기능, 내비게이션, 흥미로운 흐름 식별
  7. ~duration초 내레이션에 맞춰 앱을 보여줄 3-6개의 데모 세그먼트 계획

매력적인 데모를 만드는 방법:

  • 브리프가 있으면 따르세요 — 사용자가 보여주고 싶어하는 것을 알고 있습니다
  • 가장 시각적으로 인상적이거나 독특한 기능으로 시작하세요
  • 깊이보다는 폭을 보여주세요 (다른 섹션 탐색, 한 양식에 집착하지 마세요)
  • 모든 것을 종합하는 내용으로 마무리하세요 (대시보드, 설정, 결과)
  • 녹화에서 로그인 화면, 로딩 스피너, 오류 상태는 건너뛰고 screencast_start 전에 설정에서 처리하세요

2단계: 녹화

출력 디렉토리 설정 후 녹화 시작:

출력 디렉토리: screencast-output/<name>/
녹화 파일: screencast-output/<name>/recording.mp4
  1. 고유한 출력 디렉토리 선택. 디렉토리를 생성하기 전에 screencast-output/<name>/이 이미 존재하는지 확인합니다. 존재하면 증가하는 접미사를 추가합니다: <name>-v2, <name>-v3 등. 사용 가능한 첫 번째 이름을 사용하세요. 예:
    # 확인 후 다음 사용 가능한 이름 찾기
    NAME="trafficstores"
    DIR="screencast-output/$NAME"
    if [ -d "$DIR" ]; then
      V=2; while [ -d "screencast-output/${NAME}-v${V}" ]; do V=$((V+1)); done
      NAME="${NAME}-v${V}"
      DIR="screencast-output/$NAME"
    fi
    mkdir -p "$DIR"
    
    이번 실행의 모든 후속 경로(녹화, narration.json, 구성, 렌더 출력 등)에 확인된 <name>(필요시 접미사 포함)을 사용합니다.
  2. 출력 디렉토리 생성
  3. screencast_start 호출, 경로는 screencast-output/<name>/recording.mp4
  4. 앱과 자연스럽게 상호작용 — 계획한 기능을 클릭하며 진행
    • 각 중요한 화면에서 잠시 멈춤 (1-2초) 시청자가 읽을 수 있도록
    • 버튼 클릭, 실제 데이터로 양식 작성, 섹션 간 이동
    • MCP 포크가 커서 애니메이션과 자동 세그먼트화를 자동으로 처리
  5. 완료되면 screencast_stop 호출

녹화 팁:

  • 서두르지 마세요 — 파이프라인이 지루한 부분을 자동으로 빠르게 처리합니다
  • 시각적으로 흥미로운 화면에서 멈추세요 (파이프라인이 내레이션 속도에 맞춰 느리게 처리합니다)
  • 교차 출처 iframe 내에서 스크롤하지 말고 직접 이동하세요
  • 로딩에 오래 걸리면 자동 세그먼터가 대기 시간을 잘라냅니다

3단계: 내레이션 작성

방금 녹화한 내용을 바탕으로 screencast-output/<name>/narration.json을 작성합니다. 방금 수행한 작업을 정확히 알고 있기 때문입니다.

{
  "introTagline": "짧고 강력한 헤드라인",
  "introSubtitle": "제품 또는 회사 이름",
  "outroHeading": "행동 유도 질문",
  "outroUrl": "website.com",
  "outroCtaText": "시작하기",
  "accentColor": "rgba(59, 130, 246, 1)",
  "captionStyle": "pop",
  "voice": "en-US-AndrewNeural",
  "introLogoSrc": "screencast-output/<name>/logo.png",
  "segments": [
    {
      "text": "이 세그먼트의 내레이션. 사람이 발표하는 것처럼 대화체로 작성하세요.",
      "sceneIndex": 0,
      "sceneLabel": "기능 이름"
    }
  ],
  "fullText": "모든 세그먼트 텍스트를 공백으로 연결."
}

내레이션 가이드라인:

  • 문서를 읽는 듯한 말투가 아닌, 옆에서 설명하는 듯한 대화체로 작성하세요
  • 현재 시제 사용: "여기서 볼 수 있듯이..." ("여기서 보았듯이" 아님)
  • 시청자가 주목해야 할 특정 UI 요소를 언급하세요
  • 전체 내레이션을 --duration 목표 시간에 맞추세요
  • 각 세그먼트는 5-20초 분량(~15-50단어)이 적절합니다
  • accentColor는 앱의 브랜드 색상과 일치해야 합니다 (본 내용에서 선택)
  • 각 세그먼트의 sceneLabel은 비디오 하단에 애니메이션으로 표시됩니다 — 짧게 유지하세요 (최대 2-3단어): "회원가입", "AI 빌더", "라이브 웹사이트"
  • introLogoSrc를 1단계에서 다운로드한 로고 파일로 설정하세요 — 인트로 카드에서 스프링 애니메이션과 함께 표시됩니다
  • captionStyle을 앱 분위기에 맞게 설정하세요: "pop" (통통 튀는, 장난기 있는), "clean" (프로스트 유리, 우아한), "bold" (크고 강력한), "minimal" (미묘한), "karaoke" (배경 없음), "outline" (글로우 그림자)
  • 앱 톤에 맞는 voice를 선택하세요:
    • en-US-AndrewNeural — 따뜻하고 자신감 있는 (좋은 기본값)
    • en-US-BrianNeural — 친근하고 캐주얼한 (스타트업, 친근한 앱)
    • en-US-ChristopherNeural — 신뢰할 수 있고 권위 있는 (엔터프라이즈, 핀테크)
    • en-US-AriaNeural — 긍정적이고 자신감 있는 (마케팅, 소비자 앱)
    • en-US-EmmaNeural — 명랑하고 명확한 (전자상거래, 소셜)
    • en-US-AvaNeural — 표현력 있고 다정한 (건강, 웰니스, 커뮤니티)
    • en-US-JennyNeural — 친근하고 배려심 있는 (교육, 지원)
    • en-US-EricNeural — 합리적인 (분석, 데이터 도구)
    • en-US-GuyNeural — 열정적인 (창의적 도구, 미디어)
    • en-GB-RyanNeural / en-GB-SoniaNeural — 영국식 (국제적, 고급스러운)

3.5단계: 사용자 정의 비디오 구성 설계

이 특정 비디오를 위한 사용자 정의 Remotion 구성을 작성합니다. screencast-output/<name>/composition.tsx로 저장합니다. 파이프라인이 기본 MarketingDemo 템플릿 대신 이를 사용합니다.

먼저 Remotion 스킬을 로드하세요: demo-render/.agents/skills/remotion-best-practices/rules/의 규칙을 읽으세요 — 특히 animations.md, timing.md, text-animations.md, transitions.md, sequencing.md.

구성은 다음을 충족해야 합니다:

  1. VideoComposition (React 컴포넌트)과 calculateMarketingDemoDuration (기간 함수) 내보내기
  2. MarketingDemoProps 타입 내보내기 (./MarketingDemo에서 다시 내보내기)
  3. MarketingDemo와 동일한 props 받기 — 파이프라인이 동일한 JSON을 전달합니다

사용 가능한 빌딩 블록 (./components/에서 가져오기):

  • DeviceMockup — 브라우저 크롬 내 화면 녹화 (videoSrc, accentColor, displayUrl, zoomRegions, layout)
  • IntroCard / OutroCard — 기본 인트로/아웃트로 템플릿 (tagline, subtitle, accentColor, logoSrc)
  • WordHighlightCaptions — 단어별 자막 (wordTimings, style, accentColor)
  • LowerThird — 장면 레이블 오버레이 (label, accentColor, leftOffset)
  • ProgressBar — 진행 표시기 (accentColor)
  • AudioWaveform — 오디오 반응 시각화 (variant, accentColor, samples)
  • FeatureCallout — 주석 콜아웃 (label, side, y, accentColor)
  • ChapterCard — 장 구분 카드 (chapterNumber, title, accentColor)
  • Presenter — 립싱크가 있는 2D 캐릭터 (mouthCues, side)
  • AvatarPip — 아바타 PIP (화면 속 화면)
  • SceneBreak — 장면 경계의 짧은 시각적 전환

구성 파일 내에서 사용자 정의 컴포넌트를 인라인으로 작성할 수도 있습니다.

비디오별 설계 결정 사항:

  • 인트로 스타일: 사용자 정의 인트로를 작성하거나 IntroCard를 사용하세요. 앱의 성격에 맞추세요 — 자연스러운/유기적, 기술적/깔끔한, 따뜻한/초대하는, 대담한/강력한.
  • 아웃트로 스타일: 사용자 정의 아웃트로를 작성하거나 OutroCard를 사용하세요. 동일한 성격 매칭.
  • 포함할 오버레이: 모든 비디오에 모든 오버레이가 필요하지는 않습니다. 깔끔한 SaaS 데모에서는 AudioWaveform을 건너뛰세요. 짧은 비디오에서는 ProgressBar를 건너뛰세요. 세그먼트가 명확하면 LowerThird를 건너뛰세요.
  • 오버레이 위치: LowerThird가 항상 왼쪽 상단일 필요는 없습니다. 자막이 항상 하단 중앙일 필요는 없습니다. 녹화에서 중요한 UI 요소와 겹치지 않는 위치를 선택하세요.
  • 애니메이션 다양성: 항상 동일한 스프링 인 효과를 사용하지 마세요. 페이드, 슬라이드, 와이프, 타자기, 스태거를 혼합하세요. Remotion 스킬에서 패턴을 보여줍니다.
  • 인트로 → 콘텐츠 → 아웃트로 전환: 페이드, 슬라이드, 와이프, 또는 라이트 릭. 상황에 맞게 선택하세요.

composition.tsx 템플릿 리터럴 예시:

import React from "react";
import { AbsoluteFill, Audio, Sequence, interpolate, staticFile } from "remotion";
import { TransitionSeries, linearTiming } from "@remotion/transitions";
import { fade } from "@remotion/transitions/fade";
// 빌딩 블록 가져오기
import { DeviceMockup } from "./components/DeviceMockup";
import { WordHighlightCaptions } from "./components/WordHighlightCaptions";
import { ProgressBar } from "./components/ProgressBar";
// 사용자 정의 인트로/아웃트로 가져오기 (인라인 또는 별도 컴포넌트로 작성)
// 타입 가져오기
import type { MarketingDemoProps } from "./MarketingDemo";
export type { MarketingDemoProps };

export function calculateMarketingDemoDuration(props: MarketingDemoProps) {
  return props.introDurationFrames + props.videoDurationFrames + props.outroDurationFrames - 20;
}

// 사용자 정의 인트로 컴포넌트 (인라인)
const MyIntro: React.FC<{...}> = (...) => { ... };

export const VideoComposition: React.FC<MarketingDemoProps> = (props) => {
  // 여기에 고유한 구성 레이아웃
};

준수해야 할 Remotion 규칙:

  • 모든 애니메이션은 useCurrentFrame()으로 구동 — CSS 전환 사용 금지

관련 스킬