Communitygithub.com

alecs5am/ralphy

Créez des compositions vidéo, animations, cartons-titres, incrustations, sous-titres, voix off, visuels réactifs à l'audio et transitions de scène en HyperFrames HTML. Utilisez cette compétence pour toute demande de contenu vidéo en HTML, ajout de sous-titres synchronisés, génération de narration par synthèse vocale, animation réactive à l'audio (synchronisation sur le beat, lueur, pulsation musicale), surlignage animé de texte ou transitions entre scènes.

Qu'est-ce que ralphy ?

Cette compétence permet de créer des compositions vidéo complètes directement en HTML en utilisant le framework HyperFrames. Elle couvre l'ensemble du flux de production vidéo : conception de maquettes, animation avec GSAP, synchronisation audio, sous-titres, voix off, et transitions de scène. Le framework traite le HTML comme source de vérité unique, avec des attributs `data-*` pour la synchronisation temporelle et une timeline GSAP pour l'animation. Les compositions sont paramétrables via des variables déclarées, et le système de sous-compositions permet la réutilisation de composants. La compétence suit un processus structuré en trois étapes : (1) établir le système de design via un fichier `design.md` ou des presets visuels, (2) développer l'intention utilisateur via un prompt intermédiaire, (3) planifier la structure, le rythme, le timing et l'animation. Elle impose une règle importante de 'mise en page avant l'animation' pour éviter les chevauchements involontaires. Supporte les environnements CLI via les compétences hyperframes-cli et hyperframes-media.

Compatible avec~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/alecs5am/ralphy/tree/HEAD/.agents/skills/hyperframes

Demander à votre IA préférée

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

Documentation

HyperFrames

Le 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

Découverte (uniquement pour les demandes exploratoires)

Pour les demandes ouvertes ("fais-moi une vidéo de lancement de produit", "crée quelque chose pour notre marque") où l'utilisateur ne s'est pas engagé dans une direction, comprenez l'intention avant de choisir les couleurs :

  • Public — qui regarde ça ? Des développeurs ? Des dirigeants ? Des consommateurs grand public ?
  • Plateforme — où est-ce diffusé ? Réseaux sociaux (15s), page d'accueil du site, démo produit, interne ?
  • Priorité — qu'est-ce qui compte le plus ? La qualité du mouvement ? La précision du contenu ? La fidélité à la marque ? La rapidité ?
  • Variantes — l'utilisateur veut-il des options, ou une seule meilleure version ?

Pour les demandes spécifiques ("ajoute un carton-titre", "corrige le timing de la scène 3"), passez la phase de découverte.

Pour les demandes exploratoires, envisagez de proposer 2 à 3 variantes qui diffèrent significativement — pas seulement des changements de couleur, mais des rythmes, niveaux d'énergie ou approches structurelles différents. Une version sûre/prévue, une version ambitieuse. N'imposez pas ce choix — c'est un outil disponible quand c'est approprié.

Étape 1 : Système de design

Si design.md ou DESIGN.md existe dans le projet, lisez-le d'abord (vérifiez les deux cas — ce sont des fichiers différents sous Linux). C'est la source de vérité pour les couleurs de la marque, les polices et les contraintes. Utilisez ses valeurs exactes — n'inventez pas de couleurs et ne remplacez pas les polices. Tout format fonctionne (frontmatter YAML, prose, tableaux — extrayez simplement les valeurs).

S'il nomme des polices que vous ne trouvez pas localement (pas de répertoire fonts/ avec des fichiers .woff2, ni de police intégrée), avertissez l'utilisateur avant d'écrire du HTML : "design.md spécifie la police [nom de la police] mais aucun fichier de police trouvé. Veuillez ajouter des fichiers .woff2 dans fonts/ ou je me rabattrai sur [alternative intégrée la plus proche]."

