Communitygithub.com

プロダクトデモディレクター

ソフトウェアUIの画面上での表現を演出します。カーソルの動き、ズーム/パン/コールアウト、画面録画と再現UIの使い分け、ハイライトやフォーカスプル、スローダウンによる状態変化の明確化を行います。プロダクトデモ、機能ウォークスルー、オンボーディング動画、リリースリールの撮影や再現に使用します。

プロダクトデモディレクター とは?

プロダクトデモディレクターは、ソフトウェアマーケティングで最も難しいショット、つまり実際のUIが実際の動作を行う様子を、初見の視聴者がすぐに理解できる形で撮影するスキルです。デフォルトの失敗は、人間の速度でそのまま画面録画したもの、つまりカーソルがテレポートし、複数の変化が同時に発生し、視聴者がどこを見ればよいかわからない状態です。あなたの仕事は、注意を振り付けることです。一度に一つの変化、カメラはそれを捉え、読み取れるだけの時間保持します。このスキルは、以下のプラットフォームで動作します:Claude Code, Cursor, Codex, その他のAIエージェント。ワークフローは、ステップ1で画面録画とUI再作成のどちらかを決定し、ステップ2でビートごとの状態変化を一つに絞り込み、ステップ3でカーソルの動きを演技として振り付け、ステップ4でカメラ(ズーム、パン、コールアウト)を指示、ステップ5で状態変化を明確にし、ステップ6でショットリストをリントしてハンドオフします。品質基準は厳格で、レコード対リクリエイトの判断を文書化し、ビートあたりの変更を一つにし、クリックには可視的なアフォーダンスを付け、カメラは変化の前に要素をフレームに収め、すべての状態変化に少なくとも一つの可読性処理を施すことを要求します。組み込みのリンターが視認性の失敗を検出します。

対応~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/SkillMedev/tutorial-video-studio/tree/main/skills/product-demo-director

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

プロダクトデモディレクター は何をしますか?

あなたは、ソフトウェアマーケティングで最も難しいショット、つまり実際のUIが実際の動作を行う様子を、初見の視聴者が一度見て理解できる形で撮影します。デフォルトの失敗は、人間の速度でそのまま画面録画したものです。カーソルがテレポートし、三つのことが同時に変化し、視聴者はどこを見ればよいかわかりません。あなたの仕事は、注意を振り付けることです。一度に一つの変化、カメラはそれを捉え、読み取れるだけの時間保持します。

これはテイストレイヤーです。モノがどのように動くか(イージングカーブ、アンティシペーション、12の原則)の文法はmotion-design-principlesに、ビートリストはvideo-storyboardに、文字のアニメーションはkinetic-typographyにあります。あなたはカメラとカーソルがUI上で何をするかを決定し、その結果をこれらのスキルとビルドパック(remotion-compose、remotion-render)に渡します。

一つの例を通して作業します。12秒のクリップで、ユーザーが設定ダッシュボードで機能フラグをオンにし、メトリックタイルが光る様子を示します。

ワークフロー

これらの順番で実行します。記録と再構築のどちらかを決める前に、カーソルの振り付けを始めないでください。その決定は後続のすべてを変えます。

ステップ1 - 決定する:画面録画するかUIを再作成するか

これが分岐点です。他の作業の前に選択してください。

  • 画面録画:UIが実際のもので安定しており、デモの信頼性が「これが実際の製品です」に依存する場合。最も速くキャプチャできますが、制御を犠牲にします。ぎこちないカーソル、遅いネットワークスピナー、実際の顧客データ、ズームでアンチエイリアスがひどくかかるフォントは修正できません。最終解像度の2倍で録画すると、画質を落とさずに拡大する余地が生まれます。
  • UIを再作成する(関連する画面をコンポーネントとして再構築):クリーンなカーソルパス、決定論的なタイミング、偽物だが正直なデータ、まだ存在しない部分的な製品状態、ピクセルパーフェクトなズームが必要な場合。作業は増えますが、完全に制御できます。これはremotion-composeに渡すパスで、各画面がコンポーネントになり、カーソルがアニメーション化されたレイヤーになります。
  • ハイブリッド(一般的で過小評価されています):画面録画でテクスチャ(実際のスクロール、アプリ内で再生される実際のビデオ)をキャプチャし、その上に再作成したコールアウト、カーソル、ハイライトを合成して、振り付けを自動作成します。製品は実在するが、生の録画が演出するには乱雑すぎる場合に使用します。

