Communitygithub.com

flaunt

Analyse le code source d'un projet, identifie ses fonctionnalités clés, rédige un scénario, puis pilote l'application réelle à travers des flux en direct pour produire une vidéo de lancement de 25 à 40 secondes, synchronisée sur la musique et au thème du produit.

Qu'est-ce que flaunt ?

flaunt est un outil puissant conçu pour les développeurs et les équipes produit qui souhaitent créer automatiquement des vidéos de démonstration ou de lancement à partir de leur application réelle, sans aucun montage manuel. Le processus commence par une analyse approfondie du code source pour comprendre le produit, son public, sa catégorie et ses capacités. Ensuite, une hiérarchie est établie parmi ces capacités pour déterminer ce qui doit être montré dans la vidéo. flaunt écrit un script narratif (une histoire) et pilote l'application via des flux en direct avec Playwright, en effectuant des interactions réelles (saisie, navigation, clics) pour capturer des séquences authentiques. Il fonctionne exclusivement sur des serveurs locaux (localhost) et refuse d'utiliser des services payants ou externes pendant l'enregistrement, garantissant ainsi la sécurité et la confidentialité des données. La sortie est une vidéo de 23 à 40 secondes, synchronisée sur un rythme musical, avec le thème et le logo du produit, accompagnée d'un texte de publication. flaunt est idéal pour les projets Node.js avec une barre de qualité élevée, comme en témoigne le guide `references/craft.md`. Il supporte les modes `localhost`, `127.0.0.1` et `*.test`, et nécessite Node 20+, FFmpeg et Playwright. Les arguments optionnels permettent de personnaliser le style visuel (`bold`, `calm`, etc.), le format d'image (`wide`, `tall`), la durée cible, et même de se concentrer sur les changements depuis un tag git avec `--since <ref>`.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SaquibPM/flaunt/tree/HEAD/skills/flaunt

Demander à votre IA préférée

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

Documentation

Que fait flaunt ?

Vous êtes un marketeur produit et un monteur vidéo. Vous ne filmez pas n'importe quels écrans qui ont l'air jolis. Vous :

  1. Lisez le code source et décidez ce qu'est le produit réellement (objectif, public, catégorie).
  2. Classez ses capacités par importance (ce que la vidéo doit montrer, ce qu'elle peut mentionner, ce qu'elle omet).
  3. Écrivez un script (une histoire), pas une liste de plans.
  4. Pilotez la vraie application à travers des flux en direct : elle doit donner l'impression d'un système fonctionnel, jamais d'un diaporama de captures d'écran.
  5. Montez le tout avec le thème et le logo du produit.

Lisez references/craft.md (le niveau de qualité) avant de planifier. Tout atterrit à côté de shotlist.json (par défaut ./.flaunt/) :

.flaunt/
  inventory.json    analyse automatique du code source (scripts/inventory.mjs)
  product-map.md    objectif, public, catégorie, capacités par niveau, avec preuves
  script.md         l'histoire : scène par scène, ce qui est montré, ce qui est dit, pourquoi
  shotlist.json     le plan exécutable (marque, accroche, flux en direct, statistiques, carte de fin)
  facts.md          chaque affirmation de la vidéo liée à un fichier ou à des séquences
  assets/ footage/  logo ; une séquence brute par flux
  flaunt.mp4  post.md

Arguments (tous optionnels)

OptionSignificationValeur par défaut
--style <nom>bold, calm, techy, warmbold
--shape <nom>wide 16:9, tall 9:16, square 1:1wide
--length <sec>Durée cible, 23-40autant de temps que l'histoire le nécessite, <= 40
--tagline <texte>Ligne de catégorie sur la carte de findérivée du produit ; confirmez avec l'utilisateur en cas de doute
--since <réf>Changements de fonctionnalités depuis un tag/commit/date gitdésactivé
--url <url>Utilise une application locale déjà en cours d'exécutiondésactivé
--link <texte>URL/commande sur la carte de finaucun
--silentPas de bande-sondésactivé
--dir <chemin>Dossier du projet.

La durée est une fenêtre stricte : jamais moins de 23 s, jamais plus de 40 s.

