Comment fonctionne GEN MOTION
GEN MOTION film ton site/app et le transforme en vidéo motion design — capture E2E + voix off ElevenLabs + compose final, le tout 100% local. Ce guide te fait passer du clone à ta première vidéo en ~5 minutes.
Concept
Le mental model
Un tour = un fichier JSON qui scénarise ce que GEN MOTION doit filmer. L'outil est totalement agnostique au projet : il n'y a pas de "liaison" formelle entre un projet et GEN MOTION. Le seul lien c'est le champ baseUrl du tour : Puppeteer va ouvrir cette URL dans Chromium et exécuter les steps en séquence (sections, overlays, clicks, scrolls…).
Workflow
5 étapes pour ta première vidéo
- 1Configurer ElevenLabs (1 fois)
Hub → bouton Setup en haut à droite → colle ton API key + Voice ID. Stocké dans
~/.webgen-motion/config.json. Survit aux reboots, partagé entre tous tes tours. - 2Créer un tour
Hub → bouton Nouveau tour → nom + id auto-slug + format (16:9 desktop, 9:16 mobile). Le fichier
tours/<id>.jsonest créé et tu atterris dans l'éditeur. - 3Lier ton projet via baseUrl
Dans le tab Script, édite le tour JSON pour renseigner
baseUrl(ex :https://acme.com),brand(displayName / domain / tagline pour l'intro/outro du compose), et optionnellementvoiceIdpour une voix clonée spécifique à ce projet. - 4Définir les étapes (sections, overlays, clicks…)
Ajoute des steps dans la liste : sections colorées, overlays texte, scrolls, clicks (avec sélecteurs CSS du site cible). Chaque step peut porter un texte de voix off.
- 5Capture → Voice off → Compose
Lance les 3 actions dans l'ordre dans leurs tabs respectifs. Le clip final atterrit dans
~/.webgen-motion/tours/<id>/final.mp4.
Schéma
Anatomie d'un tour JSON
{
"id": "acme-landing",
"name": "Acme · Landing",
"description": "Tour rapide de la landing.",
"estimatedSec": 30,
"startPath": "/",
"baseUrl": "https://acme.com", // ← LE LIEN avec ton projet
"format": "16:9",
"brand": {
"displayName": "Acme",
"domain": "acme.com",
"tagline": "by Smooth & Design"
},
"voiceId": "<voix-clonée-acme>", // override la config globale
"steps": [
{
"type": "section",
"categoryId": "branding",
"title": "Acme",
"subtitle": "Le SaaS qui simplifie tout",
"voiceover": "Bienvenue chez Acme.",
"dwellMs": 2500
},
{ "type": "wait", "dwellMs": 1500 },
{
"type": "overlay",
"text": "Notre promesse",
"position": "center",
"dwellMs": 2800
},
{
"type": "click",
"selector": "[data-testid='cta-signup']",
"dwellMs": 2500,
"voiceover": "Inscris-toi en un clic."
},
{ "type": "scroll", "to": 800, "dwellMs": 1800 }
]
}Schéma complet : src/lib/types/tour.ts. Types de step disponibles : section, goto, click, type, select, hover, scroll, wait, overlay, keypress.
Astuce
Trouver les sélecteurs CSS pour les clicks
- Ouvre ton site dans Chrome
⌘⌥I(Mac) ouF12→ DevTools- Clique l'icône inspect en haut-gauche
- Survole l'élément à cliquer → clique dessus
- Clic droit sur la balise dans l'arbre DOM → Copy → Copy selector
Préfère les sélecteurs stables : [data-testid="…"], [data-tab="…"], #hero h1 tiennent face aux refactors CSS. Évite .css-1a2b3c4 (auto-générés, fragiles). Si tu codes le site, ajoute des data-* sur les éléments clés du tour.
Voix off
Per-step vs Narrative continu
Per-step
DéfautUne ligne de voix off par step. Le runner padding chaque clip avec du silence pour matcher le dwellMs de son step. Simple et prévisible.
Narrative continu
AvancéUn texte narratif unique avec des markers [step:N]. ElevenLabs renvoie l'alignment char-level ; le bouton Calibrer la timeline recompute les dwellMs pour matcher le pacing réel. Re-capture ensuite → mix parfaitement sync.
Échelle
Plusieurs projets en parallèle
Pattern A — 1 install, N tours
≤ 10 projetsUn seul ~/.webgen-motion/config.json global (API key partagée). Chaque tour a son override voiceId + brand + baseUrl. Mainenance facile.
Pattern B — 1 install par projet
Isolationnpx create-webgen-motion <projet> par projet. Plus lourd à maintenir mais isolation totale : config, tours, captures, voiceovers séparés.
Stockage
Où vont mes fichiers
~/.webgen-motion/
├── config.json # Setup wizard (creds ElevenLabs)
├── audio/ # Library musique de fond
│ ├── index.json
│ └── <slug>-<epoch>.mp3
├── vo-cache/ # TTS cache (par voix + texte)
│ ├── <sha1>.mp3
│ └── <sha1>.alignment.json
└── tours/
└── <tourId>/
├── manifest.json
├── section-NN-<cat>.mp4
├── voiceover.mp3
├── voiceover-alignment.json
└── final.mp4Tout reste sur ta machine. Survit aux reboots. Jamais commit dans git.
FAQ
Questions fréquentes
Je peux filmer un site en localhost ?
Oui. baseUrl: "http://localhost:3000" marche tant que ton site tourne pendant la capture.
Ça marche sur une app qui demande un login ?
Pas encore en standard. Tu peux mettre auth: "admin" sur le tour et plumber manuellement un cookie de session (à venir).
La voix off est en décalage avec les overlays ?
Bascule sur le mode narrative continu et utilise Calibrer la timeline, ça aligne au mot près.
Comment je supprime un tour ?
Supprime le fichier tours/<id>.json. Pour aussi nettoyer les captures : rm -rf ~/.webgen-motion/tours/<id>/.
Mon site change beaucoup, les sélecteurs CSS cassent.
Ajoute des data-testid="…" ou data-tab="…" sur les éléments clés du tour. Stables face aux refactors CSS.
Guide complet au format markdown (versionné dans le repo)