Communitygithub.com

Varnan-Tech/opendirectory

Génère des vidéos motion graphics (MP4) à partir d'un brief de contenu. Animations HTML/CSS multi-scènes rendues image par image dans Chromium sans tête via Playwright, assemblées avec FFmpeg.

Qu'est-ce que opendirectory ?

Cette compétence permet de créer automatiquement des vidéos motion graphics professionnelles au format MP4 à partir d'un simple résumé de contenu. Elle fonctionne en générant du code HTML/CSS avec des animations JavaScript pures, sans aucune dépendance externe (pas de bibliothèques JavaScript, pas d'API d'IA, pas de React). Le rendu s'effectue image par image dans un navigateur Chromium sans tête orchestré par Playwright, ce qui garantit une déterminisme parfait et l'absence de problèmes de synchronisation. Les images PNG résultantes sont assemblées en une vidéo MP4 fluide via FFmpeg. La compétence prend en charge trois formats d'image (1:1 en 1080×1080 par défaut, 16:9 en 1920×1080 et 9:16 en 1080×1920), cinq préréglages de style visuel (kinetic-dark, editorial-light, data-pulse, bold-type, minimal-clean) et jusqu'à six scènes. Elle est particulièrement utile pour les développeurs et créateurs de contenu qui souhaitent produire rapidement des vidéos d'explication, des reels, des infographies animées ou des présentations courtes sans recourir à des outils complexes de montage vidéo. L'architecture repose sur une fonction `renderFrame(t)` JavaScript qui calcule l'opacité et les transformations de chaque scène en fonction du temps, évitant ainsi les problèmes des transitions CSS basées sur `@keyframes`.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

vid-motion-graphics