決定を理由とともに書き留めてください。詳細なトレードオフ表については、references/record-vs-recreateを参照してください。

ステップ2 - ビートごとに一つの変更に減らす

デモが判読可能であるためには、一度に正確に一つのことだけが変化し、視聴者がその瞬間にそれを見ている必要があります。フロー内のすべての状態変化をリストアップします(フォーカスが移動する、フィールドが埋まる、トグルが切り替わる、タイルが更新される、トーストが表示される)。同じフレームで二つ発生する場合は、時間的に分離するか、一方を従属させる(暗くする、ズームの外に押し出す)必要があります。「フラグをオンにする」は一つのビートではありません。カーソルがトグルに到着 → トグルが切り替わる → メトリックタイルが再計算 → 確認トースト。四つのビート、四つの保持された読み取り。

ステップ3 - カーソルを振り付ける

カーソルはナレーターです。マウスのログではなく、俳優のように扱ってください。

  1. 意図を持って動かし、わずかに弧を描く。 テレポートさせず、ジッターを発生させないでください。カーソルは静止状態から加速し、ターゲットに減速しながら入ります(イーズインアウト。motion-design-principlesからカーブを借用してください)。かすかな弧は、定規のように真っ直ぐな線よりも意図的に見えます。
  2. 動作の前に落ち着く。 到着し、約6〜10フレーム一時停止してからクリックします。この一時停止は、「これからこれを行います」というビートで、目に必要です。
  3. クリックを見せる。 実際のクリックは見えません。可視的なアフォーダンスを追加します。カーソルのすばやい縮小/拡大、クリックポイントでの放射状のリップル、ターゲットの短い押下状態。これらのうち一つだけにしてください。
  4. 一つのカーソル、一つのパス。 フローでカーソルが二つの場所に必要な場合は、カットします。フレームを横切ってカーソルを動かさないでください。ハードカットは4フレームのダッシュよりもすっきりと読めます。
  5. カーソルが主役でないときは引退させる。 タイルが更新中でカーソルがただ置かれているだけのときは、フェードアウトするか、ズームの外に移動させてください。主役と競合する静的なカーソルは、注意を分割します。

ステップ4 - カメラを指示する:ズーム、パン、コールアウト

フレームはUI上のカメラです。一貫した動きの語彙を使用して、視聴者があなたの言語を学べるようにします。

  • 押し込む(ズーム):変更が発生する前に領域にコミットします。トグルが切り替わる前に到着します。押し込みは予告であり、変更は見返りです。
  • パン/トラック:一つのフレームに収めるには離れすぎている二つの領域間でカーソルを追従します。パンはゆっくりと、カーソルに動機付けられて行います。カメラは俳優を追います。
  • 引き出す(ズームアウト):詳細なビートの後にコンテキストを再確立し、次の領域の前に視聴者が再アンカーできるようにします。
  • コールアウト(ハイライトリング、ラベル、コネクターライン、他のすべてを暗くするスポットライト):言葉で名前を付けなければならないものを指し示します。UI要素が画面上にある場合は、ナレーションよりもコールアウトを優先してください。

ルール:カメラはすでに要素を見ている前に変化してください。トグルが切り替わり、その後ズームインすると、瞬間を逃しています。

ステップ5 - 状態変化を判読可能にする

デモ全体は状態変化のために存在します。それぞれに意図的な処理を施します。

  • 重要な変化で世界を遅くする。 ナビゲーションでは通常のペースを維持し、実際の切り替え/更新を実際の時間の約1.3〜1.6倍に引き伸ばして、目が原因→結果を登録できるようにします。その後、速度ランプで元に戻します。
  • 変化の前後デルタをハイライトする。 変化した要素をパルスさせます(グロー、短いカラーウォッシュ、スケールバンプ)。数値が変化する場合、値をハードカットするのではなくカウントアップします。動き自体がメッセージです。
  • フォーカスを引く。 メトリックタイルが更新されるとき、約10フレーム間、他のすべてを暗くするかぼかして、タイルが明確に主役になるようにし、その後空間を戻します。
  • 原因と結果を間のビートでシーケンスする。 トグルが切り替わる(保持)、その後タイルが更新される(保持)。同じフレームで発生すると、視聴者はトグルがタイルを引き起こしたことを認識できません。

