El resultado: una semana en 74 segundos.
La petición fue una frase: «haz un resumen de la última semana en guion y luego crea una animación con motion graphics, capturas de las fuentes y la voz de Aaron en ElevenLabs». El material: el export de WhatsApp de un grupo de desarrolladores, 5 MB de texto. El agente devolvió dos cosas: un guion en Markdown y este vídeo.
Cada escena tiene un diagrama que se dibuja al ritmo de la voz, un número que aparece justo cuando se pronuncia y una captura real de la fuente: el repositorio en GitHub, el ranking de modelos, la web migrada. Nada de stock ni plantillas.
La arquitectura: un orquestador y seis herramientas.
El modelo no «genera un vídeo». Opus hace de director: lee, decide, escribe código y llama herramientas. Cada herramienta hace una sola cosa bien:
- Lectura del chat: shell en un sandbox (
grep,sed) para cortar solo la última semana de un archivo de 55.000 líneas. - Guion: el propio modelo elige 8 historias con números concretos y escribe el texto de la voz.
- Voz: ElevenLabs genera cuatro tomas con la voz «Aaron Abad – Storyteller en Castellano».
- Timestamps: Scribe, el transcriptor de ElevenLabs, devuelve el inicio y el fin de cada palabra.
- Capturas: el navegador integrado de la app de Claude abre cada fuente en tu ordenador.
- Render: un motor de animación en canvas, Chromium headless y ffmpeg, con verificación automática de volumen y sincronía.
Todo cuelga de un único archivo, score.js, con los tiempos de cada corte, cada número y cada subtítulo. El sonido y la imagen lo leen igual, así que no pueden desincronizarse.
Del chat al guion.
Un export de 5 MB no cabe en una lectura. El agente primero cuenta mensajes por día para encontrar la ventana y después extrae solo esas líneas:
for d in 12 13 14 15 16 17 18 19; do
echo "$d/10: $(grep -c "^\[$d/10/2026" chat.txt)"
done
grep -n "^\[12/10/2026" chat.txt | head -1 # → línea 54021
sed -n '54021,$p' chat.txt > week.txt # 1.304 líneasCon la semana en contexto, el criterio editorial es lo que marca la diferencia: historias con un dato animable (24 horas, 80 %, 150 clientes), atribuidas por nombre, y fuera todo lo político o personal. El guion final es una tabla con cuatro columnas: escena, visual, voz en off y nota. Se entrega antes de gastar créditos de voz, para poder corregir el rumbo.
En el chat alguien dijo que Meta tenía «el segundo mejor modelo». El agente abrió la fuente y la página decía #4 de 696. El vídeo dice lo que dice la página.
La voz: cuatro tomas, elige la más limpia.
El agente busca la voz por nombre con creative_list_voices (nunca un id de memoria) y genera el texto completo con eleven_v4. ElevenLabs devuelve cuatro variaciones: 71, 76, 76 y 78 segundos. Elegimos la más corta, porque en un resumen el ritmo importa más que la pausa dramática.
Un detalle práctico: separar las escenas con un salto de párrafo en el texto produce pausas naturales de medio segundo o más. Esas pausas son exactamente donde caerán los cortes de escena.
Timestamps por palabra: la voz manda.
En lugar de estimar cuándo se dice cada cosa, el agente transcribe la toma elegida con Scribe y obtiene una lista como esta:
{ "text": "Meta", "start": 18.80, "end": 18.98 },
{ "text": "arriba", "start": 21.70, "end": 22.00 },
{ "text": "80", "start": 39.42, "end": 39.60 },
{ "text": "%", "start": 39.92, "end": 39.96 }Con eso, el sello «#4» aparece en el segundo 21,70 (cuando la voz dice «arriba») y el anillo del 80 % empieza a llenarse en el 39,42. Cada corte de escena se coloca en el silencio justo antes de la primera palabra del tema siguiente.
Capturas reales a través de tu ordenador.
El sandbox donde trabaja el agente no tiene salida libre a internet: ni a las webs de noticias ni al almacenamiento donde ElevenLabs deja el MP3. La solución fue usar el ordenador del usuario como puente, mediante el navegador integrado de la app de Claude.
Capturas: el agente abre cada fuente, fija el viewport a 1440×900, cierra los avisos modales y hace una captura. Cada captura se guarda como JPG en el sandbox.

Audio: para el MP3 de 1,1 MB, el agente lo descarga dentro de la página, lo codifica en base64 y lo lee en trozos de 200.000 caracteres, ocho llamadas en paralelo. Luego lo reconstruye en el sandbox:
const buf = new Uint8Array(await (await fetch(location.href)).arrayBuffer());
let s = ''; for (let i = 0; i < buf.length; i += 32768)
s += String.fromCharCode.apply(null, buf.subarray(i, i + 32768));
window.__b64 = btoa(s); // 1.546.492 caracteres
// y luego, 8 veces: 'C3<' + window.__b64.slice(600000, 800000) + '>'Una partitura para el sonido y la imagen.
El motor es el de la skill animation-studio: cada fotograma se dibuja con código en un canvas y la banda sonora se sintetiza en JavaScript. Su regla de oro es que todo evento vive en score.js:
const VOFF = 0.5; // la voz empieza a los 0,5 s
const S = { // cortes en las pausas de la voz
intro: [0, 6.55], claudio: [6.55, 19.1], meta: [19.1, 24.85],
rea: [24.85, 35.05], german: [35.05, 46.65], debate: [46.65, 56.45],
homedock: [56.45, 64.95], outro: [64.95, 74.5],
};
const w = (x) => x + VOFF; // hora de una palabra en Scribe
const ev = { rank: w(21.7), wallet80: w(39.42), rip: w(57.72) };song.js lee esos tiempos para poner un golpe en cada corte y un «pop» en cada número; film.js los lee para hacer aparecer cada elemento. Si mueves un número en la partitura, se mueven el sonido y la imagen a la vez.
Dibujar las escenas como funciones del tiempo.
Cada escena es una función pura draw(ctx, t): dado un instante, dibuja exactamente ese fotograma. Así, varios procesos de Chromium pueden renderizar en paralelo y obtener imágenes idénticas. Con cinco piezas reutilizables se construyen todas las escenas:
- browser(): una ventana de navegador con la URL real y la captura dentro, con un zoom lento hacia la zona que importa.
- box() y arrow(): nodos y flechas discontinuas animadas para los diagramas.
- Data.counter y UI.ring: contadores que suben hasta el dato y anillos de porcentaje.
- stampAt(): sellos con rebote para los veredictos («#4», «RIP CLOUD», «VALIDADOR NEGACIONISTA»).
- Subs.draw: subtítulos por frase, con los tiempos de Scribe.




Mezclar y medir, no escuchar.
El agente no puede oír, así que mide. Debajo de la voz suena una base lo-fi sintetizada que se atenúa automáticamente cuando hay voz. La primera medición mostró el bajo 4 dB por encima de la voz; tras ajustar las ganancias, la voz quedó unos 7 dB por encima de todo lo demás:
intro claudio meta rea
stem-voice -23.6 -22.8 -22.0 -22.2
stem-bass -31.6 -29.4 -28.9 -29.1
stem-keys -30.0 -31.8 -32.0 -30.6
integrated loudness: -14.0 LUFS−14 LUFS es el volumen al que normalizan YouTube y Spotify; el limitador deja el pico real por debajo de −1,5 dBTP para que la compresión AAC no lo sature.
Renderizar, revisar y verificar.
Antes del render completo, el agente renderiza un fotograma por escena a media resolución, los junta en una hoja y la revisa como un director: textos que se solapan, un personaje tapado por un sello, etiquetas encima del título. En la primera revisión encontró y corrigió esos solapes.

El render de 2.235 fotogramas tardó unos cinco minutos. Después, verify mide en el MP4 final si cada corte cae en el fotograma correcto y si su golpe de sonido está a menos de 20 ms. En cuatro cortes, una sílaba de la voz empezaba a 0,1 s del golpe y lo tapaba; la herramienta lo marcó como dudoso. La solución honesta fue declarar esos cortes como «solo imagen», no mover tiempos a mano.
marker score sound picture
claudio 6.550s 6.555s +5ms ✓ 6.600s +1f ✓
meta 19.100s 19.105s +5ms ✓ 19.133s +1f ✓
outro 64.950s 64.955s +5ms ✓ 65.000s +1f ✓
✓ in syncChromium como root necesita --no-sandbox: se resuelve con un script envoltorio en CHROME_PATH, no tocando el motor. Y el navegador integrado no guarda descargas en tu carpeta: por eso el audio viaja en base64.
Convertir el proceso en una skill.
Lo más valioso de la sesión no es el vídeo, sino el procedimiento. Lo guardamos como una skill, chat-recap-motion-video: un SKILL.md con los pasos, las elecciones por defecto (voz, duración, estilo), los trucos de red y las comprobaciones. Cualquier instancia de Claude de la cuenta la carga cuando alguien pide «el resumen de la semana en vídeo», y la última sección pide añadir lo aprendido tras cada uso.
- Entrada: un export de chat o unas notas, y el periodo.
- Entrega temprana: el guion, antes de gastar créditos.
- Entrega final: MP4, guion, créditos gastados, fuentes capturadas y lo que se dejó fuera.
Coste orientativo de esta pieza: unos 5.300 créditos de ElevenLabs por las cuatro tomas de voz y unos 390 por la transcripción. El render es local y no cuesta créditos.
El prompt para hacerlo tú.
Con Claude Opus, la app de escritorio conectada a tu ordenador, ElevenLabs como conector y la skill animation-studio instalada:
Adjunto el export del chat del grupo. Haz un resumen de la última semana
en formato guion (escena · visual · voz en off) y entrégamelo primero.
Después crea un vídeo de ~75 s en 16:9 con motion graphics:
- voz en off con ElevenLabs, voz "Aaron Abad" en castellano
- timestamps por palabra para sincronizar cortes, números y subtítulos
- una captura real de la fuente de cada historia (usa el navegador)
- un diagrama animado por escena y subtítulos
Deja fuera la política y lo personal. Verifica volumen (−14 LUFS) y
sincronía, y dime qué créditos has gastado.El siguiente paso natural es el formato vertical 9:16 para Reels y Shorts. No se resuelve recortando: hay que volver a componer cada escena para la pantalla del móvil. Si lo construyes, cuéntanos cómo te ha ido.