Communitygithub.com

assafkip/claude-video-editor

Créez des compositions vidéo, des animations, des cartes-titres, des superpositions, des sous-titres, des voix off, des visuels réactifs à l'audio et des transitions de scène en HTML HyperFrames.

Qu'est-ce que claude-video-editor ?

Cette compétence transforme votre agent IA en un éditeur vidéo complet basé sur HTML, utilisant le framework HyperFrames. Elle vous permet de créer des compositions vidéo entières avec animations, sous-titres synchronisés, voix off par synthèse vocale, effets visuels réactifs à l'audio (comme des pulsations ou des lueurs synchronisées sur la musique), et des animations de texte dynamiques (surlignements, cercles dessinés à la main, etc.). Utile pour tout projet de production vidéo, elle prend en charge les agents comme Claude Code, Cursor ou Codex. Le flux de travail se concentre sur l'écriture de HTML comme source de vérité, avec des attributs `data-*` pour le timing, une timeline GSAP pour l'animation, et du CSS pour l'apparence. Cette compétence impose des règles strictes : définir une identité visuelle avant d'écrire du HTML, construire d'abord la mise en page finale (état statique) avant d'ajouter des animations, n'utiliser que des entrées et des sorties contrôlées par les transitions de scène (sans sorties prématurées sauf sur la scène finale), et garantir des constructions de timeline synchrones et déterministes. Elle gère les règles de composition complexe, les transitions de scène obligatoires entre chaque scène, et l'utilisation correcte des éléments média (vidéo muette + audio séparé). L'agent doit également suivre un guide de style maison pour les valeurs par défaut du mouvement et un DESIGN.md pour la palette de couleurs et la typographie.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/assafkip/claude-video-editor/tree/HEAD/skills/hyperframes

Demander à votre IA préférée

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

Aperçu

Depuis le README du skill

Documentation

HyperFrames

HTML est la source de vérité pour la vidéo. Une composition est un fichier HTML avec des attributs data-* pour le timing, une timeline GSAP pour l'animation, et du CSS pour l'apparence. Le framework gère la visibilité des clips, la lecture des médias et la synchronisation de la timeline.

Approche

Avant d'écrire du HTML, réfléchissez à un niveau élevé :

  1. Quoi — que doit vivre le spectateur ? Identifiez l'arc narratif, les moments clés et les battements émotionnels.
  2. Structure — combien de compositions, lesquelles sont des sous-compositions vs en ligne, quelles pistes transportent quoi (vidéo, audio, superpositions, sous-titres).
  3. Timing — quels clips déterminent la durée, où se placent les transitions, quel est le rythme.
  4. Disposition — construisez d'abord l'état final. Voir "Disposition avant Animation" ci-dessous.
  5. Animer — puis ajoutez du mouvement en utilisant les règles ci-dessous.

Pour les petites modifications (corriger une couleur, ajuster le timing, ajouter un élément), passez directement aux règles.

Porte d'Identité Visuelle

Vérifiez dans cet ordre :

  1. DESIGN.md existe dans le projet ? → Lisez-le. Utilisez ses couleurs, polices, règles de mouvement et contraintes "Ce qu'il ne faut PAS faire" exactes.
  2. visual-style.md existe ? → Lisez-le. Appliquez son style_prompt_full et ses champs structurés. (Note : visual-style.md est un fichier spécifique au projet. visual-styles.md est la bibliothèque de styles avec 8 préréglages nommés — fichiers différents.)
  3. L'utilisateur a nommé un style (ex. "Swiss Pulse", "dark and techy", "luxury brand") ? → Lisez visual-styles.md pour les 8 préréglages nommés. Générez un DESIGN.md minimal avec : ## Style Prompt (un paragraphe), ## Colors (3-5 valeurs hexadécimales avec rôles), ## Typography (1-2 familles de polices), ## What NOT to Do (3-5 anti-patrons).
  4. Rien de ce qui précède ? → Posez 3 questions avant d'écrire du HTML :
    • Quelle est l'ambiance ? (explosif / cinématographique / fluide / technique / chaotique / chaleureux)
    • Toile claire ou sombre ?
    • Des couleurs, polices ou références visuelles spécifiques de marque ? Générez ensuite un DESIGN.md minimal à partir des réponses.