ステップ6 - ショットリストをリントし、ハンドオフする

ビートリストに下記のリンターを実行して、古典的な判読性の失敗(重複する変更、欠落した保持、カーソルのテレポート、遅れて到着するカメラ)を検出します。すべてのフラグを修正してください。その後、指示されたショットリストを下流に渡します。タイミング/イージングの詳細はmotion-design-principlesへ、ビートの順序はvideo-storyboardへ、実際の実装(カーソルレイヤー、ズーム変換、コンポーネント画面)はビルド用のremotion-composeと反復ループ用のremotion-renderへ。

品質基準

以下のすべてが満たされた場合のみ、デモはA+です。

  • レコード対リクリエイトの決定が理由とともに文書化され、制作がそれを尊重している(「クリーン」な再構築に、ぎこちない生の録画が紛れ込んでいない)。
  • ビートごとに正確に一つの変更が主役であり、同時の変更は意図的に従属されており(暗くするかフレーム外)、偶発的ではない。
  • すべてのクリックに可視的なアフォーダンスがあり、カーソルは動作前に落ち着いている。テレポート、ジッター、ホイップパンはない。
  • カメラは各要素が変化する前にすでにフレームに収まっている。
  • すべての状態変化に少なくとも一つの可読性処理(スローダウン、ハイライト、フォーカスプル、カウントアップ)とその後の保持された読み取りがある。
  • ショットリストがリンターをゼロフラグで通過している。

やってはいけないこと

  • 生のリアルタイム画面録画をデモとして出荷しないでください。演出するか、それは単なる映像でありデモではありません。
  • 二つの状態変化を同じフレームに着地させないでください。視聴者は原因と結果を割り当てられません。
  • カーソルをテレポート、ジッター、ホイップパンさせないでください。二つの場所に必要なら、カットしてください。
  • 要素が変化した後にズームインしないでください。カメラが常に先に到着します。
  • コールアウトが画面上で指し示せるものをナレーションで説明しないでください。
  • ここで正確なイージングカーブやフレームごとのタイミングを指定しないでください。それはmotion-design-principlesの役割です。ビートの順序をゼロから書かないでください。それはvideo-storyboardの役割です。画面上の言葉をここでアニメーションさせないでください。それはkinetic-typographyの役割です。React/Remotionコードを書いたりレンダリングしたりしないでください。それはremotion-composeとremotion-renderの役割です。

リンター

自己完結型のNodeスクリプト。demo_lint.jsとして保存し、node demo_lint.jsで実行します。依存関係はありません。デモをビートの順序付きリストとして記述します。リンターは、ワークフローにある古典的な判読性の失敗をフラグします。デモに合わせてbeats配列を編集してください。

// プロダクトデモショットリストリンター。実行:node demo_lint.js
// 各ビートはタイムライン上の一瞬です。フィールド:
//   t          開始時間(秒、昇順)
//   dur        ビートが保持される時間(秒)
//   changes    このビートで発生するUI状態変化(0、1、またはそれ以上)
//   camera     'push' | 'pan' | 'pull' | 'hold' (このビートへのカメラ移動)
//   framedOn   ビート開始時にカメラが向けられている要素
//   cursorTo   このビートでカーソルが移動する場所(null = そのまま / 主役ではない)
//   click      このビートでクリックが発生するかどうか
//   clickAffordance  クリックが可視化されているかどうか(リップル/押下/スケール)
//   legibility 'slowdown' | 'highlight' | 'focuspull' | 'countup' | null
const beats = [
  { t: 0.0, dur: 1.2, changes: [],               camera: 'push', framedOn: 'settings-panel', cursorTo: 'toggle',     click: false, clickAffordance: false, legibility: null },
  { t: 1.2, dur: 0.5, changes: [],               camera: 'hold', framedOn: 'toggle',         cursorTo: null,         click: true,  clickAffordance: true,  legibility: null },
  { t: 1.7, dur: 1.0, changes: ['toggle-on'],    camera: 'hold', framedOn: 'toggle',         cursorTo: null,         click: false, clickAffordance: false, legibility: 'slowdown' },
  { t: 2.7, dur: 1.4, changes: ['tile-update'],  camera: 'pan',  framedOn: 'metric-tile',    cursorTo: null,         click: false, clickAffordance: false, legibility: 'countup' },
  { t: 4.1, dur: 0.8, changes: ['toast','badge'],camera: 'hold', framedOn: 'metric-tile',    cursorTo: 'export-btn', click: false, clickAffordance: false, legibility: null },
]

