Installations du plugin : Avant les commandes de configuration ou de mise à jour, suivez les règles d'installation du plugin lorsque ce skill se trouve à l'intérieur d'un plugin HyperFrames. Les installations autonomes conservent les instructions de mise à jour ci-dessous.
Tout d'abord, gardez ce skill à jour — confirmez avec l'utilisateur avant d'exécuter :
npx hyperframes skills update faceless-explainer. Une opération rapide et sans effet si tout est à jour ; sinon, cela rafraîchit ce skill ainsi que les skills du domaine central dont il dépend, avant de les utiliser.
media-use : Avant de sourcer des fichiers audio, images ou logos, appelez
/media-usepour trouver la BGM, les effets sonores et les images du catalogue HeyGen, ainsi que les logos de marque provenant de leurs sources officielles. Exécutez--adoptd'abord pour enregistrer les ressources existantes. Voir le skill/media-use. Lorsque l'application hôte fournit ses propres outils de musique ou d'effets sonores, utilisez-les pour la musique et les effets sonores.
Explainer sans visage vers HyperFrames
Utilisez ce skill pour transformer un corps de texte en vidéo explicative : choisissez un système de design, planifiez une histoire pédagogique, et construisez-la image par image dans HyperFrames. Sans visage signifie que chaque visuel est inventé en aval — il n'y a pas d'étape de capture et pas d'inventaire d'actifs réel.
La porte d'entrée est
/hyperframes. Vous êtes l'orchestrateur. Exécutez chaque étape, vérifiez sa porte, et continuez seulement après. Ce skill est destiné à expliquer un sujet à partir d'un texte, sans produit et sans site web à capturer. Pour toute autre intention, une simple demande "faire une vidéo", ou en cas de doute → lisez/hyperframesen premier — la couche d'intention possède chaque décision de routage, et une nouvelle création arrivant ici sansBRIEF.mdpassera de toute façon par elle (règle d'ouverture de la configuration).
Vous êtes l'orchestrateur. Travaillez dans videos/<project>/. Exécutez les étapes dans l'ordre et passez chaque porte avant de continuer. Les étapes gérées par l'utilisateur sont l'étape 0, l'étape 3 et l'étape 6. Lisez ../hyperframes/references/brief-contract.md avant l'étape 0 — il définit les types de portes et comment flow/storyboard de BRIEF.md dérivent le mode qui régit les portes des étapes 3, 4 et 6. Effectuez vous-même chaque étape, sauf l'étape 5, où vous déléguez un sous-agent par image. Ne mettez pas de règles de design ou d'animation ici ; elles se trouvent dans le sous-agent de travail des images, dans ../hyperframes-animation/rules/ + ../hyperframes-animation/blueprints/ de ce skill, et dans hyperframes-creative.
Flux de travail : Étape 0 configuration → hyperframes.json ; Étape 1 brief → capture/extracted/ ; Étape 2 système de design → frame.md ; Étape 3 storyboard/script → STORYBOARD.md et SCRIPT.md ; Étape 3.1 audio → audio_meta.json ; Étape 4 design visuel → STORYBOARD.md enrichi ; Étape 5 images → compositions/frames/NN-*.html et index.html ; Étape 6 rendu final → renders/video.mp4.
Étape 0 : Configuration
Objectif : Arriver avec un brief confirmé, créer le projet HyperFrames, et rendre le brief durable.
Le brief est confirmé par la couche d'intention, non par des questions posées ici. Règle d'ouverture, dans l'ordre : (1) BRIEF.md existe → lisez-le et ne posez aucune question — le brief est réglé, et son flow/storyboard dérivent le mode (contrat de brief § 1). (2) Pas de BRIEF.md mais le projet existe (hyperframes.json / STORYBOARD.md sur le disque) → reprenez à partir du frontmatter du storyboard et des préférences enregistrées ; ne réinterrogez jamais un projet à moitié construit. (3) Ni l'un ni l'autre — une demande de nouvelle création arrivée directement ici → lisez /hyperframes et exécutez sa couche d'intention (references/intent-interview.md) : elle vérifie les recettes et les valeurs par défaut mémorisées, mène les questions de cette route (../hyperframes/references/routes/faceless-explainer.md), et rend le brief verrouillé. Les demandes de modification sautent tout cela — allez faire la modification.
Initialisez uniquement si hyperframes.json est manquant. Nommez <project> à partir du sujet en kebab-case, par exemple compound-interest-explained ; n'utilisez jamais le nom de l'espace de travail ou un horodatage.
npx hyperframes init "videos/<project>" --non-interactive --example=blank --skill=faceless-explainer — init vérifie les skills installés par rapport aux dernières versions sur GitHub et met à jour l'ensemble global si certains sont obsolètes.
Après l'initialisation, laissez <PROJECT_ROOT> être videos/<project> et exécutez chaque commande de chemin relatif suivante avec ce répertoire comme répertoire de travail. Dans les commandes ci-dessous, . signifie <PROJECT_ROOT> ; n'écrivez jamais .media, capture ou des fichiers de sortie dans le répertoire appelant.
Écrivez BRIEF.md immédiatement après l'initialisation (jamais avant — init refuse un répertoire non vide) : le brief verrouillé par la couche d'intention, format selon ../hyperframes/references/brief-format.md. Résolvez <MEDIA_DIR> comme le répertoire d'installation du skill /media-use. Ensuite, enregistrez chaque réponse basée sur les préférences avec node <MEDIA_DIR>/scripts/prefs.mjs record --hyperframes . (brief-format.md nomme le sous-ensemble). Si la couche d'intention a adopté une recette, exécutez node <MEDIA_DIR>/scripts/recipe.mjs use --hyperframes . --name <name> ; elle copie son frame.md dans le projet (l'étape 2 est alors ignorée) et renvoie les squelettes à partir desquels les brouillons de l'étape 3 sont réalisés. Une recette remplit les réponses, pas les approbations ; les portes de révision s'exécutent toujours.
Affichez le statut de connexion avant de continuer après la configuration — exécutez npx hyperframes auth status et relayez sa sortie textuellement. Il indique si la voix/BGM utilisera les moteurs HeyGen ou locaux et, en cas de déconnexion, comment se connecter. Appliquez une branche :
- Collaboratif : attendez que l'utilisateur se connecte ou choisisse explicitement
offline/go. - Autonome : indiquez le statut et continuez via les moteurs locaux disponibles.
Ne masquez pas silencieusement une capacité requise lorsqu'aucun fournisseur hors ligne n'existe ; faites apparaître le blocage. N'intégrez pas cette décision dans une autre question et n'écrivez pas de clés dans un .env propre au dépôt. Propriété de l'authentification et solutions de repli hors ligne : /media-use references/setup-providers.md § Fournisseurs.
Porte : hyperframes.json et BRIEF.md existent ; les réponses basées sur les préférences ont été enregistrées (contrat de brief § 2) ; le statut de connexion a été affiché (connecté, ou poursuivi hors ligne).
Étape 1 : Brief (pas de capture)
Objectif : Intégrer le texte de l'utilisateur dans le projet comme source d'information. Il n'y a pas de capture de site web et pas de ressources réelles — c'est un explainer sans visage.
Enregistrez l'entrée complète de l'utilisateur textuellement, puis créez manuellement le package de capture synthétique :
capture/extracted/visible-text.txt— l'article / les notes / le sujet / le brief complets, textuellement. C'est la source d'information, pas un modèle d'histoire (l'étape 3 le remodèle).capture/extracted/tokens.json—{ "title": "", "description": "", "colors": [], "fonts": [] }. Remplisseztitle/descriptionà partir du brief. Laissezcolors/fontsvides à moins que l'utilisateur n'ait explicitement donné des couleurs ou polices de marque — ajoutez-les alors (le préréglage de design fournit une palette complète dans tous les cas).
Si l'utilisateur a collé un script ou souhaite que son texte soit conservé, enregistrez-le textuellement sous user_script.txt ; VO_MODE (textuel ou restructuré) provient de BRIEF.md — la couche d'intention le demande lorsqu'un script arrive. Demandez une fois ici uniquement si le brief manque de cela, et stockez la réponse pour l'étape 3.
N'exécutez pas npx hyperframes capture (il n'y a pas d'URL). Ne créez pas asset-descriptions.md et ne remplissez pas capture/assets/ — les visuels sans visage sont inventés aux étapes 4-5, pas capturés. La seule exception : si l'utilisateur a fourni une image réelle, placez-la sous public/<basename> et notez-la pour l'étape 3.
Porte : capture/extracted/visible-text.txt et capture/extracted/tokens.json existent ; vous pouvez énoncer le sujet de l'explainer et son audience en une phrase claire.
Étape 2 : Système de design
Objectif : Choisir un préréglage d'image livré ; un script le transforme en frame.md + skin de légende de cette vidéo.
Lorsque BRIEF.md nomme un style_preset — l'utilisateur l'a choisi visuellement parmi les présentations au niveau de la couche d'intention — utilisez-le ; le jugement vous appartient uniquement lorsque le brief est silencieux. Ensuite, vous faites le seul appel — quel préréglage : lisez ../hyperframes-creative/references/design-spec.md et parcourez ../hyperframes-creative/frame-presets/ ; choisissez le préréglage dont le look correspond le mieux au sujet, au ton et à l'audience. Exécutez ensuite :
node <SKILL_DIR>/scripts/build-frame.mjs --preset <name> --hyperframes .
Le script fait le reste de manière déterministe : copie le FRAME.md du préréglage vers frame.md et le remixe sur tous les jetons de marque dans capture/extracted/tokens.json (couleurs de marque mappées sur les touches de couleur du préréglage par rôle ; les polices d'affichage + corps du préréglage échangées contre celles de la marque), copie le skin de légende du préréglage vers .hyperframes/caption-skin.html, et s'auto-valide (sort avec 1 en cas de mapping cassé). Continuez dès qu'il sort avec 0 — pas de modification manuelle de la spécification.
Un explainer sans visage n'a généralement pas de couleurs/polices de marque (les couleurs/polices de tokens.json sont vides) → le script conserve la propre palette du préréglage, un design livrable complet. Uniquement lorsque l'utilisateur a nommé des couleurs/polices de marque, ajoutez-les à tokens.json avant l'exécution, et ajustez frame.md manuellement après si un mapping le nécessite vraiment.
Porte : build-frame.mjs est sorti avec 0 — frame.md existe à partir d'un préréglage nommé, et (lorsque le préréglage en livre un) .hyperframes/caption-skin.html existe comme source du skin de légende ; le préréglage choisi a été enregistré comme préférence (--key style_preset --workflow <ce workflow>, contrat de brief § 2).
Étape 3 : Storyboard et script
Objectif : Transformer le texte en un plan d'enseignement image par image approuvé.
Lisez ../hyperframes-creative/references/story-spine.md (langage d'accroche, valeur avant preuve, storyboard comme proposition, visuels traçables à la source), references/story-design.md, ../hyperframes-animation/blueprints-index.md, ../hyperframes/references/storyboard-format.md et ../hyperframes/references/script-format.md. Utilisez-les pour écrire STORYBOARD.md et, lorsqu'une narration est nécessaire, SCRIPT.md. Définissez la duration: du frontmatter à partir du length du brief — une attente approximative ; l'assemblage indique où la coupe atterrit par rapport à cela.
Utilisez story-design.md pour la structure de l'explainer (concept / tutoriel / liste / histoire), la stratégie d'accroche, les techniques de clarté, les moments émotionnels, le mapping d'énumération des types et VO_MODE. La séquence de la vidéo provient de la conception narrative, non de l'ordre des paragraphes du texte d'entrée — réordonnez, fusionnez, omettez, compressez. Comme guide souple, consultez le menu rôle→plan dans ../hyperframes-animation/blueprints-index.md : pour chaque temps, écrivez la voix off dans la forme qu'implique son plan candidat et étiquetez cet identifiant blueprint: candidat lorsque cela convient. La vérité pédagogique décide toujours quels temps existent — ne forcez jamais un temps à s'adapter à un plan, et n'inventez jamais un temps simplement parce qu'une forme éprouvée est disponible. Les visuels sans visage sont inventés en aval, donc les images ne portent pas d'inventaire de ressources : laissez asset_candidates vide à moins que l'utilisateur n'ait fourni une image public/<basename> réelle. Utilisez les champs exacts requis par les références du storyboard et du script.
Après la rédaction, exécutez le passage de planification de la boucle de révision — ../hyperframes/references/review-loop.md § 1 : présentez le plan comme une proposition, et posez les deux questions — approuver ou modifier, et les esquisses d'abord (recommandé) ou passer. Les commentaires arrivent sous forme de réponse dans le chat ; bouclez jusqu'à approbation. C'est une porte de point de contrôle (contrat de brief § 1) : en mode autonome, il n'y a rien à demander — publiez le même résumé comme un avertissement et continuez ; les esquisses se fondent dans la construction, et l'aperçu final avec sa question unique arrive à l'étape 6.
Porte : STORYBOARD.md existe, chaque image a les champs narratifs requis, SCRIPT.md existe lorsque la narration est nécessaire, et l'utilisateur a approuvé le plan image par image (autonome : le résumé a été publié comme avertissement).
Étape 3.1 : Audio
Objectif : Générer la narration, les timings des mots, la musique et les métadonnées audio à partir du script approuvé.
Démarrez l'audio après l'approbation de l'étape 3. Exécutez-le en arrière-plan, puis continuez à l'étape 4. (Le statut de connexion a déjà été affiché à l'étape 0 ; le moteur tombe automatiquement en mode hors ligne.)
Choisissez la voix de narration à partir de la demande de l'utilisateur avant d'invoquer. Si la demande nommait une voix, un genre ou un ton, choisissez un identifiant de voix correspondant et passez-le avec --voice <id>. La valeur par défaut du pipeline est par ailleurs Marcia (féminin) sur HeyGen / am_michael sur Kokoro — donc une demande comme "une voix masculine" est ignorée silencieusement à moins que vous ne passiez l'indicateur. Les identifiants de voix sont spécifiques au fournisseur ; résolvez par rapport au fournisseur que le statut de connexion de l'étape 0 a sélectionné : HeyGen (connecté) via node <MEDIA_DIR>/audio/scripts/heygen-tts.mjs --list (ou GET /v3/voices?engine=starfish) ; Kokoro (hors ligne) via la table des voix dans <MEDIA_DIR>/audio/references/tts.md (préfixes am_/bm_ masculin, af_/bf_ féminin). Lorsque l'utilisateur n'a exprimé aucune préférence, revenez à la voix mémorisée (contrat de brief § 2) avant la valeur par défaut du pipeline, et dites laquelle vous avez utilisée ; omettez --voice uniquement lorsque ni l'une ni l'autre n'en nomme une. Lorsque l'utilisateur a explicitement choisi une voix lors de cette exécution, enregistrez-la (prefs.mjs record --key voice).
node <SKILL_DIR>/scripts/audio.mjs --script ./SCRIPT.md --storyboard ./STORYBOARD.md --hyperframes . --out ./audio_meta.json --voice <voice-id> &
Le script audio gère la narration, les timings des mots, la recherche de BGM à partir de la bibliothèque musicale de HeyGen et les métadonnées de timing. L'ambiance BGM provient du champ music: du storyboard.
Lorsque les propres outils de l'application hôte génèrent la musique ou un effet sonore, placez le fichier sous assets/ et listez-le dans le fichier audio_meta.json marqué "source": "host" : la musique en tant que bgm { "path": "assets/…", "source": "host" } avec music: none dans le storyboard ; un son en tant qu'entrée sfx { "frame": <n>, "file": "assets/…", "offset_s": 0, "duration_s": <sa longueur>, "source": "host" }. Chaque passage audio conserve ceux-ci, et une image avec un son hôte n'obtient aucun signal recherché.
S'il n'y a pas de narration et pas de SCRIPT.md, sautez la génération vocale. La BGM peut toujours s'exécuter si le storyboard a une ambiance musicale.
Le marqueur de silence complet canonique (partagé entre les flux de travail qui réutilisent ce modèle audio) : music: none dans le bloc YAML supérieur de STORYBOARD.md, pas de SCRIPT.md, et pas de signaux sfx: ou d'audio hôte. Cette combinaison marque le projet comme silencieux — n'exécutez pas du tout le script audio, et définissez les métadonnées audio sur un état vide ; les images composent sans aucune piste. Lorsque cette condition échoue partiellement, traitez chaque composant qui existe.
Étape 4 : Design visuel
Objectif : Étendre le storyboard avec des croquis, améliorer les décisions de composition d'image et finaliser l'ambiance visuelle.
Exécutez node <SKILL_DIR>/scripts/sketch.mjs --source /dev/stdin --target ./STORYBOARD.md --hyperframes . en utilisant le STORYBOARD.md actuel <précédent le lancement ; le script :
- Lit la conception narrative de chaque image (type de plan, éléments d'écran dans
narrative_fields, mots-clés thématiques dansconcept.keywordset l'identifiantblueprint:de l'étape 3, le cas échéant). - Consulte
../hyperframes-creative/frame-presets/<style_preset>/composition-blueprints/pour les mises en page candidates et leurs projections de zones. - Crée jusqu'à 3 croquis pour les images qui en manquent : séquence brute dans l'ordre des images, sous la forme de commentaires HTML en ligne avant chaque image dans le storyboard (champ
sketch_annotations), utilisant les zonescontentetdecorationdes plans de composition pour décrire la densité d'interface et l'emplacement des éléments. - Examine les zones d'information que chaque image doit véhiculer (champ
narrative_fields) et associe au moins une entrée danscompositions_indexqui nomme ces zones (par exemplecontent,decoration,overlay). - Sort un état enrichi de
STORYBOARD.mdavec les champssketch_annotations,compositions_index, etvisual_notesremplis ; valide que chaque image a ces trois champs désormais remplis.
Porte : Le script est sorti avec 0 ; chaque image a les champs sketch_annotations, compositions_index et visual_notes — et, lorsque l'étape 3 a approuvé les esquisses en premier, toutes les images (toutes) ont des croquis de composition (la boucle de révision a choisi l'option rapide aussi).
Étape 5 : Images
Objectif : Déléguer chaque image à son propre sous-agent worker pour composer HTML, CSS et JavaScript animé dans son espace de noms local. Les images sont sans arrière-plan : le moteur de rendu les compose sur un fond de scène (fond HeyGen, canevas HTML, fichier image ou couleur unie). Pour les détails sur le fond, voir references/composition-pipeline.md § Fond de scène.
Divisez STORYBOARD.md en N fichiers image : un fichier NN-SLUG.json par image dans compositions/ (format à partir de references/composition-pipeline.md). Chaque fichier contient tout ce dont le sous-agent a besoin : champs narratifs, mots-clés, références de plan de composition, choix de fond, visual_notes finalisé, et un identifiant frame_uuid unique.
Ensuite, pour chaque image en parallèle, générez un sous-agent worker spécifique à l'image (OpenAI Responses API, instructions système depuis references/frame-worker-prompt.md, chaque appel reçoit son fichier .json individuel et le chemin complet <PROJECT_ROOT>/compositions/frames/). Chaque sous-agent worker :
- Lit son fichier image JSON d'entrée (chemin passé dans l'appel, lu depuis
fs). - Génère
NN-SLUG.htmldans<PROJECT_ROOT>/compositions/frames/. (Le cadre est argument du sous-agent ; sonSTORYBOARD.mdcomplet peut ne pas tenir dans le contexte, donc le JSON concentré évite les coupures.) - Lit
frame.mddu projet (pas du préréglage —build-frame.mjsl'a déjà copié et remixé). - Lit
.hyperframes/caption-skin.htmlpour que toute légende animée de l'image suive le système de design. - Génère une animation de légende autonome (CSS + JS) pour l'image si le scénario l'exige — les workers gèrent le timing des mots dans une légende animée : lecture du timing chargé (conçu pour être intégré, par exemple
window.__WORDS_TIMING = <tranche de temps>), mise en évidence des durées de mot pendant la durée de la légende. La logique d'animation de légende dépend entièrement du worker ; seul le signal "cette image a une légende" est écrit dans le topic de sortie. - La tâche de police des mots clés est gérée par chaque worker : il ne s'agit pas d'un fichier partagé, donc chaque image qui en a besoin obtient sa propre police rendue dans la composition de l'image ; le stockage et la distribution de la police sont atomiques par image.
- Sort un fichier composé complet, prêt à être visualisé dans
index.html. - Peut lire n'importe quelle image
public/ou fichier audioassets/que cette image référence. - Écrit un court topic (fichier, 512 octets max) à
<PROJECT_ROOT>/compositions/topics/NN-SLUG.topicavec{ frame_uuid, slug, concept, fields, caption, dialog }pour que le compilateur assemble des transitions cross-image.
Bloc try/catch autour des appels image : chaque image s'exécute dans une promesse indépendante ; si l'une échoue, une entrée de journal est écrite (compositions/logs/NN-SLUG.error) et les images restantes continuent. Aucune image ne bloque les autres.
Vérification asynchrone de complétude : après que tous les workers ont résolu, vérifiez que les fichiers NN-*.html existent en dessous du seuil : 80 % des images prévues doivent exister — sinon, signalez un échec critique au compilateur. Lorsque le seuil est atteint, signalez toute image manquante comme des trous que le compilateur peut combler avec un espace réservé (fond nu, numéro d'image uniquement).
Porte : 80 % des NN-*.html prévus existent ; compositions/topics/ a un fichier .topic pour chaque image contenue et pour chaque image manquante (topic factice avec caption: false et error: true).
Étape 5.5 : Construire l'aperçu local de la piste
Objectif : Assembler index.html dans le répertoire racine du projet pour un aperçu local de la séquence et des transitions. C'est une piste brute, pas un rendu final ; le compilateur d'image gère la fiabilité cross-navigateur, les chutes et les résiliences de la couche de lecture.
Exécutez node <SKILL_DIR>/scripts/compile-preview.mjs --hyperframes . --project-index compositions/topics/ --output ./index.html : il lit les fichiers .topic, rassemble les chemins des images, émet la navigation dans l'ordre, et espace les images manquantes avec des cartouches de trou. Le HTML résultant est destiné à la visualisation, pas à la vidéo ; il peut être chargé dans un navigateur pour une révision locale.
Porte : index.html existe, tous les fichiers image présents sont liés, les trous sont marqués. (N'enregistrez pas de préférence ici — le test est binaire.)
Étape 6 : Rendu final
Objectif : Rendre la piste assemblée dans un fichier vidéo et suivre le fork feedback → fin → corriger.
Exécutez la boucle de montage finale ../hyperframes/references/review-loop.md § 2 : présentation complète avec l'aperçu local de la piste. Posez la question — approuver, changer, ou corriger. C'est une porte d'engagement (contrat de brief § 1) : en mode autonome, approuvez-la silencieusement, passez au rendu final et quittez.
Sur ordre d'approbation, exécutez npx hyperframes compose --hyperframes . --frames compositions/frames/ --render ./renders/video.mp4 — il compile toutes les images, lace l'audio (audio_meta.json), applique les transitions, et rend un fichier H.264 dans <PROJECT_ROOT>/renders/. Si l'audio est toujours en cours d'exécution en arrière-plan (étape 3.1), attendez son achèvement avant de lancer le rendu ; ne commencez pas à composer avant que audio_meta.json n'existe.
Une fois terminé, confirmez que renders/video.mp4 existe (non nul). Dire au revoir et sortez. Quand la tâche dit changer (modifications non mentionnées dans les commentaires initiaux) ou corriger (le correctif est clair à partir des commentaires), suivez la boucle de révision : modifications → cycle retour à l'étape 5 ; correctifs → cycle retour à l'étape 0. Tout autre commentaire est traité comme un changement et retourne à l'étape 4.
Porte : renders/video.mp4 existe, le fichier a une taille non nulle, et vous avez salué l'utilisateur.
Fichiers d'état du projet
<PROJECT_ROOT>/hyperframes.json— Configuration du projet et version du skill.<PROJECT_ROOT>/BRIEF.md— Brief verrouillé avec les décisions de flux et de storyboard.<PROJECT_ROOT>/frame.md— Spécification du système de design (préréglage sélectionné, tokens de marque éventuels).<PROJECT_ROOT>/.hyperframes/caption-skin.html— Skin de légende adapté du préréglage.<PROJECT_ROOT>/STORYBOARD.md— Storyboard approuvé, enrichi visuellement.<PROJECT_ROOT>/SCRIPT.md— Script de narration (lorsqu'il existe).<PROJECT_ROOT>/audio_meta.json— Fichier de métadonnées audio (généré et utilisé par le pipeline).<PROJECT_ROOT>/capture/extracted/visible-text.txt— Texte source brut.<PROJECT_ROOT>/capture/extracted/tokens.json— Métadonnées du texte source (titre, description, jetons de marque éventuels).<PROJECT_ROOT>/compositions/frames/— Images composées (fichiersNN-*.html).<PROJECT_ROOT>/compositions/topics/— Fichiers de sujets pour l'assemblage des images.<PROJECT_ROOT>/index.html— Aperçu local de la piste.<PROJECT_ROOT>/renders/video.mp4— Rendus vidéo finaux.