Si aucun design.md n'existe, proposez à l'utilisateur un choix :

  1. L'utilisateur a nommé un style ou une ambiance ? → Lisez visual-styles.md pour les 8 presets nommés. Choisissez la correspondance la plus proche.
  2. Souhaitez-vous parcourir les options visuellement ? → Lancez le sélecteur de design : lisez references/design-picker.md pour le flux de travail complet. Cela sert une page de sélection visuelle. L'utilisateur configure l'ambiance, la palette, la typographie et le mouvement dans le navigateur, puis copie le design.md généré et le colle dans la conversation.
  3. Vous voulez passer rapidement ? → Demandez : l'ambiance, clair ou sombre, des couleurs/polices de marque ? Ensuite choisissez une palette dans house-style.md.

design.md définit la marque. Il ne définit pas les règles de composition vidéo. Celles-ci viennent de references/video-composition.md et house-style.md. Utilisez les couleurs de la marque à une échelle adaptée à la vidéo — pas à l'opacité d'une UI web.

Étape 2 : Développement du prompt

Toujours exécuté sur chaque composition (sauf pour les pièces à scène unique et les modifications triviales). Cette étape ancre l'intention de l'utilisateur par rapport à design.md et house-style.md et produit un intermédiaire cohérent que tout agent en aval lira de la même manière.

Lisez references/prompt-expansion.md pour le processus complet et le format de sortie.

Étape 3 : Planification

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 temps émotionnels.
  2. Structure — combien de compositions, lesquelles sont des sous-compositions vs en ligne, quelles pistes transportent quoi (vidéo, audio, incrustations, sous-titres).
  3. Rythme — déclarez votre rythme de scène avant de l'implémenter. Quelles scènes sont des frappes rapides, lesquelles sont des poses, où se placent les shaders, où culmine l'énergie. Nommez le modèle : rapide-rapide-LENT-rapide-SHADER-pose. Lisez references/beat-direction.md pour les modèles de rythme.
  4. Timing — quels clips déterminent la durée, où se placent les transitions, quel est le rythme.
  5. Mise en page — construisez d'abord l'état final. Voir "Mise en page avant l'animation" ci-dessous.
  6. Animation — ajoutez ensuite le mouvement en utilisant les règles ci-dessous.

Construisez ce qui a été demandé. Une demande pour "un carton-titre" n'est pas une demande pour "un carton-titre + 3 scènes supplémentaires + musique d'ambiance + sous-titres." Chaque scène, chaque élément, chaque tween doit gagner sa place. Si des scènes ou éléments supplémentaires amélioreraient réellement la pièce, proposez-les — ne les ajoutez pas.

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

Mise en page avant l'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 cela d'abord 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 que vous les animez vers l'endroit où vous pensez qu'ils doivent atterrir, vous devinez la mise en page finale. Les chevauchements sont invisibles jusqu'au rendu de la vidéo. En construisant l'état final d'abord, vous pouvez voir et corriger les problèmes de mise en page avant d'ajouter du mouvement.

Le processus

  1. Identifiez l'image héroïque de chaque scène — le moment où le plus d'éléments sont simultanément visibles. C'est la mise en page que vous construisez.
  2. Écrivez le CSS statique pour cette image. Le conteneur .scene-content DOIT remplir la scène entière avec width: 100%; height: 100%; padding: Npx; avec display: flex; flex-direction: column; gap: Npx; box-sizing: border-box. Utilisez padding pour pousser le contenu vers l'intérieur — JAMAIS position: absolute; top: Npx sur un conteneur de contenu. Les conteneurs de contenu en position absolue débordent lorsque le contenu est plus grand 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 l'état hors écran/invisible VERS la position CSS. La position CSS est la vérité de base ; le tween décrit le voyage pour y arriver. (Dans les sous-compositions chargées via data-composition-src, préférez gsap.fromTo() — voir les règles GSAP de charge dans references/motion-principles.md.)
  4. Ajoutez les sorties avec gsap.to() — animez VERS l'état 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 s'adapte à toute 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 : Animez 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 : Animez HORS de 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 les éléments partagent 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 mise en page, 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, ombres, motifs d'arrière-plan) et les conceptions en pile-z (piles de cartes, couches de profondeur) sont intentionnels. L'étape de mise en page consiste à détecter les chevauchements non intentionnels — deux titres atterrissant l'un sur l'autre, une statistique couvrant une étiquette, du 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. Vidéo/audio par défaut : durée du média.