const HOLD_MIN = 0.4 // 状態変化はこれだけの時間が必要
const flags = []
for (let i = 0; i < beats.length; i++) {
  const b = beats[i]
  const id = `ビート ${i + 1} (t=${b.t}s)`
  // 1. ビートあたり一つの変更。
  if (b.changes.length > 1)
    flags.push(`${id}: 一度に${b.changes.length}個の変更(${b.changes.join(', ')}) - 一つ以外を分割または従属させる`)
  // 2. すべての変更に保持された読み取り時間が必要。
  if (b.changes.length === 1 && b.dur < HOLD_MIN)
    flags.push(`${id}: 変更「${b.changes[0]}」が${b.dur}sしか保持されていない - ${HOLD_MIN}s以上保持して読み取れるようにする`)
  // 3. すべての変更に可読性処理が必要。
  if (b.changes.length >= 1 && !b.legibility)
    flags.push(`${id}: 変更「${b.changes[0]}」に可読性処理がない(スローダウン/ハイライト/フォーカスプル/カウントアップ)`)
  // 4. クリックは可視化されなければならない。
  if (b.click && !b.clickAffordance)
    flags.push(`${id}: クリックに可視的なアフォーダンスがない - リップル/押下/スケールを追加する`)
  // 5. カメラは変更の前に要素をフレームに収める。変更ビート上では行わない。
  if (b.changes.length >= 1 && (b.camera === 'push' || b.camera === 'pan'))
    flags.push(`${id}: 変更と同じビートでカメラが移動(${b.camera})- まず到着し、その後変更する`)
  // 6. カーソルのテレポートがない:クリックビートでカーソルがちょうど到着した場合、落ち着く時間がない。
  if (b.click && b.cursorTo)
    flags.push(`${id}: 同じビートでカーソルが移動しクリックしている - クリック前に落ち着く(約6〜10フレーム)必要がある`)
}

if (flags.length === 0) console.log('合格 - ショットリストは判読可能です。')
else {
  console.log(`${flags.length}個のフラグ:`)
  for (const f of flags) console.log('  - ' + f)
}

動作例の出力

上記のビートでスクリプトは以下を出力します。

3個のフラグ:
  - ビート 4 (t=2.7s): 変更と同じビートでカメラが移動(pan)- まず到着し、その後変更する
  - ビート 5 (t=4.1s): 一度に2個の変更(toast, badge) - 一つ以外を分割または従属させる
  - ビート 5 (t=4.1s): 変更「toast」に可読性処理がない(スローダウン/ハイライト/フォーカスプル/カウントアップ)

解釈:トグルクリック(ビート2〜3)はクリーンです。カーソルが落ち着き、クリックにリップルがあり、切り替えがスローダウンされ保持されています。しかし、ビート4はメトリックタイルが更新中にパンしているため、カメラが見返りに遅れて到着します。ビート3の保持中にパンして、タイルが再計算される前にフレームに収まるように修正してください。ビート5は同時に二つの間違ったことを行っています。同じフレームでトーストとバッジを発火し、トーストに可読性処理がありません。バッジを従属させる(暗くするか、ズームの外に押し出す)ことでトーストを単一の主役にし、トーストにハイライトまたは保持を与えます。三つすべてを修正すると、リンターは合格します。

テンプレート:デモショットカード

以下をコピーし、FILLフィールドを埋め、結果をリンターに送り、その後関連スキルに渡します。

プロダクトデモショットカード。[FILL: 機能名] - [FILL: 長さ]秒

プロダクション判断
  録画 / 再作成 / ハイブリッド:[FILL]
  理由:[FILL: このパスの理由]
  キャプチャ解像度:[FILL: 録画の場合は最終の2倍]

クリップの主題(視聴者が得るべき一文)
  [FILL]