Génère des motion graphics multi-scènes au format MP4. Affiche des animations HTML/CSS dans Chromium sans tête via Playwright (recherche d'image par API Web Animations), assemble les images PNG avec FFmpeg. Pas de React, pas d'API d'IA, pas de Python — zéro nouvelle dépendance en dehors de la famille graphic-gif.

Polices CDN uniquement. Aucune bibliothèque externe dans le HTML.


Règles critiques (à lire avant chaque génération)

  1. Utilisez window.renderFrame(t) — pas de @keyframes CSS pour les transitions de scène. La recherche de currentTime dans les animations CSS est silencieusement ignorée pour les recherches en arrière dans Chromium. L'approche renderFrame : une fonction JS pure calcule opacity/transform directement à partir des millisecondes. Playwright l'appelle une fois par image. Déterministe, sans concurrence.
  2. Pas de animation-delay sur AUCUN élément. Inutile avec renderFrame. Si vous vous surprenez à écrire animation-delay, arrêtez — vous utilisez la mauvaise architecture.
  3. window.__videoReady = true uniquement à l'intérieur de document.fonts.ready.then(...). Ne jamais définir de manière synchrone — les polices doivent être chargées avant que Playwright ne capture l'image 1, sinon le texte s'affiche avec des polices de secours.
  4. Exposez window.__stopPreview(). La boucle de prévisualisation rAF du navigateur entre en concurrence avec les appels evaluate/screenshot de Playwright. capture-frames.mjs appelle __stopPreview() avant la boucle d'images. Incluez-la toujours.
  5. Utilisez t < startMs (pas <=) dans les vérifications de limites de scène. t <= 0 à l'image 0 rend la scène 1 noire. La protection correcte est if (t < startMs || t >= endMs) return hidden.
  6. Body = dimensions exactes en pixels. La largeur et la hauteur sont des entiers (1080px, 1920px). Pas de %, vw/vh ou d'unités responsives.
  7. Aucune scène visible simultanément (sauf chevauchement d'entrée de 10 %). Toutes les scènes opacity: 0 en dehors de leur fenêtre renderFrame.
  8. Les transitions utilisent opacity uniquement. Pas de bascule display, pas de visibility — l'opacité composée par le GPU est parfaite image par image.
  9. Ne déversez jamais le HTML dans le chat. Sauvegardez dans un fichier, montrez un résumé uniquement.
  10. Le titre énonce le message, pas le sujet. "3 raisons pour lesquelles le T4 a explosé les objectifs" pas "Vidéo de performance T4 2024".
  11. Lisez references/scene-library.md avant de générer TOUT HTML. Utilisez la structure HTML exacte et les noms de classes CSS de ce fichier.

Étape 1 : Prise en charge

Obligatoire : content_brief

Paramètres optionnels et valeurs par défaut :

ParamètreDéfautDescription
content_brief—Texte décrivant ce que la vidéo communique (obligatoire)
scenesautoNombre de scènes (1–6). Auto = dérivé du brief.
duration_per_scene3sDurée par scène en secondes (1–8s)
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)
fps30Images par seconde (24, 30 ou 60)
musicnoneChemin vers le fichier audio pour la piste de fond (mp3/m4a/wav)
source—Attribution de source affichée dans le pied de page de l'image finale

Si content_brief est manquant, demandez exactement :

"Pour créer la vidéo, j'ai besoin d'un brief de contenu — que doit communiquer la vidéo ?

Exemple : 'Montrer 3 raisons pour lesquelles le chiffre d'affaires du T4 a augmenté de 85 % : nouvelles transactions entreprises, réduction de l'attrition, augmentation des prix. Utilisez des chiffres en gras. Style : data-pulse.'

Optionnel : style (défaut : kinetic-dark), format d'image (défaut : 1:1), secondes par scène (défaut : 3s)"

Si content_brief est présent → passez immédiatement à l'étape 2.


Étape 2 : Architecture interne (jamais montrée à l'utilisateur)

1. Analysez le brief en scènes (max 6) :

  • Scène 1 = accroche ou titre (toujours)
  • Scènes 2–N-1 = points d'appui, métriques ou rythmes narratifs
  • Scène N = CTA ou résumé de clôture (toujours, si plus d'une scène)
  • Une idée clé par scène — si le brief contient 7+ idées, consolidez les plus faibles

2. Lisez references/scene-library.md — choisissez le type de scène pour chaque scène :

  • Accroche/ouverture → title-card
  • Métrique unique → stat-reveal
  • Liste de 2–4 points → bullet-list
  • Avant vs après / deux valeurs → split-screen
  • Témoignage / citation → quote-card
  • Final / CTA → cta-card

3. Lisez references/style-presets.md — chargez les jetons CSS + la personnalité d'animation pour le style choisi.

4. Calculez le timing :

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

Chaque scène occupe (100 / sceneCount)% de la plage totale des @keyframes.

ScèneDébut %Fin %
10%(100/N)%
2(100/N)%(200/N)%
………
N((N-1)×100/N)%100%

Dans la plage de chaque scène :

  • Entrée : 10 % premiers de la plage de la scène
  • Maintien : 10 % à 85 % de la plage de la scène
  • Sortie : 85 % à 100 % de la plage de la scène

5. Déterminez les dimensions en pixels :

  • 1:1 → L=1080, H=1080
  • 16:9 → L=1920, H=1080
  • 9:16 → L=1080, H=1920

Étape 3 : Génération HTML

Lisez references/scene-library.md ET references/style-presets.md avant d'écrire du code.

Structure HTML requise :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
[lien CDN de police depuis le préréglage de style]
<style>
:root {
  [tous les jetons CSS du préréglage de style]
}

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
  width: [L]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;
}

/* CSS du type de scène depuis scene-library.md */
[collez le CSS du type de scène ici]
</style>
</head>
<body>

<div class="scene scene-1">
  <div class="scene-inner">
    [HTML de la scène 1 depuis le modèle scene-library.md]
  </div>
</div>

[répétez pour chaque scène]

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

// ── Aides d'animation ─────────────────────────────────────────────────────────
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)` : '';
}

// ── Fonction de rendu principale — appelée par Playwright une fois par image ────────────────
window.renderFrame = function(t) {
  // Scène 1 : 0ms – [D]ms
  applySceneState(document.querySelector('.scene-1'), sceneState(t, 0, [D]));
  // Scène 2 : [D]ms – [2D]ms
  applySceneState(document.querySelector('.scene-2'), sceneState(t, [D], [2D]));
  // ... répétez par scène ...
};

// ── Boucle de prévisualisation — arrêtée par Playwright avant la capture d'image ─────────────────
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>

Règles de qualité de conception :

  • Taille de police du titre : jamais inférieure à 60 px — le texte doit être lisible à la taille d'une miniature mobile
  • Chiffres et statistiques : toujours l'élément le plus grand à l'écran (120–200 px)
  • Espacement serré des lettres pour les polices d'affichage : -0.02em à -0.04em
  • Une couleur d'accent par scène — ne dispersez pas l'accent sur plusieurs éléments
  • Préréglages sombres : séparateurs rgba(255,255,255,0.10), jamais pleins
  • Préréglages clairs : séparateurs rgba(0,0,0,0.10), jamais pleins
  • transform-origin: center center sur chaque élément qui utilise transform
  • Rembourrage à l'intérieur de .scene : minimum 80 px — ne laissez jamais le texte toucher les bords de la fenêtre d'affichage

Étape 4 : Auto-QA (corrigez chaque échec avant l'étape 5)

Exactitude de renderFrame :

  • window.renderFrame(t) définie — fonction pure, aucun effet secondaire en dehors des écritures de style
  • La limite de scène utilise t < startMs (pas t <= startMs) — évite l'image 0 noire
  • Zéro instance de animation-delay ou @keyframes pour les transitions de scène
  • Aucune scène n'a des fenêtres opacity: 1 qui se chevauchent (sauf chevauchement d'entrée de 10 %)
  • window.__stopPreview() exposé et la boucle de prévisualisation rAF vérifie __previewActive

Signal de préparation :

  • window.__videoReady = false déclaré avant document.fonts.ready
  • window.__videoReady = true défini UNIQUEMENT à l'intérieur de document.fonts.ready.then(...)
  • window.renderFrame(0) appelé à l'intérieur de document.fonts.ready.then(...) avant de définir __videoReady = true

Disposition :

  • html, body utilisent des dimensions exactes en pixels ([L]px, [H]px)
  • Pas d'unités %, vw, vh, rem sur la largeur/hauteur de body
  • overflow: hidden sur html, body
  • Toutes les scènes position: absolute; inset: 0

Conception :

  • Toutes les couleurs proviennent des jetons du préréglage de style — pas de valeurs hexadécimales libres
  • Toutes les polices proviennent du préréglage de style — pas de chaînes font-family libres
  • Taille de police du titre ≥ 60 px
  • Source dans la scène finale si le paramètre source est fourni

Étape 5 : Exportation

Déterminez le slug à partir du contenu du brief (kebab-case, ≤30 caractères) :

mkdir -p graph/[slug]

Sauvegardez le HTML : graph/[slug]/video.html

Prévisualisation navigateur :

open graph/[slug]/video.html

Lancez l'exportation (remplacez [skill-root] par le chemin du répertoire de cette compétence) :

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

Le script installe Playwright lors de la première exécution (~200 Mo Chromium), capture toutes les images, puis assemble le MP4 avec FFmpeg.


Étape 6 : Résumé de sortie

## Vidéo : [titre du brief]
Date : [AAAA-MM-JJ] | Scènes : [N] | Style : [style] | Format : [ratio]
Durée : [N]s | FPS : [fps] | Images : [N]

Fichiers
  Source :   graph/[slug]/video.html
  Sortie :   graph/[slug]/video.mp4
  Taille :   [X] Mo

Liste de contrôle
- [ ] Toutes les scènes apparaissent en séquence sans image vide
- [ ] Texte lisible à la taille d'une miniature mobile
- [ ] Transitions de scène fluides (pas de coupures brutales)
- [ ] La scène finale inclut un CTA ou un message de clôture
- [ ] Attribution de source présente dans l'image finale (si fournie)

Conseils sur les prompts (afficher lorsque l'utilisateur demande des conseils)

"Fournissez un brief de contenu — des puces sur ce que chaque scène doit dire."

"Nommez directement l'insight. '3 raisons pour lesquelles le T4 a augmenté de 85 %' donne une colonne vertébrale à la vidéo."

"Mentionnez le style si vous avez une préférence : kinetic-dark (défaut), editorial-light, data-pulse, bold-type, minimal-clean."

"Spécifiez le format d'image pour la plateforme : 1:1 pour le fil LinkedIn/Instagram, 9:16 pour les Stories/Reels, 16:9 pour YouTube/présentations."

✅ Bon : "Créez une vidéo de 9 secondes. Le chiffre d'affaires du T4 a atteint 4,2 M$ (croissance de 85 %). Facteurs : transactions entreprises, attrition 1,2 %, augmentation des prix. CTA : acme.com/q4. Style : data-pulse. Format : 1:1."

❌ Mauvais : "faites une vidéo sur notre entreprise"

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.

Skills associés