Communitygithub.com

Varnan-Tech/opendirectory

コンテンツブリーフからモーショングラフィックス動画(MP4)を生成します。HTML/CSSアニメーションをPlaywright経由でヘッドレスChromiumにフレーム単位でレンダリングし、FFmpegで結合します。1080×1080がデフォルトで、16:9(1920×1080)と9:16(1080×1920)もサポート。5つのスタイルプリセット。ユーザーが「動画を作成」「モーショングラフィック」「アニメーション動画」「リールを作成」「解説動画」「アニメーションインフォグラフィック」「ショート動画」と言ったときに起動します。

opendirectory とは?

このスキルは、コンテンツブリーフをもとにマルチシーンのモーショングラフィックス動画(MP4)を自動生成する、高度なAIエージェント機能です。HTMLとCSSアニメーションをPlaywrightを使ってヘッドレスChromium上でレンダリングし、Web Animations APIのフレームシーク技術で各フレームをキャプチャ、FFmpegで1つのMP4ファイルに結合します。ReactやAI API、Pythonなどの外部依存関係は一切不要で、graphic-gifファミリーのツールのみで動作します。 主な特長は、純粋なJavaScript関数`window.renderFrame(t)`を用いた決定論的なアニメーション制御で、CSSの`@keyframes`に依存せず、Chromiumのバックワードシーク問題を回避します。デフォルトの解像度は1080×1080(1:1)で、16:9や9:16もサポート。`kinetic-dark`、`editorial-light`、`data-pulse`、`bold-type`、`minimal-clean`の5つのスタイルプリセットから選択可能です。各シーンはopacity遷移のみで滑らかに切り替わり、最大6シーン、シーンあたり1~8秒、24/30/60fpsに対応。生成後は自己QAチェックリストで品質を確認し、指定のディレクトリにHTMLソースとMP4を出力します。 このスキルは、開発者やコンテンツクリエイターがテキストのアイデアを即座にプロフェッショナルなモーショングラフィックス動画に変換するのに最適です。特に、SNSリール、解説動画、データビジュアライゼーション、ブランドプロモーションなど、短尺でインパクトのある動画を効率的に量産したい場合に威力を発揮します。シーン構成、タイミング、デザインを緻密にコントロールできるため、単なるテンプレートベースのツールを超えた柔軟性を提供します。

対応✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Varnan-Tech/opendirectory/tree/main/skills/vid-motion-graphics

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

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

ドキュメント

vid-motion-graphics

マルチシーンのモーショングラフィックスをMP4として生成します。HTML/CSSアニメーションをPlaywright経由でヘッドレスChromiumにレンダリングし(Web Animations APIのフレームシーク)、PNGフレームをFFmpegで結合します。React、AI API、Pythonは不要 — graphic-gifファミリー以外の新たな依存関係はゼロです。

CDNフォントのみ使用。HTML内に外部ライブラリは不要。


重要なルール(毎回の生成前に読むこと)

  1. window.renderFrame(t) を使用すること — シーン遷移にCSS @keyframes は使わない。 CSSアニメーションの currentTime シークは、Chromiumで後方シーク時に暗黙的に無視されます。renderFrameアプローチ:純粋なJS関数がミリ秒から直接 opacity/transform を計算します。Playwrightが1フレームごとに呼び出します。決定論的で、競合がありません。
  2. すべての要素に animation-delay を使用しないこと。 renderFrameでは不要です。もし animation-delay を書いている自分に気づいたら、やめてください — 間違ったアーキテクチャを使っています。
  3. window.__videoReady = true は document.fonts.ready.then(...) の内部でのみ設定すること。 同期的に設定してはいけません — Playwrightがフレーム1をキャプチャする前にフォントが読み込まれていないと、テキストがフォールバックフォントでレンダリングされます。
  4. window.__stopPreview() を公開すること。 ブラウザのrAFプレビューループがPlaywrightのevaluate/screenshot呼び出しと競合します。capture-frames.mjs がフレームループの前に __stopPreview() を呼び出します。必含めてください。
  5. シーン境界チェックでは t < startMs(<= ではない)を使用すること。 フレーム0で t <= 0 とするとシーン1が黒くなります。正しいガードは if (t < startMs || t >= endMs) return hidden です。
  6. Bodyは正確なピクセル寸法であること。 幅と高さは整数(1080px、1920px)です。%、vw/vh、レスポンシブ単位は使用しないでください。
  7. 同時に2つのシーンを表示しないこと(10%の入り重なりを除く)。 すべてのシーンはrenderFrameウィンドウの外で opacity: 0 になります。
  8. トランジションは opacity のみを使用すること。 display の切り替えや visibility は使用しないでください — GPUコンポジットされたopacityはフレームパーフェクトです。
  9. HTMLをチャットにダンプしないこと。 ファイルに保存し、サマリーのみを表示してください。
  10. タイトルはトピックではなくメッセージを述べること。 「Q4 2024 パフォーマンス動画」ではなく「Q4が目標を達成した3つの理由」のようにしてください。
  11. HTMLを生成する前に references/scene-library.md を読むこと。 そのファイルの正確なHTML構造とCSSクラス名を使用してください。