ビートシート(変更ごとに一行、カメラは変更前に到着)
  #  時間  カメラ  フレーム対象       カーソル          変更            可読性          保持
  1  [FILL] [push]  [FILL]           [FILLに移動]      -                -                [FILL]秒
  2  [FILL] [hold]  [FILL]           [落ち着く+クリック] -               -                [FILL]秒
  3  [FILL] [hold]  [FILL]           [停止/フェード]   [FILL: 切り替え]  [slowdown]        [FILL]秒
  4  [FILL] [pan]   [FILL]           [フレーム外]      [FILL: 効果]      [countup/glow]    [FILL]秒
  (行を追加、一行に二つの変更は不可)

コールアウト言語(クリップ全体で一貫させる)
  ハイライトスタイル:[FILL: リング / スポットライト暗転 / コネクター]
  クリックアフォーダンス:[FILL: リップル / 押下 / カーソルスケール]
  フォーカスプル処理:[FILL: 他を暗くする / 他をぼかす]

ハンドオフ
  イージング + タイミング詳細 -> motion-design-principles
  ビート順序 / ストーリーアーク -> video-storyboard
  画面上の言葉 -> kinetic-typography
  ハイライトの色と光 -> motion-color-and-light
  サウンドデザイン -> motion-sound

参照

このスキルは、方法(イージング、構成、タイポグラフィ、色、音)を他のスキルに委任しつつ、何をいつカメラとカーソルが行うかという演出上の決定に集中します。

Individual skills in this repo

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

Captions From Transcript

Produce an accurate, properly timed caption track (SRT or WebVTT) from a video

Kinetic Typography

Put text in motion the right way - title cards, animated captions, lower-thirds, callouts, and word-by-word reveals - with a reading-time-per-word budget so copy holds long enough to read, plus enter/exit timing, weight and size transitions, and type hierarchy in motion. Use when someone asks to

Motion Design Principles

The craft layer for motion: pick the right easing (ease-in / ease-out / ease-in-out / spring), get timing and spacing right, build the anticipation→action→follow-through arc, and apply Disney

Narration Script

Write the spoken voiceover for a tutorial or demo - the actual words, phrased for the ear and synced one-instruction-per-action to what is on screen, with a pacing budget and a confident, jargon-checked tone. Use when someone says

Remotion Compose

Turns a natural-language video brief into a complete, ready-to-preview Remotion composition - extracts duration, scenes, brand colors, aspect ratio, and real copy; plans the frame budget; and writes data-driven React/TypeScript using useCurrentFrame, interpolate, spring, AbsoluteFill, and Sequence, registered in Root.tsx. Use when someone says

Remotion Render

Renders a Remotion composition to MP4 and runs the edit-and-re-render loop - CLI render commands, 1080p/4K/9:16 presets, concurrency tuning, codec selection, batch variants from a JSON data file, and Lambda for cloud rendering. Use when someone says

Remotion Setup

Scaffolds a new Remotion video project wired for Claude Code Agent Skills - Node check, create-video scaffold, skills install, folder conventions, Google Fonts, and a smoke-test render. Use whenever someone wants to start making videos with Remotion and Claude, even just

Screencast Capture

Capture clean raw screen and camera footage for a tutorial or product demo - choosing the recorder (macOS Screenshot toolbar, QuickTime, OBS, Windows Game Bar), setting resolution / frame-rate / cursor / microphone, prepping a distraction-free stage, and recording in retakeable segments. Use when someone says

SkillMedev/tutorial-video-studio

Plan a product demo, feature announcement, or launch video as a beat sheet and shot list BEFORE animating - hook in the first 3s, problem, reveal, proof, CTA - with target duration and pacing per scene type, output as a JSON scene plan that remotion-compose consumes directly. Use when someone says

Social Video Formatter

Reframe and export a finished video for social platforms - 9:16 ↔ 16:9 cropping, burned-in captions, a platform-native first frame, loop design, and per-platform specs (aspect, length, safe areas) for TikTok, Reels, Shorts, X, and LinkedIn. Use when someone says

Sound and Music Sync

Score a video like an editor: beat-match cuts to the music, land SFX on transitions, pace the voiceover so it breathes, source royalty-free tracks safely, and duck the music so the VO sits clearly on top. Use when adding music, sound effects, or voiceover to a video, when asked to

関連スキル