data-track-indexOuiEntier. Les clips sur la même piste ne peuvent pas se chevaucher.
data-media-startNonDécalage de coupe 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-startOuiTemps de début (composition racine : utilisez "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
data-variable-valuesNonObjet JSON des remplacements de variables par instance sur un hôte de sous-comp

Sur l'élément racine <html> :

AttributRequisValeurs
data-composition-variablesNonTableau JSON des variables déclarées (id/type/label/default) — pilote l'UI d'édition Studio et fournit les valeurs par défaut pour getVariables()

Structure de la composition

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

Structure de la sous-composition :

<template id="my-comp-template">
  <div data-composition-id="my-comp" data-width="1920" data-height="1080">
    <!-- contenu -->
    <style>
      [data-composition-id="my-comp"] {
        /* styles limités à ce scope */
      }
    </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 });
      // tweens...
      window.__timelines["my-comp"] = tl;
    </script>
  </div>
</template>

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

Variables (compositions paramétrées)

Rendez la même composition avec un contenu différent — titre, couleur de thème, prix, sous-titres — sans modifier le HTML source.

Modèle en trois étapes :

  1. Déclarez les variables sur la racine <html> de la composition avec data-composition-variables. Chaque entrée nécessite id, type (parmi string, number, color, boolean, enum), label et default. Les entrées de type enum nécessitent également options: [{value, label}, ...].
  2. Lisez les valeurs résolues dans le script de la composition avec window.__hyperframes.getVariables(). Retourne le résultat fusionné des valeurs par défaut déclarées + des remplacements par instance + des remplacements CLI.
  3. Remplacez au moment du rendu avec npx hyperframes render --variables '{...}' (niveau supérieur) ou avec data-variable-values='{...}' sur l'élément hôte (par instance pour les sous-comps).
<!doctype html>
<html
  data-composition-variables='[
  {"id":"title","type":"string","label":"Titre","default":"Bonjour"},
  {"id":"theme","type":"enum","label":"Thème","default":"light","options":[
    {"value":"light","label":"Clair"},
    {"value":"dark","label":"Sombre"}
  ]}
]'
>
  <body>
    <div data-composition-id="root" data-width="1920" data-height="1080">
      <h1 id="hero" class="clip" data-start="0" data-duration="3"></h1>
      <script>
        const { title, theme } = window.__hyperframes.getVariables();
        document.getElementById("hero").textContent = title;
        document.body.dataset.theme = theme;
      </script>
    </div>
  </body>
</html>
# L'aperçu de développement utilise les valeurs par défaut déclarées
npx hyperframes preview

# Rendu avec remplacements
npx hyperframes render --variables '{"title":"Rapport Q4","theme":"dark"}' --output q4.mp4

# Ou à partir d'un fichier JSON
npx hyperframes render --variables-file ./vars.json

Valeurs par instance de sous-composition : le même getVariables() fonctionne dans les sous-comps chargées via data-composition-src. Chaque élément hôte transmet ses propres valeurs :

<div
  data-composition-id="card-pro"
  data-composition-src="compositions/card.html"
  data-variable-values='{"title":"Pro","price":"29€"}'
></div>
<div
  data-composition-id="card-enterprise"
  data-composition-src="compositions/card.html"


…

[tronqué pour la traduction]

Individual skills in this repo

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

alecs5am/ralphy

>- Composition and render craft — assembles scenario.json plus asset-manifest.json into a HyperFrames HTML composition and renders the mp4. Owns timing, transitions, captions, audio mix and ducking, the green zone, the render pipeline, and VO sync. Generates no media of its own. USE WHEN the user asks to "compose the video", "render", "preview", "fix the captions", "mix the audio", "tighten the transitions", "final cut", or edits HyperFrames composition code. TRIGGER (EN): "render it", "compose the video", "captions", "audio mix", "transitions", "final cut", "preview the composition".

alecs5am/ralphy

HyperFrames CLI dev loop — `npx hyperframes` for scaffolding (init), validation (lint, inspect), preview, render, and environment troubleshooting (doctor, browser, info, upgrade). Use when running any of these commands or troubleshooting the HyperFrames build/render environment. For asset preprocessing commands (`tts`, `transcribe`, `remove-background`), invoke the `hyperframes-media` skill instead.