ステップ1:入力受け付け

必須: content_brief

オプションパラメータとデフォルト値:

パラメータデフォルト説明
content_brief—動画が伝える内容を説明するテキスト(必須)
scenesautoシーン数(1~6)。auto = ブリーフから自動決定。
duration_per_scene3sシーンあたりの秒数(1~8秒)
stylekinetic-darkkinetic-dark / editorial-light / data-pulse / bold-type / minimal-clean
aspect_ratio1:11:1(1080×1080)/ 16:9(1920×1080)/ 9:16(1080×1920)
fps301秒あたりのフレーム数(24、30、または60)
musicnone背景トラック用のオーディオファイルのパス(mp3/m4a/wav)
source—最終フレームのフッターに表示される帰属表示

content_brief が不足している場合、正確に次のように尋ねること:

「動画を作成するには、コンテンツブリーフが必要です — 動画で何を伝えたいですか?

例:「Q4の売上が85%成長した3つの理由を示す:新しいエンタープライズ案件、チャーン減少、価格引き上げ。太字の数字を使用。スタイル:data-pulse。」

オプション:スタイル(デフォルト:kinetic-dark)、アスペクト比(デフォルト:1:1)、シーンあたりの秒数(デフォルト:3秒)」

content_brief がある場合 → すぐにステップ2に進む。


ステップ2:内部アーキテクチャ(ユーザーには決して表示しない)

1. ブリーフをシーンに分割(最大6):

  • シーン1 = フックまたはタイトル(常に)
  • シーン2~N-1 = 補足ポイント、メトリクス、またはストーリービート
  • シーンN = CTAまたはクロージングサマリー(常に、シーンが1つより多い場合)
  • 各シーン1つのキーアイデア — ブリーフに7つ以上のアイデアがある場合、最も弱いものを統合する

2. references/scene-library.md を読む — 各シーンに適したシーンタイプを選択:

  • フック/オープニング → title-card
  • 単一メトリクス → stat-reveal
  • 2~4ポイントのリスト → bullet-list
  • ビフォーアフター / 2つの値 → split-screen
  • テスティモニアル / 引用 → quote-card
  • 最終 / CTA → cta-card

3. references/style-presets.md を読む — 選択したスタイルのCSSトークン + アニメーションパーソナリティを読み込む。

4. タイミングを計算:

totalDuration = sceneCount × duration_per_scene  (秒)
totalFrames   = totalDuration × fps

各シーンは、全体の @keyframes 範囲の (100 / sceneCount)% を占めます。

シーン開始%終了%
10%(100/N)%
2(100/N)%(200/N)%
………
N((N-1)×100/N)%100%

各シーン範囲内:

  • 入り:シーン範囲の最初の10%
  • 保持:シーン範囲の10%~85%
  • 出:シーン範囲の85%~100%

5. ピクセル寸法を決定:

  • 1:1 → W=1080、H=1080
  • 16:9 → W=1920、H=1080
  • 9:16 → W=1080、H=1920

ステップ3:HTML生成

コードを書く前に references/scene-library.md と references/style-presets.md を読むこと。

必須のHTML構造:

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
[スタイルプリセットからのフォントCDNリンク]
<style>
:root {
  [スタイルプリセットからのすべてのCSSトークン]
}

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
  width: [W]px; height: [H]px;
  overflow: hidden;
  background: var(--bg);
  font-family: var(--font-body);
  position: relative;
}

.scene {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 80px;
  opacity: 0;
  will-change: opacity, transform;
}
.scene-inner {
  width: 100%;
  max-width: 960px;
}

/* scene-library.md からのシーンタイプCSS */
[ここにシーンタイプCSSを貼り付け]
</style>
</head>
<body>

<div class="scene scene-1">
  <div class="scene-inner">
    [scene-library.mdテンプレートからのシーン1 HTML]
  </div>
</div>

[各シーンについて繰り返し]