Chaque composition doit faire remonter sa palette et sa typographie à un DESIGN.md, visual-style.md, ou à une direction utilisateur explicite. Si vous utilisez #333, #3b82f6, ou Roboto — vous avez sauté cette étape.

Pour les valeurs par défaut du mouvement, le dimensionnement, les motifs d'entrée et l'assouplissement — suivez house-style.md. Le style maison gère COMMENT les choses bougent. Le DESIGN.md gère À QUOI ressemblent les choses.

Disposition avant Animation

Positionnez chaque élément là où il doit être à son moment le plus visible — l'image où il est complètement entré, correctement placé, et pas encore en train de sortir. Écrivez d'abord cela en HTML+CSS statique. Pas encore de GSAP.

Pourquoi c'est important : Si vous positionnez les éléments à leur état de départ animé (hors écran, mis à l'échelle 0, opacité 0) et les animez vers où vous pensez qu'ils devraient atterrir, vous devinez la disposition finale. Les chevauchements sont invisibles jusqu'à ce que la vidéo soit rendue. En construisant d'abord l'état final, vous pouvez voir et corriger les problèmes de disposition avant d'ajouter du mouvement.

Le processus

  1. Identifiez l'image héroïque pour chaque scène — le moment où le plus d'éléments sont simultanément visibles. C'est la disposition que vous construisez.
  2. Écrivez du CSS statique pour cette image. Le conteneur .scene-content DOIT remplir toute la scène en utilisant width: 100%; height: 100%; padding: Npx; avec display: flex; flex-direction: column; gap: Npx; box-sizing: border-box. Utilisez le padding pour pousser le contenu vers l'intérieur — JAMAIS position: absolute; top: Npx sur un conteneur de contenu. Les conteneurs de contenu positionnés en absolu débordent lorsque le contenu est plus haut que l'espace restant. Réservez position: absolute uniquement pour les éléments décoratifs.
  3. Ajoutez les entrées avec gsap.from() — animez DEPUIS hors écran/invisible VERS la position CSS. La position CSS est la vérité de référence ; l'interpolation décrit le voyage pour y arriver.
  4. Ajoutez les sorties avec gsap.to() — animez VERS hors écran/invisible DEPUIS la position CSS.

Exemple

/* scene-content remplit la scène, le padding positionne le contenu */
.scene-content {
  display: flex;
  flex-direction: column;
  justify-content: center;
  width: 100%;
  height: 100%;
  padding: 120px 160px;
  gap: 24px;
  box-sizing: border-box;
}
.title {
  font-size: 120px;
}
.subtitle {
  font-size: 42px;
}
/* Le conteneur remplit n'importe quelle taille de scène (1920x1080, 1080x1920, etc.).
   Le padding positionne le contenu. Flex + gap gère l'espacement. */

MAUVAIS — dimensions codées en dur et positionnement absolu :

.scene-content {
  position: absolute;
  top: 200px;
  left: 160px;
  width: 1920px;
  height: 1080px;
  display: flex; /* ... */
}
// Étape 3 : Animer VERS ces positions
tl.from(".title", { y: 60, opacity: 0, duration: 0.6, ease: "power3.out" }, 0);
tl.from(".subtitle", { y: 40, opacity: 0, duration: 0.5, ease: "power3.out" }, 0.2);
tl.from(".logo", { scale: 0.8, opacity: 0, duration: 0.4, ease: "power2.out" }, 0.3);

// Étape 4 : Animer DEPUIS ces positions
tl.to(".title", { y: -40, opacity: 0, duration: 0.4, ease: "power2.in" }, 3);
tl.to(".subtitle", { y: -30, opacity: 0, duration: 0.3, ease: "power2.in" }, 3.1);
tl.to(".logo", { scale: 0.9, opacity: 0, duration: 0.3, ease: "power2.in" }, 3.2);

Quand des éléments partagent de l'espace dans le temps

Si l'élément A sort avant que l'élément B n'entre dans la même zone, les deux doivent avoir des positions CSS correctes pour leurs images héroïques respectives. L'ordre de la timeline garantit qu'ils ne coexistent jamais visuellement — mais si vous sautez l'étape de disposition, vous ne détecterez pas le cas où ils se chevauchent accidentellement en raison d'une erreur de timing.