alecs5am/ralphy

Asset preprocessing for HyperFrames compositions — text-to-speech narration (Kokoro), audio/video transcription (Whisper), and background removal for transparent overlays (u2net). Use when generating voiceover from text, transcribing speech for captions, removing the background from a video or image to use as a transparent overlay, choosing a TTS voice or whisper model, or chaining these (TTS → transcribe → captions). Each command downloads its own model on first run.

alecs5am/ralphy

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.

alecs5am/ralphy

>- How to make a vivid, character-driven brand POSTER — a single still image, not a video. A generalized overlay on the art-director step: supplies the poster-as-landing architecture (top banner → massive beveled wordmark → chest-up hero photo → scattered vinyl-sticker collage → copy block → thin footer strip), the parameterized slot set (brand, exclamation word, hero, product, palette, original blob glyph, aesthetic register), the model stack (gpt-5.4-image-2 for crisp typography, gemini fallback), and the niche's failure modes. Works for ANY brand and ANY aesthetic the user names — Y2K streetwear, vaporwave, grunge zine, clean DTC — the skill supplies the layout know-how, the user supplies the subject + vibe. USE WHEN the user asks for a poster / flyer / drop poster / "poster-as-landing-page" / brand key-art / album-cover-style still / hype graphic, with no specific existing poster to reproduce. This is a content-niche craft-overlay SKILL (generalized), loaded on top of a poster-format template match — n...

alecs5am/ralphy

>- Compatibility shim for the legacy `/ralphy-remotion` skill name. Use when a saved Claude Code command, old project note, or user request still mentions Ralphy Remotion; redirect the task to HyperFrames and the current Ralphy render playbooks instead of authoring new Remotion code.

alecs5am/ralphy

>- Compatibility shim for the legacy `/remotion-to-hyperframes` skill name. Use when an old project, note, or user request asks to migrate Ralphy Remotion work; translate the intent into the current HyperFrames composition model and follow the editor and HyperFrames playbooks.

alecs5am/ralphy

The full extract → classify → blueprint → de-dup → publish pipeline for a finished `.ralphy/workspaces/<ws>/projects/<id>/`. Reads its `units/*/unit.json` (#069) as the Unit source of truth, then factors the project into ALL FIVE entities — Unit + the four typed blocks Template (structure), Style (look), Recipe (effect/treatment), Asset (reusable media). Applies the recipe-vs-tag split (#082/#083): a candidate is a Recipe only if it carries an extractable artifact (ffmpeg filtergraph / HyperFram

alecs5am/ralphy

>- How to make a realistic AI UGC ad for a product — generalized niche know-how that looks real and doesn't feel AI. A domain overlay on the standard pipeline: supplies the shooting-script shape (timestamp | VO | shot | mannerism), the creator-persona build, the problem-mirror hook, the trust-through-mannerisms rule, and the 9:16 ~15s UGC format defaults. Works for ANY product the user names — their skincare line, a no-name app, a gadget. The skill supplies the know-how; the user supplies the product. USE WHEN the user asks for a UGC ad / creator-style product ad / "make an ad that looks like a real person reviewing my product" / testimonial-style or problem-solution short for TikTok / Reels / Shorts, with no specific existing video to reproduce. This is a niche SKILL (generalized), not a remix TEMPLATE. For "remix this exact ad but swap the product/person", use the remix path (docs/skills-vs-templates.md). For swapping the creator in an existing clip, see /ugc-model-swap.

alecs5am/ralphy

When the user needs marketing ideas, inspiration, or strategies for their SaaS or software product. Also use when the user asks for 'marketing ideas,' 'growth ideas,' 'how to market,' 'marketing strategies,' 'marketing tactics,' 'ways to promote,' 'ideas to grow,' 'what else can I try,' 'I don't know how to market this,' 'brainstorm marketing,' or 'what marketing should I do.' Use this as a starting point whenever someone is stuck or looking for inspiration on how to grow. For specific channel execution, see the relevant skill (paid-ads, social-content, email-sequence, etc.).

alecs5am/ralphy

Full end-to-end workflow for generating a realistic AI UGC ad for a product. 15-second format. Looks real. Doesn't feel AI.

Skills associés