<script>
window.__videoReady = false;
window.TOTAL_DURATION_MS = [totalDuration * 1000];

// ── アニメーションヘルパー ─────────────────────────────────────────────────────────
function lerp(a, b, p) { return a + (b - a) * p; }
function clamp(v, lo, hi) { return Math.max(lo, Math.min(hi, v)); }
function easeOutCubic(t) { return 1 - Math.pow(1 - clamp(t, 0, 1), 3); }

function sceneState(t, startMs, endMs) {
  if (t < startMs || t >= endMs) return { opacity: 0, ty: 0 };
  const prog = (t - startMs) / (endMs - startMs);
  if (prog < 0.10) {
    const p = easeOutCubic(prog / 0.10);
    return { opacity: p, ty: lerp(24, 0, p) };
  }
  if (prog < 0.85) return { opacity: 1, ty: 0 };
  const p = (prog - 0.85) / 0.15;
  return { opacity: 1 - p, ty: lerp(0, -12, p) };
}

function applySceneState(el, state) {
  el.style.opacity = state.opacity;
  el.style.transform = state.ty !== 0 ? `translateY(${state.ty.toFixed(2)}px)` : '';
}

// ── メインレンダリング関数 — Playwrightが1フレームごとに呼び出す ────────────────
window.renderFrame = function(t) {
  // シーン1: 0ms – [D]ms
  applySceneState(document.querySelector('.scene-1'), sceneState(t, 0, [D]));
  // シーン2: [D]ms – [2D]ms
  applySceneState(document.querySelector('.scene-2'), sceneState(t, [D], [2D]));
  // ... 各シーンについて繰り返し ...
};

// ── プレビューループ — フレームキャプチャ前にPlaywrightが停止させる ─────────────────
let __previewActive = false;
let __previewRafId = null;
window.__stopPreview = function() {
  __previewActive = false;
  if (__previewRafId !== null) { cancelAnimationFrame(__previewRafId); __previewRafId = null; }
};

document.fonts.ready.then(() => {
  window.renderFrame(0);
  window.__videoReady = true;
  __previewActive = true;
  const startTime = performance.now();
  function previewTick() {
    if (!__previewActive) return;
    const elapsed = performance.now() - startTime;
    if (elapsed < window.TOTAL_DURATION_MS) {
      window.renderFrame(elapsed);
      __previewRafId = requestAnimationFrame(previewTick);
    } else {
      window.renderFrame(window.TOTAL_DURATION_MS - 1);
      __previewActive = false;
    }
  }
  __previewRafId = requestAnimationFrame(previewTick);
});
</script>
</body>
</html>

デザイン品質ルール:

  • 見出しフォントサイズ:60pxより小さくしない — モバイルサムネイルサイズでテキストが読めること
  • 数字と統計:常に画面上で最大の要素(120~200px)
  • ディスプレイタイプのタイトな文字間隔:-0.02em ~ -0.04em
  • シーンごとに1つのアクセントカラー — 複数の要素にアクセントをばらまかない
  • ダークプリセット:区切り線 rgba(255,255,255,0.10)、決してベタ塗りではない
  • ライトプリセット:区切り線 rgba(0,0,0,0.10)、決してベタ塗りではない
  • transform を使用するすべての要素に transform-origin: center center
  • .scene 内のパディング:最低80px — テキストがビューポートの端に触れないようにする

ステップ4:自己QA(ステップ5の前にすべての失敗を修正すること)

renderFrameの正確性:

  • window.renderFrame(t) が定義されている — 純関数、スタイル書き出し以外の副作用なし
  • シーン境界に t < startMs(t <= startMs ではない)を使用 — フレーム0の黒を回避
  • シーン遷移に animation-delay や @keyframes のインスタンスがゼロ
  • 2つのシーンに重複する opacity: 1 ウィンドウがない(10%の入り重なりを除く)
  • window.__stopPreview() が公開され、プレビューrAFループが __previewActive をチェックしている

準備完了シグナル:

  • window.__videoReady = false が document.fonts.ready の前に宣言されている
  • window.__videoReady = true は document.fonts.ready.then(...) の内部でのみ設定されている
  • window.renderFrame(0) が document.fonts.ready.then(...) 内で __videoReady = true を設定する前に呼び出されている

レイアウト:

  • html, body が正確なピクセル寸法([W]px、[H]px)を使用している
  • body の幅/高さに %、vw、vh、rem 単位がない
  • html, body に overflow: hidden が設定されている
  • すべてのシーンが position: absolute; inset: 0