Ce qui compte comme chevauchement intentionnel

Les effets en couches (lueur derrière le texte, éléments d'ombre, motifs d'arrière-plan) et les conceptions en pile z (piles de cartes, couches de profondeur) sont intentionnels. L'étape de disposition consiste à détecter les chevauchements non intentionnels — deux titres atterrissant l'un sur l'autre, une statistique recouvrant une étiquette, un contenu débordant du cadre.

Attributs de Données

Tous les Clips

AttributRequisValeurs
idOuiIdentifiant unique
data-startOuiSecondes ou référence d'ID de clip ("el-1", "intro + 2")
data-durationRequis pour img/div/compositionsSecondes. La vidéo/audio par défaut est la durée du média.
data-track-indexOuiEntier. Les clips de la même piste ne peuvent pas se chevaucher.
data-media-startNonDécalage de découpage dans la source (secondes)
data-volumeNon0-1 (par défaut 1)

data-track-index n'affecte pas la superposition visuelle — utilisez CSS z-index.

Clips de Composition

AttributRequisValeurs
data-composition-idOuiIdentifiant unique de composition
data-startOuiHeure de début (composition racine : utiliser "0")
data-durationOuiPrime sur la durée de la timeline GSAP
data-width / data-heightOuiDimensions en pixels (1920x1080 ou 1080x1920)
data-composition-srcNonChemin vers un fichier HTML externe

Structure de Composition

Les sous-compositions chargées via data-composition-src utilisent un wrapper <template>. Les compositions autonomes (le index.html principal) n'utilisent PAS <template> — elles placent le div data-composition-id directement dans <body>. Utiliser <template> sur un fichier autonome cache tout le contenu au navigateur et casse le rendu.

Structure de sous-composition :

<template id="ma-comp-template">
  <div data-composition-id="ma-comp" data-width="1920" data-height="1080">
    <!-- contenu -->
    <style>
      [data-composition-id="ma-comp"] {
        /* styles délimités */
      }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
    <script>
      window.__timelines = window.__timelines || {};
      const tl = gsap.timeline({ paused: true });
      // interpolations...
      window.__timelines["ma-comp"] = tl;
    </script>
  </div>
</template>

Charger dans la racine : <div id="el-1" data-composition-id="ma-comp" data-composition-src="compositions/ma-comp.html" data-start="0" data-duration="10" data-track-index="1"></div>

Vidéo et Audio

La vidéo doit être muted playsinline. L'audio est toujours un élément <audio> séparé :

<video
  id="el-v"
  data-start="0"
  data-duration="30"
  data-track-index="0"
  src="video.mp4"
  muted
  playsinline
></video>
<audio
  id="el-a"
  data-start="0"
  data-duration="30"
  data-track-index="2"
  src="video.mp4"
  data-volume="1"
></audio>

Contrat de Timeline

  • Toutes les timelines commencent { paused: true } — le lecteur contrôle la lecture
  • Enregistrez chaque timeline : window.__timelines["<composition-id>"] = tl
  • Le framework imbrique automatiquement les sous-timelines — ne les ajoutez PAS manuellement
  • La durée provient de data-duration, pas de la longueur de la timeline GSAP
  • Ne créez jamais d'interpolations vides pour définir la durée

Règles (Non Négociables)

Déterministe : Pas de Math.random(), Date.now(), ou logique basée sur le temps. Utilisez un PRNG à graine si vous avez besoin de valeurs pseudo-aléatoires (ex. mulberry32).

GSAP : Animez uniquement les propriétés visuelles (opacity, x, y, scale, rotation, color, backgroundColor, borderRadius, transformations). N'animez PAS visibility, display, ou n'appelez pas video.play()/audio.play().

Conflits d'animation : N'animez jamais la même propriété sur le même élément à partir de plusieurs timelines simultanément.

Pas de repeat: -1 : Les timelines à répétition infinie cassent le moteur de capture. Calculez le nombre exact de répétitions à partir de la durée de la composition : repeat: Math.ceil(duration / cycleDuration) - 1.

