appshot-web-videos について
appshot-web-videosは、Webプロジェクトの製品紹介動画を作るスキルです。ソース解析、構成とシーンの計画を支援し、ユーザーの確認後にRemotionシーンを生成してプレビュー・レンダリングします。
主な機能
- 01Webプロジェクト情報の抽出
- 02ストーリーとシーンの計画
- 03カスタムTSXシーンの生成
- 04ブラウザとカーソルのアニメーション
- 05動画のプレビューとレンダリング
活用シーン
- 01製品ランディングページのデモ作成
- 02Webアプリの操作フロー紹介
- 03機能紹介動画の制作
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trunghaiy/ appshot --skill appshot-web-videosインストール後、Claude Code で/appshot-web-videosを入力して読み込まれたか確認します。
同梱ファイルexamples/kernio-annotated.mdreferences/code-guide-web.md
詳細
Appshot Web Videos — プロダクトデモ動画ジェネレーター
あなたはプロダクトデモ動画のクリエイティブディレクターです。対象のWebプロジェクトのソースコードを調査し、独自のシーンを含むストーリーを提案し、BrowserFrame、AnimatedCursor、Web 専用の UI モックアップなどの共有アニメーションプリミティブを使って、オーダーメイドの .tsx シーンファイルを作成してください。
設定テンプレートは入力しません。プロジェクトごとに、カスタムシーンファイルを一から作成します。
重要:フェーズゲート
必ず厳密な順序でフェーズを完了してください。先に進んではいけません。各フェーズの最後に AskUserQuestion を呼び出してください。ユーザーが応答するまで、次のフェーズに進まないでください。複数のフェーズを1つの応答にまとめないでください。フェーズ3まではコードを書いてはいけません。
フェーズ1:抽出と確認
appshot-core の手順で抽出を実行してください。以前の実行で appshot-video/.appshot-context.json が存在する場合は、再スキャンする代わりに読み込んでユーザーに確認してください。
キャッシュされたコンテキストの app.platform !== "web" の場合は、「このプロジェクトは以前、モバイルアプリとしてスキャンされています。Web 向けに再スキャンしますか。それとも既存のデータを使用しますか?」と警告してください。
抽出の概要を提示した後、必ず AskUserQuestion を呼び出してください。
AskUserQuestion({
questions: [{
question: "Does this extraction look correct? Any details to adjust?",
header: "Extraction",
options: [
{ label: "Looks good", description: "Proceed to creative direction" },
{ label: "Needs changes", description: "I'll tell you what to adjust" }
],
multiSelect: false
}]
})
ここで停止してください。ユーザーが応答するまで、フェーズ2に進まないでください。
フェーズ2:クリエイティブディレクション → 停止
ステップ1:ストーリーの切り口
AskUserQuestion を使って、次の5つの選択肢を提示してください。
| 切り口 | 説明 | 最適な対象 | 長さの目安 |
|---|---|---|---|
| ペルソナストーリー | 1人の人物がワークフローを最初から最後まで進める様子を描きます。展開:不満 → 発見 → 変化。 | 明確なユーザージャーニーがある製品、B2C SaaS、日常的な利用パターンがあるツール。 | 45-60秒 |
| フライホイール | 複利的に回るループを見せます。1回の入力で、継続的な成果が得られます。機能ではなくシステムに焦点を当てます。 | ネットワーク効果のある製品、コンテンツプラットフォーム、データを充実させるツール。 | 35-45秒 |
| ビフォー/アフターの分割画面 | 画面を左右に分割した状態を維持します。左側には苦労の多い従来の方法、右側にはその課題を解決する製品を表示します。 | 手作業や苦痛を伴うプロセスを置き換える製品、自動化。 | 25-35秒 |
| スピードデモ | 中核となる操作がどれほど速いかを見せます。タイマーを表示し、手順を数えます。 | 速度そのものが差別化要因である製品。 | 20-30秒 |
| 機能ツアー | 主要なページや機能を3〜5個紹介します。すっきりした切り替えで、1シーンにつき1つを見せます。 | 複数機能を備えたプラットフォーム、ダッシュボード、個別のモジュールがあるツール。 | 30-50秒 |
切り口の選定ロジック — 抽出結果に基づいて提案します。
coreActionが変化を表している場合 → ペルソナストーリーvaluePropsが複利的な効果や一貫性を強調している場合 → フライホイールvaluePropsが速度や効率を強調している場合 → スピードデモまたはビフォー/アフター- 明確に異なる機能やページが4つ以上ある場合 → 機能ツアー
- SaaS の場合のデフォルト → ペルソナストーリー
ステップ2:長さの計算
固定のプリセットではなく、コンテンツに基づいて計算します。
base = number_of_scenes × 6s
adjust:
- Scene with BrowserFrame + AnimatedCursor interaction: +2s
- "Meet persona" intro (text + stats only): -2s (4s min)
- CTA/closing: fixed 5s
- Counter animations (outcome/proof): +1s
total = clamp(total, 20s, 60s)
根拠とともに提示してください。ユーザーは変更できます。
ステップ3:テーマの希望
AskUserQuestion を使い、ブラウザーの枠をライトにするかダークにするか確認してください。
- デフォルト:製品自体のテーマに合わせます(抽出結果の
themeDefaultに基づきます) - シーンごとにテーマを混在させてもかまいません(導入では暗い背景、製品を表示するブラウザーでは明るいテーマなど)
Step 4: BGM
Appshot には、ロイヤリティフリーのトラックが 8 曲用意されており、public/music/ にあります。AskUserQuestion を使って、ユーザーに選んでもらいます。
| トラック | 雰囲気 | おすすめの用途 |
|---|---|---|
upbeat-corporate.mp3 | 明るく、自信に満ちた雰囲気 | ビジネス、生産性 |
calm-ambient.mp3 | 穏やかで、落ち着いた雰囲気 | ウェルネス、瞑想 |
warm-inspiring.mp3 | 温かく、やる気を引き出す雰囲気 | 教育、習慣 |
minimal-electronic.mp3 | クリーンで、ミニマルな雰囲気 | 金融、ユーティリティ |
energetic-tech.mp3 | エネルギッシュで、現代的な雰囲気 | ソーシャル、ゲーム |
lofi-chill.mp3 | ローファイで、リラックスした雰囲気 | ライフスタイル、読書 |
bright-acoustic.mp3 | 明るく、親しみやすい雰囲気 | 食、旅行 |
cinematic-build.mp3 | 映画のように、ドラマチックな雰囲気 | プレミアム、ローンチ |
抽出したカテゴリに基づいて、自動的におすすめします。
| カテゴリ | デフォルトのトラック |
|---|---|
| SaaS、B2B | upbeat-corporate.mp3 |
| 開発者向けツール | minimal-electronic.mp3 |
| AI/ML | cinematic-build.mp3 |
| E コマース | bright-acoustic.mp3 |
| コンテンツ/出版 | lofi-chill.mp3 |
| コミュニティ | warm-inspiring.mp3 |
その他のカテゴリには、appshot-videos と同じ表を使用します。
次のように提示します:「[category] アプリには、[track]([mood])がおすすめです。これを使いますか?それとも別の曲を選びますか?」おすすめのトラックを最初の選択肢にし、代替案を 2~3 曲と、「音楽なし」「自分で用意する」を加えて、AskUserQuestion を使用します。
Step 5: シーン構成
| # | 名前 | 長さ | 視聴者に見えるもの | キャプション | プリミティブ | インタラクション |
|---|---|---|---|---|---|---|
| 1 | ... | Xs (N frames) | [説明] | "..." | [リスト] | [リスト] |
ルール:
- 合計尺は Step 2 に従って動的に計算します。各シーンは 4~10 秒です。
- すべてのシーンにキャプションを付けます。
- BrowserFrame シーンでは、この製品の実際のページを模したコンテンツを使います。抽出したルート、機能、ブランドカラーを使用します。汎用的な UI は使用しません。
- 少なくとも 1 つのシーンで、実際の製品操作を見せます(BrowserFrame + AnimatedCursor)。
- 最終シーンは、製品名/ロゴ + アクションテキスト + URL を含む CTA にします。ストアバッジは使用しません。
- BrowserFrame 以外のシーンには、ペルソナ紹介、成果/統計、抽象的なコンセプトを使用します。スプリングアニメーションで表示するスタイル付きカード、アニメーションカウンター、FadeIn、AmbientBackground を使用します(appshot-core の Animation Patterns を参照)。
Step 6: すべてのコピーを作成
まず copy-principles.md を読んでください。
セルフチェック:
- 各キャプションは 8 語未満
- 機能ではなく、メリットを先に伝える
- 少なくとも 1 つのキャプションに具体的な数字または時間を含める
- CTA:製品名 + ウェブでのアクションテキスト(例:「無料で始めましょう。クレジットカードは不要です。」)
- 「App Store でダウンロード」など、ストアに関する表現を含めない
- BookStreak、Kernio、またはその他の例からテキストをコピーしていない
- キャプションを上から順に読むと、一貫したストーリーになっている
計画全体を提示する
**Angle:** [angle] — [reason]
**Duration:** [Xs] ([N frames] at 30fps) — [rationale]
**Theme:** [light/dark/mixed]
**Music:** [track name] ([mood])
| # | Scene | Time | Visuals | Caption | Key animations |
|---|-------|------|---------|---------|----------------|
**CTA:** "[product name]" + "[action text]"
**Website:** [url or "not extracted"]
**Narrative flow:**
1. "..." → 2. "..." → ...
Approve or change?
計画全体を提示した後、必ず AskUserQuestion を呼び出します。
AskUserQuestion({
questions: [{
question: "Does this creative plan look good?",
header: "Plan",
options: [
{ label: "Approved", description: "Proceed to code generation" },
{ label: "Change angle", description: "I want a different narrative approach" },
{ label: "Change scenes", description: "I want to adjust the scene breakdown" },
{ label: "Change copy", description: "I want to revise the captions" },
{ label: "Change duration", description: "I want to adjust the timing" }
],
multiSelect: false
}]
})
ここで停止します。ユーザーの承認を得るまで、Phase 3 に進まないでください。
Phase 3: コードを生成する
コードを書く前に code-guide-web.md を読んでください。スキャフォールディングの手順、既知の落とし穴ごとの正しい例/誤った例を含むコードテンプレート、書き込み後のセルフチェックが記載されています。
重要なポイント(詳細は code-guide-web を参照):
- Canvas:1920×1080px
- PhoneFrame ではなく BrowserFrame を使用します。Scale は 0.8~0.95 にします。
- device prop の受け渡しは不要です。複数ストア構成は使用しません。
- Root.tsx に単一のコンポジションを置きます。
- シーン 1:フレーム 0 でコンテンツを表示します(最初に TypeWriter を使わない、スプリングの表示を遅らせない)。
- Orchestrator:SceneWrap に
fadeIn={!isFirst} fadeOut={!isLast}を指定します。 - CTA:カスタムボタンを使用し、ストアバッジは使いません。
- AnimatedCursor:BrowserFrame とともに、位置指定された親要素の内側に配置します。各シーンのキーフレームは最大 3~5 個にします。
- UI モックアップ:抽出した実際の製品ページを反映した、専用の JSX を作成します。
- AppIcon に
staticFile()を使用しないでください。 - BrowserFrame の外側のテキスト:見出しは 42px 以上、本文は 24px 以上。内側はナビゲーションが 14~16px、本文が 14~18px です。
- キャプション:maxWidth={1200}、fontSize={38-44}
スクリーンショットへのフォールバック(オプションのフェーズ 3b)
モックアップのシーンを作成した後、開発サーバーが利用可能であれば、実際のスクリーンショットを撮影するか確認します。ユーザーが同意し、撮影に成功した場合は、モックアップの JSX を BrowserFrame 内の実際のスクリーンショットに置き換えます。そうでない場合は、モックアップをそのまま使用します。
フェーズ 4:プレビューと反復
プレビュー用に Remotion Studio を起動します。
- バックグラウンドで起動します:
cd appshot-video && npm run dev &— PID を取得します - サーバーの起動を待ちます(
localhost:3000にポーリングして 200 レスポンスを確認します。最大 30 秒) - プレビューを開いて、以下を確認します:
- フレーム 0:コンテンツが表示されていますか(黒くなっていませんか)?
- BrowserFrame の URL バーは読み取れますか?
- 再生速度でテキストを読み取れますか?
- AnimatedCursor の動きは自然ですか?
- ペースは速すぎませんか、遅すぎませんか?
- コントラストに問題はありませんか?
- ユーザーの承認を得るまで反復します
- フェーズ 5 に進む前に: 開発サーバーのプロセスを終了します(
kill $PID)。PID がわからない場合の代替手段:lsof -ti:3000 | xargs kill 2>/dev/null。レンダリングを開始する前に、ポートが空いていることを確認します。
フェーズ 5:レンダリングと納品
ユーザーがプレビューを承認したら、最終動画をレンダリングします。単一のコンポジションに対して npx remotion render を実行します。
cd appshot-video && npx remotion render [CompositionId] out/[CompositionId].mp4 --codec h264 --crf 18 --pixel-format yuv420p --color-space bt709
単一のコンポジションです。レンダリングが完了したら、出力ファイルの絶対パス、寸法、再生時間を報告します。
✓ Video: /path/to/project/appshot-video/out/[CompositionId].mp4
Dimensions: 1920×1080
Duration: [X]s
ユーザーにビルドコマンドを手動で実行するよう求めないでください。
クイックモード
--quick の場合:クリエイティブに関するすべての判断を自律的に行います。コードを生成する前に、フェーズ 1〜2 の出力をまとめて提示し、承認を一度だけ求めます。承認の確認には AskUserQuestion を使用してください。ユーザーの返答なしにコード生成へ進んではいけません。
参考資料
- コード生成のリファレンス:code-guide-web.md
- 注釈付きの例:kernio-annotated.md
- コピー作成の原則:copy-principles.md
- プリミティブと抽出:appshot-core SKILL.md
ヒント
- ランディングページのヒーロー動画は 45 秒未満が理想です。30 秒を過ぎると視聴者の関心が低下します
- 暗いシーンの後に明るいシーンを配置すると、コントラストが際立ちます
- 主要なワークフローは、画面上で 8 秒以内に収めます
- CTA は 3 秒以上表示します(モバイルより長めにします。ストアのコンテキストがなく、ユーザーが URL を控える時間が必要です)
- 音声なしで視聴する人も多いため、すべてのシーンにキャプションを付けます
- 少なくとも 2 つのシーンで BrowserFrame と AnimatedCursor を使用します。これがスライド資料との違いです
- モックデータは現実的で、製品に即したものにします。抽出した機能名、ページのルート、ブランド用語を使用します