デザイン:

  • すべての色がスタイルプリセットトークンから — 自由なhex値なし
  • すべてのフォントがスタイルプリセットから — 自由なfont-family文字列なし
  • 見出しフォントサイズ ≥ 60px
  • source パラメータが提供されている場合、最終シーンにソースが含まれている

ステップ5:エクスポート

ブリーフの内容からスラッグを決定(ケバブケース、30文字以下):

mkdir -p chart/[slug]

HTMLを保存: chart/[slug]/video.html

ブラウザプレビュー:

open chart/[slug]/video.html

エクスポートを実行([skill-root] をこのスキルのディレクトリパスに置き換え):

bash [skill-root]/scripts/export-video.sh \
  chart/[slug]/video.html \
  chart/[slug]/video.mp4 \
  --duration [totalDuration] \
  --fps [fps] \
  --width [W] \
  --height [H] \
  [--music path/to/audio.mp3]

スクリプトは初回実行時にPlaywrightをインストールし(約200MBのChromium)、すべてのフレームをキャプチャし、FFmpegでMP4を結合します。


ステップ6:出力サマリー

## 動画:[ブリーフからのタイトル]
日付:[YYYY-MM-DD] | シーン数:[N] | スタイル:[style] | アスペクト:[ratio]
尺:[N]秒 | FPS:[fps] | フレーム数:[N]

ファイル
  ソース:   chart/[slug]/video.html
  出力:   chart/[slug]/video.mp4
  サイズ:     [X] MB

チェックリスト
- [ ] すべてのシーンが空白フレームなく順番に表示される
- [ ] モバイルサムネイルサイズでテキストが読みやすい
- [ ] シーントランジションがスムーズ(ジャンプカットなし)
- [ ] 最終シーンにCTAまたはクロージングメッセージが含まれている
- [ ] ソース帰属表示が最終フレームに含まれている(提供された場合)

プロンプトのヒント(ユーザーがガイダンスを求めたときに表示)

「コンテンツブリーフを提供してください — 各シーンで何を言うべきかの箇条書き。」

「インサイトを直接名付けてください。『Q4が85%成長した3つの理由』は動画に背骨を与えます。」

「スタイルの好みがあれば言及してください:kinetic-dark(デフォルト)、editorial-light、data-pulse、bold-type、minimal-clean。」

「プラットフォームに応じたアスペクト比を指定してください:LinkedIn/Instagramフィードには1:1、Stories/Reelsには9:16、YouTube/プレゼンテーションには16:9。」

✅ 良い例:「9秒の動画を作成。Q4の売上は420万ドル(85%成長)。要因:エンタープライズ案件、チャーン1.2%、価格引き上げ。CTA:acme.com/q4。スタイル:data-pulse。アスペクト:1:1。」

❌ 悪い例:「会社についての動画を作って」

Individual skills in this repo

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

Varnan-Tech/opendirectory

Use when the user asks to generate a blog cover image, thumbnail, or article header. Automatically uses modern typography, brand logos, and Google Search grounding to create beautiful 16:9 images with Gemini 3.1 Flash Image Preview.

Varnan-Tech/opendirectory

World-class brand strategist and naming expert. Uses an interrogation-led discovery phase to extract your brand's DNA, then applies scientific naming frameworks (Phonosemantics) and automated multi-TLD domain checking.

Varnan-Tech/opendirectory

Use when the user asks to generate or update a project's CLAUDE or AGENTS context file from a codebase scan. Writes a focused file under 100 lines containing only the non-obvious build commands, conventions, and gotchas Claude Code needs.

Varnan-Tech/opendirectory

Use when the user wants to verify cold emails, enrich a lead list, or autonomously guess email addresses from a CSV using ValidEmail.co or the open-source Reacher engine.

Varnan-Tech/opendirectory

Competitive intelligence orchestrator tracking companies across 8+ platforms (GitHub, Twitter, Reddit, HN, PH, YC Jobs) with heat scores and AI briefings.

Varnan-Tech/opendirectory

Give it your product URL or description. It finds your top 5 competitors, runs three-track PR research across all of them (editorial, podcasts, communities), identifies which channels appear most frequently, looks up the journalist or host for each, and returns a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to your product. Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover my space, or get pitch templates for press coverage.

Varnan-Tech/opendirectory

Generate high-converting, deep-dive growth case studies in MDX format. Use this skill when asked to write a case study or blog post about a company's growth, tech stack, or product-led strategy. It handles the full pipeline (researching the company via Tavily, generating a 16:9 cover image, quality checking the draft, uploading assets to cloud storage, and pushing directly to the target repository).