Construction synchrone de timeline : Ne construisez jamais de timelines à l'intérieur de async/await, setTimeout, ou Promesses. Le moteur de capture lit window.__timelines de manière synchrone après le chargement de la page. Les polices sont intégrées par le compilateur, donc elles sont disponibles immédiatement — pas besoin d'attendre le chargement des polices.

Ne jamais faire :

  1. Oublier l'enregistrement window.__timelines
  2. Utiliser la vidéo pour l'audio — toujours vidéo muette + <audio> séparé
  3. Nicher une vidéo à l'intérieur d'un div temporisé — utiliser un wrapper non temporisé
  4. Utiliser data-layer (utiliser data-track-index) ou data-end (utiliser data-duration)
  5. Animer les dimensions de l'élément vidéo — animer un wrapper div
  6. Appeler play/pause/seek sur le média — le framework possède la lecture
  7. Créer un conteneur de premier niveau sans data-composition-id
  8. Utiliser repeat: -1 sur une timeline ou une interpolation — toujours des répétitions finies
  9. Construire des timelines de manière asynchrone (à l'intérieur de async, setTimeout, Promise)
  10. Utiliser gsap.set() sur des éléments de clip de scènes ultérieures — ils n'existent pas dans le DOM au chargement de la page. Utilisez plutôt tl.set(selector, vars, timePosition) à l'intérieur de la timeline au moment ou après le data-start du clip.
  11. Utiliser <br> dans le texte de contenu — les sauts de ligne forcés ne tiennent pas compte de la largeur réelle de la police rendue. Le texte qui se plie naturellement + un <br> produit un saut supplémentaire indésirable, provoquant un chevauchement. Laissez le texte se plier via max-width à la place. Exception : les titres d'affichage courts où chaque mot est délibérément sur sa propre ligne (ex. "THE\nIMMORTAL\nGAME" à 130px).

Transitions de Scène (Non Négociables)

Chaque composition multi-scène DOIT suivre TOUTES ces règles. En violer une seule est une composition cassée.

  1. TOUJOURS utiliser des transitions entre les scènes. Pas de coupes franches. Aucune exception.
  2. TOUJOURS utiliser des animations d'entrée sur chaque scène. Chaque élément anime ENTRANT via gsap.from(). Aucun élément ne peut apparaître complètement formé. Si une scène a 5 éléments, elle a besoin de 5 interpolations d'entrée.
  3. NE JAMAIS utiliser d'animations de sortie sauf sur la scène finale. Cela signifie : PAS de gsap.to() qui anime l'opacité à 0, y hors écran, l'échelle à 0, ou toute autre animation "de sortie" avant qu'une transition ne se déclenche. La transition EST la sortie. Le contenu de la scène sortante DOIT être entièrement visible au moment où la transition commence.
  4. Scène finale uniquement : La dernière scène peut estomper des éléments (ex. fondu au noir). C'est la SEULE scène où gsap.to(..., { opacity: 0 }) est autorisé.

MAUVAIS — animation de sortie avant la transition :

// INTERDIT — cela vide la scène avant que la transition ne puisse l'utiliser
tl.to("#s1-title", { opacity: 0, y: -40, duration: 0.4 }, 6.5);
tl.to("#s1-subtitle", { opacity: 0, duration: 0.3 }, 6.7);
// la transition se déclenche sur une image vide

CORRECT — entrée uniquement, la transition gère la sortie :

// Animations d'entrée de la scène 1
tl.from("#s1-title", { y: 50, opacity: 0, duration: 0.7, ease: "power3.out" }, 0.3);
tl.from("#s1-subtitle", { y: 30, opacity: 0, duration: 0.5, ease: "power2.out" }, 0.6);
// PAS d'interpolations de sortie — la transition à 7.2 s gère le changement de scène
// Animations d'entrée de la scène 2
tl.from("#s2-heading", { x: -40, opacity: 0, duration: 0.6, ease: "expo.out" }, 8.0);

Garde-fous d'Animation

  • Décalez la première animation de 0,1 à 0,3 s (pas à t=0)
  • Variez les assouplissements entre les interpolations d'entrée — utilisez au moins 3 assouplissements différents par scène
  • Ne répétez pas un motif d'entrée dans une scène
  • Évitez les dégradés linéaires plein écran sur les arrière-plans sombres (bandes H.264 — utilisez radial ou uni + lueur localisée)
  • Titres de 60px+, corps de 20px+, étiquettes de données de 16px+ pour la vidéo rendue
  • font-variant-numeric: tabular-nums sur les colonnes de nombres

Lorsqu'aucun visual-style.md ou direction d'animation n'est fourni, suivez house-style.md pour les valeurs par défaut esthétiques.

Typographie et Ressources

  • Polices : Écrivez simplement la font-family que vous voulez en CSS — le compilateur intègre automatiquement les polices prises en charge. Si une police n'est pas prise en charge, le compilateur avertit.
  • Ajoutez crossorigin="anonymous" aux médias externes

Individual skills in this repo

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

assafkip/claude-video-editor

Build videos from stills when there is nothing to cut — narration first (ElevenLabs v3 with audio tags), then still keyframes from ANY source (AI image tools, screenshots, photos, HyperFrames-rendered HTML), animated deterministically with the animate-stills recipe (HyperFrames camera moves + GSAP atmosphere). Use when the user wants an explainer, documentary-style video, or any video built from generated or collected visuals instead of recorded footage.

assafkip/claude-video-editor

GSAP animation reference for HyperFrames. Covers gsap.to(), from(), fromTo(), easing, stagger, defaults, timelines (gsap.timeline(), position parameter, labels, nesting, playback), and performance (transforms, will-change, quickTo). Use when writing GSAP animations in HyperFrames compositions.

assafkip/claude-video-editor

HyperFrames CLI tool — hyperframes init, lint, preview, render, transcribe, tts, doctor, browser, info, upgrade, compositions, docs, benchmark. Use when scaffolding a project, linting or validating compositions, previewing in the studio, rendering to video, transcribing audio, generating TTS, or troubleshooting the HyperFrames environment.

assafkip/claude-video-editor

Install and wire registry blocks and components into HyperFrames compositions. Use when running hyperframes add, installing a block or component, wiring an installed item into index.html, or working with hyperframes.json. Covers the add command, install locations, block sub-composition wiring, component snippet merging, and registry discovery.

assafkip/claude-video-editor

Beginner-friendly end-to-end video creator for HyperFrames. Use when the user says "make a video", "create a video", "new video", "build a video", "video from scratch", "I want to make a video", "help me create a video", or when someone who's never used HyperFrames before arrives with a concept, script, or rough idea and wants a finished MP4. Interviews the user in one pass, then builds the full video with mandatory preview and visual-verification gates.

assafkip/claude-video-editor

Build and iterate short-form vertical (9:16) videos in Hyperframes — TikTok/Reels/Shorts style. Use when Nate says "short-form video", "vertical video", "TikTok/Reels/Shorts", "make a short", "talking-head + motion graphics", or when the target is a 1080x1920 composition with face video + synced scene overlays + karaoke captions. Encodes the full May Shorts 19 playbook: face-mode choreography, audio-synced scene timing, karaoke captions, and the 10-rule quality checklist.

assafkip/claude-video-editor

Edit any video by conversation — the orchestrator for the bundled video pipeline. Use when the user wants to edit, cut, caption, grade, or add motion graphics to footage; drops a folder of clips and says "edit this"; or asks to make a promo/teaser/tutorial/short. Routes to video-use (the cut engine) and HyperFrames (motion-graphics overlays), with a motion-craft library for taste.

assafkip/claude-video-editor

Production pipeline for mathematical and technical animations using Manim Community Edition. Creates 3Blue1Brown-style explainer videos, algorithm visualizations, equation derivations, architecture diagrams, and data stories. Use when users request: animated explanations, math animations, concept visualizations, algorithm walkthroughs, technical explainers, 3Blue1Brown style videos, or any programmatic animation with geometric/mathematical content.

assafkip/claude-video-editor

Capture a website and create a HyperFrames video from it. Use when: (1) a user provides a URL and wants a video, (2) someone says "capture this site", "turn this into a video", "make a promo from my site", (3) the user wants a social ad, product tour, or any video based on an existing website, (4) the user shares a link and asks for any kind of video content. Even if the user just pastes a URL — this is the skill to use.

Skills associés