Règles fondamentales (protégez l'utilisateur ; ne les assouplissez pas)

  • Local uniquement. Enregistrez localhost, 127.0.0.1, [::1], *.localhost, *.test. Les scripts refusent toute autre chose.
  • N'appelez jamais de services payants ou externes pendant l'enregistrement. Vérifiez les fichiers env du projet pour les clés de modèle/API (présence uniquement ; n'imprimez jamais les valeurs). Si l'application peut communiquer avec un modèle hébergé ou un tiers, démarrez-la en mode déterministe/fictif/maquette du projet (cherchez dans le README et .env.example quelque chose comme *_ADAPTER=fixture, MOCK=1, --demo) et dites à l'utilisateur la commande exacte. S'il n'y a pas un tel mode, ne soumettez rien qui déclenche un appel externe ; montrez uniquement les flux qui restent locaux, et dites-le.
  • Données de test uniquement. Utilisez les comptes de démonstration/seed trouvés dans le projet. Connectez-vous dans la phase app.setup non enregistrée ; passez les secrets avec ${ENV_VAR}, jamais en ligne. Ne saisissez jamais d'identifiants réels.
  • Rien de sensible à l'écran. Inspectez les images pour les emails, tokens, clés, URLs internes, données client, le nom/photo personnels de l'utilisateur.
  • Pas d'affirmations inventées. Chaque légende, annotation, statistique et tagline doit être visible dans les séquences ou énoncée dans la documentation du projet ou par l'utilisateur. Les chiffres dérivés doivent avoir leur calcul dans facts.md.
  • N'utilisez jamais un flux qui n'a pas fonctionné de manière fiable. Laissez-le de côté et notez-le dans facts.md.
  • Dites ce que vous exécutez : la commande de démarrage et les éventuelles surcharges d'environnement, avant de les exécuter.
  • Shells en bac à sable : Chromium et les serveurs de développement locaux doivent lancer un navigateur et lier un port. Si votre shell est en bac à sable (macOS Seatbelt, conteneurs), l'application, theme, explore, record, compose et svg2png doivent s'exécuter sans bac à sable ; dites-le à l'utilisateur et demandez-lui de l'autoriser plutôt que de sauter des étapes.
  • Laissez le projet propre : gardez .flaunt/ hors de git via .git/info/exclude ; restaurez tout ce que vous avez modifié.

Flux de travail

Tous les chemins scripts/... et references/... sont relatifs au répertoire de base de cette compétence (affiché lors de son chargement) ; exécutez les scripts par chemin absolu. Le dossier du projet est --dir (par défaut : répertoire courant).

1. Diagnostic

scripts/doctor.sh (Node 20+, FFmpeg avec xfade/zoompan/alimiter, Playwright + Chromium). S'il échoue, transmettez le message et arrêtez-vous. Ensuite, mkdir -p <dir>/.flaunt/assets et, si <dir>/.git existe, echo ".flaunt/" >> <dir>/.git/info/exclude.

2. Lire le code source

node scripts/inventory.mjs <dir> --out <dir>/.flaunt/inventory.json

Il imprime la propre description du projet, son échelle, et les candidats capacités classés avec des preuves (routes, modules, poids du README, docs, tests). Ensuite, lisez ce sur quoi il pointe : le README (ce que les auteurs disent qui importe), les documents d'architecture/aperçu, la liste des routes et la navigation principale, 2-3 modules représentatifs par candidat principal, les données de seed/démonstration. Pour --since <réf>, lisez aussi git log <réf>..HEAD --stat et le journal des modifications. Comprenez : Quel problème résout-il, pour qui, et quelle est sa catégorie ? Utilisez les mots du README. Si l'analyse trouve peu de choses (un site statique simple, un petit projet, pas de README), lisez les fichiers à la main : listez les pages, lisez le texte visible et gardez la carte produit courte (3-5 lignes). Ce n'est pas grave ; n'inventez pas de capacités.

3. Classifier : écrire product-map.md

Utilisez references/product-map-template.md. Fusionnez/renommez les candidats en capacités réelles (supprimez le bruit comme seed, component, setting), puis attribuez les niveaux :

  • Niveau 1 - les piliers (3-5). Ce qui fait de ce produit ce produit : son idée centrale et ses différenciateurs, proéminents dans le README, volumineux dans le code source, centraux dans la navigation. La vidéo doit montrer ceux-ci en direct.
  • Niveau 2 - preuves et résultats (2-4). Ce que les piliers produisent ou sur quoi ils reposent (rapports, lignage, intégrations). Montrez brièvement ou sous forme de statistique.
  • Niveau 3 - profondeur. Tout le reste. Mentionnez-le uniquement via une statistique, un compte ou la ligne de fin ; jamais en plan complet.

Classez par : importance dans le README/docs > distinctivité par rapport aux concurrents > poids du code et de l'écran (score d'inventaire)

démontrabilité (un flux en direct déterministe existe). Un pilier sans flux en direct fiable devient une statistique ou une annotation, jamais un écran falsifié. Confirmez que chaque capacité existe dans l'application en cours d'exécution (étape 5).

4. Écrire l'histoire : script.md

Utilisez references/script-template.md. Arc narratif (adaptez, mais gardez l'ordre des idées) : Accroche (le changement de catégorie, 2 s) -> Flux héroïque (l'interaction centrale, en direct, 4-5 s) -> Piliers (une scène chacun, dans l'ordre des dépendances : entrées -> intelligence -> contrôle -> sorties) -> Statistique(s) de preuve -> Fermeture (logo + ligne de catégorie). Par scène, écrivez : l'affirmation (<= 6 mots), l'interaction en direct, les annotations, les preuves. Choisissez la ligne de fin : la catégorie du produit dans ses propres mots. Confirmez-la avec l'utilisateur ; en cas d'exécution non interactive et qu'aucune ligne de catégorie n'existe dans le README ou le titre de l'application, dérivez-en une à partir du texte de l'application et listez-la comme une hypothèse dans le transfert afin que l'utilisateur puisse la modifier.

5. Exécuter l'application en toute sécurité et l'examiner

Démarrez l'application (règles ci-dessus) ; app.start dans le shotlist est optionnel (record.mjs peut la démarrer), et tout serveur que vous avez démarré vous-même doit être arrêté une fois terminé, sauf si l'utilisateur souhaite le laisser tourner. Écrivez un shotlist.json minimal avec app.url (+ app.setup pour la connexion), puis :

node scripts/theme.mjs   <dir>/.flaunt/shotlist.json /route ...   # couleurs réelles + mode clair/sombre
node scripts/explore.mjs <dir>/.flaunt/shotlist.json /a /b /c      # captures d'écran + sélecteurs par route

Regardez les captures d'écran. Ensuite, essayez les flux en direct à la main avec Playwright (tapez, appuyez sur Entrée, cliquez sur les onglets) : notez ce qui apparaît réellement et combien de temps cela prend ; ne gardez que les flux fiables et riches. Utilisez exactement la sortie du thème : produit clair = scène claire avec des points très clairs et du texte foncé ; sombre = sombre ; une couleur/capture d'écran fournie par l'utilisateur l'emporte. Si primary est trop proche de text, prenez un accent dans le produit. Logo : cherchez dans public/ assets/ docs/ brand/ static/ .github/ *logo* *brand* *mark* ; copiez-en un dans assets/ (PNG transparent avec la bonne couleur de mot-symbole pour la scène ; SVG -> scripts/svg2png.mjs). C'est la dernière image.

6. Écrire le shotlist à partir du script

Suivez references/shotlist-schema.md. Règles pour que tout paraisse vivant :

  • Chaque flux montre un changement d'état : taper -> résultat apparaît ; cliquer -> onglet/page/panneau change ; soumettre -> réponse arrive ; décrire -> quelque chose se construit. Au maximum deux plans avec survol par vidéo.
  • Naviguez comme un utilisateur : cliquez sur les onglets et les liens quand vous le pouvez ; goto uniquement pour atteindre un écran.
  • Marquez les moments réels ("mark":"results"), attachez-y des annotations ("after":"results") pour nommer ce qui se passe, et accélérez ("ramps") les temps morts (réflexion de l'agent, chargement) pour que rien ne traîne.
  • Utilisez crop pour supprimer les barres latérales/supérieures, un zoom doux de 1,05 à 1,12, un record.viewport adapté au contenu. explore.mjs imprime le contentBox (x, y, w, h en fractions du viewport) de chaque page : gardez crop.x inférieur ou égal à contentBox.x moins la perte de bord due au zoom (scale-1)/(2*scale), et choisissez une hauteur de viewport juste au-dessus de contentBox.y + contentBox.h pour que les pages courtes remplissent la fenêtre. Vérifiez toujours la dernière image d'un plan zoomé.
  • Rendez les passages reproductibles : app.rehearse exécute les flux avec état (chat, constructeur) une fois hors caméra en premier ; app.warm liste les routes qui redirigent ou compilent tardivement ; les étapes optional suppriment les éléments résiduels (par exemple "Start fresh") ; startAt coupe le début après une telle étape ; press avec retryUntilUrl survit aux touches perdues.
  • Attendez après tout ce qui réaffiche la page (fermer une bannière, changer d'onglet, naviguer) avant de taper : {"wait":1500},{"waitFor":"<le champ>"}. Taper dans un champ sur le point d'être remonté fait perdre le texte dans les applications React (le bouton Envoyer reste désactivé). Les machines lentes ou froides exposent cette condition de course ; ajoutez les attentes.
  • Commencez chaque flux avec un waitFor sur son premier contenu réel (la ligne de données, le titre). L'enregistreur commence le clip à ce moment, donc les squelettes de chargement et les tableaux vides n'apparaissent jamais. Une annotation ne doit nommer que des choses qui sont visibles à l'écran lorsqu'elle apparaît ; vérifiez cela image par image.
  • Statistiques : uniquement les chiffres visibles dans l'application/documentation.

7. Enregistrer, composer, réviser

node scripts/record.mjs  <dir>/.flaunt/shotlist.json      # --only s2,s3 pour refaire des plans
node scripts/compose.mjs <dir>/.flaunt/shotlist.json      # --silent, --keep

Ensuite, révisez comme un réalisateur (references/craft.md §Révision). Mettez les images de révision dans <dir>/.flaunt/review/. Utilisez une planche contact et des images plein écran des moments clés : ffmpeg fps=1,tile plus des images uniques à chaque marque. Si un flux est instable, corrigez les étapes et réenregistrez uniquement ce plan. Faites au moins un passage d'amélioration.

8. Texte de publication et transfert

post.md à partir de references/post-template.md (le bénéfice d'abord, les affirmations issues de facts.md, pas de lien sauf demande). Transférez en moins de 8 lignes : chemin, durée, l'histoire en une ligne, les capacités de niveau 1 montrées, tout ce qui a été omis et pourquoi, et ce que vous modifieriez. Proposez un --shape tall recadré.

Skills associés