Varnan-Tech/opendirectory

Scans your project for outdated npm, pip, Cargo, Go, or Ruby packages. Runs a CVE security audit. Fetches changelogs, summarizes breaking changes with Gemini, and opens one PR per risk group (patch, minor, major). Includes Diagnosis Mode for install conflicts. Use when asked to update dependencies, check for outdated packages, open dependency PRs, scan for package updates, audit for CVEs, or flag breaking changes in upgrades. Trigger when a user says "check for outdated packages", "update my dependencies", "open PRs for dependency updates", "scan for CVEs", or "which packages need upgrading".

Varnan-Tech/opendirectory

Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture. Uses graphify to build a knowledge graph first, then writes accurate docs from it. Use when asked to write docs, generate a README, document an API, update stale docs, create an API reference from code, add an architecture section, or document a project in any language. Trigger when a user says their docs are missing, outdated, or wants to document their codebase without writing it manually.

Varnan-Tech/opendirectory

Evaluates expired domain candidates against a target niche, scores them by topical relevance, historical activity level, and history cleanliness, then outputs a ranked shortlist with explainable reasoning and risk flags.

Varnan-Tech/opendirectory

Brutally honest developer-experience audit for a GitHub repo. Scores 10 DX dimensions (time-to-first-success, README clarity, visual proof, install, quick-start, docs, examples, community, trust, marketing), writes a shareable roast in the requested tone (brutal/honest/kind), produces a prioritized action plan ranked by impact × effort, and sketches an ideal README. Trigger when user says "roast my repo", "audit my README", "dx audit", "developer experience review", "score my GitHub project", "before launch checklist", or "make my repo shareable".

Varnan-Tech/opendirectory

Drafts and designs a complete HTML email newsletter from a topic or content brief. Outputs paste-ready HTML for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform. Includes subject line options and plain-text fallback. Trigger when a user says "write a newsletter", "draft an email newsletter", "create an HTML email", "design an email for my subscribers", or "write a newsletter about [topic]".

Varnan-Tech/opendirectory

Takes a GitHub PR URL or the current branch and writes a plain-English explanation of what it does and why, then posts it as a PR comment. Use when asked to explain a PR, summarize a pull request, write a plain-English description of a PR, add a summary comment to a PR, or understand what a PR changes. Trigger when a user says "explain this PR", "summarize this pull request", "what does this PR do", "add a comment explaining the PR", or shares a GitHub PR URL and asks what it does.

Varnan-Tech/opendirectory

Audit how often LLMs recommend your brand vs competitors and generate a GEO action plan.

Varnan-Tech/opendirectory

Takes a competitor's public GitHub repo URL, fetches their open issues via the GitHub REST API, filters noise locally, clusters issues into 6 demand categories, computes a demand score per issue and per cluster, and outputs a ranked demand gap report with a GTM messaging brief. Use when asked to scan a competitor's GitHub issues, find what their users are begging for, turn GitHub complaints into product positioning, identify competitor feature gaps, or generate messaging from real user demand. Trigger when a user says "scan competitor issues", "what are users asking for on X repo", "find demand gaps in Y", "turn GitHub issues into messaging", or "what should I build based on competitor complaints".

Varnan-Tech/opendirectory

Find recurring confusion in your repo's GitHub Discussions, rank it by urgency, and draft the actual docs fixes and content angles — with verbatim community quotes and source links as evidence.

Varnan-Tech/opendirectory

SEO keyword research workflow for blog generation using Google Trends data. Use when writing blog posts, planning content calendars, or optimizing articles for search engines. Finds breakout keywords, builds content structure, and generates SEO-optimized blog outlines targeting tech and developer audiences.

Varnan-Tech/opendirectory

Generates a professionally designed case study PDF for B2B SaaS sales and marketing. Supports 7 page layouts, 9 style presets, 1-4 page output. Trigger when user says "create a case study", "write a customer story", "make a case study PDF", "design a success story", "turn this customer win into a PDF".

Varnan-Tech/opendirectory

Generates data visualization charts (bar, line, area, pie, doughnut, scatter, radar, treemap) as PNG using Apache ECharts v6. 1080×1080px default, 5 style presets, highlight annotations. Trigger when user says "create a chart", "visualize data", "make a bar chart", "line graph", "pie chart", "data visualization", "chart this data", "plot", "graph", or "visualize these numbers".

Varnan-Tech/opendirectory

Fetches low-star App Store and Google Play reviews, clusters them into broken-promise patterns, and generates a ranked copy brief with positioning opportunities.

関連スキル