Remotion acaba de lanzar las Habilidades de Agente (Agent Skills), y esto lo cambia todo para la creación de videos con IA.
npx skills add remotion-dev/skills
Eso es todo. Un comando, y Claude Code se convierte en un experto en creación de videos que entiende el framework de video basado en React de Remotion a la perfección.
¿Qué son las Habilidades de Agente de Remotion?
Las Habilidades de Agente son "manuales de instrucciones" que enseñan a agentes de IA como Claude Code cómo usar correctamente herramientas y frameworks específicos. Las habilidades oficiales de Remotion le dan a Claude un conocimiento profundo de:
- La arquitectura de componentes de Remotion (
<Composition>,<Sequence>,<AbsoluteFill>) - APIs de animación (
interpolate,spring,useCurrentFrame) - Mejores prácticas para tiempos, rendimiento y renderizado
- Patrones comunes para intros, transiciones y efectos
Sin estas habilidades, Claude podría generar código Remotion con errores o incorrecto. Con las habilidades, escribe componentes de video con calidad de producción en el primer intento.
Lo Que Construirás
En este tutorial, harás lo siguiente:
- Instalar las Habilidades de Agente de Remotion con un solo comando
- Generar un video de introducción completo usando lenguaje natural
- Refinar animaciones a través de la conversación
- Renderizar tu video a MP4
- Escalar con Remotion Lambda (opcional)
En resumen
# 1. Crear un proyecto Remotion
npx create-video@latest my-video && cd my-video
# 2. Instalar Habilidades de Agente (¡el paso clave!)
npx skills add remotion-dev/skills
# 3. Iniciar Claude Code y describir tu video
claude
# 4. Renderizar
npx remotion render <composition-name> out/video.mp4
Ese es todo el flujo de trabajo. Las Habilidades de Agente enseñan a Claude cómo escribir código Remotion adecuado, para que puedas centrarte en describir lo que quieres en lugar de depurar componentes de React.
Requisitos previos
Antes de empezar, asegúrate de tener:
| Requisito | Versión | Comando de Verificación |
|---|---|---|
| Node.js | 18+ | node --version |
| npm o yarn | Última | npm --version |
| Claude Code | Última | claude --version |
| Editor de código | VS Code recomendado | - |
También deberías tener:
- Familiaridad básica con la línea de comandos
- Comprensión básica de React (útil pero no requerida)
Paso 1: Instalar Remotion y Crear Tu Proyecto
Primero, crea un nuevo proyecto Remotion usando la CLI oficial.
1.1 Abre tu terminal y ejecuta:
npx create-video@latest my-first-video

1.2 Cuando se te pregunte, selecciona estas opciones:
? ¿Cómo te gustaría nombrar tu proyecto? my-first-video
? Elige una plantilla: blank
? ¿Usar TypeScript? Yes
? ¿Instalar dependencias? Yes
1.3 Navega a tu proyecto:
cd my-first-video
1.4 Verifica la instalación:
npm run dev
Esto abre Remotion Studio en tu navegador en http://localhost:3000. Deberías ver un lienzo en blanco con una línea de tiempo en la parte inferior.
Resultado esperado: Una ventana del navegador con la interfaz de Remotion Studio.

Paso 2: Instalar las Habilidades de Agente de Remotion
Aquí es donde ocurre la magia. Un comando le da a Claude Code un conocimiento de nivel experto de Remotion.
2.1 En el directorio de tu proyecto, ejecuta:
npx skills add remotion-dev/skills
Cuando veas Added skill: remotion mostrado, la instalación fue exitosa.

2.2 ¿Qué acaba de pasar?
El comando añadió una habilidad a .claude/skills/remotion/ en tu proyecto. Esta carpeta contiene SKILL.md—el manual de instrucciones que enseña a Claude cómo escribir código Remotion adecuado.
2.3 Verifica la instalación:
Verifica que el archivo de habilidad existe:
ls .claude/skills/remotion/
Salida esperada:
SKILL.md
2.4 La estructura de tu proyecto ahora se ve así:
my-first-video/
├── .claude/
│ └── skills/
│ └── remotion/
│ └── SKILL.md # El "cerebro" que enseña Remotion a Claude
├── src/
│ ├── Root.tsx
│ ├── Composition.tsx
│ └── index.ts
├── public/
├── remotion.config.ts
├── package.json
└── tsconfig.json
Consejo profesional: Si la habilidad no es reconocida, ejecuta npx skills add remotion-dev/skills de nuevo o reinicia Claude Code.
Paso 3: Crea Tu Primer Video con Claude Code
Ahora usemos Claude Code para generar un video completo. Abre tu terminal en el directorio del proyecto.
3.1 Inicia Claude Code:
claude
3.2 Describe tu video:
Escribe este prompt a Claude Code:
Crea un video de introducción de 5 segundos para una empresa de tecnología llamada "DevFlow".
Requisitos:
- Resolución: 1920x1080
- Tasa de fotogramas: 30fps
- Fondo: Gradiente oscuro de #1a1a2e a #16213e
- Secuencia de animación:
1. El texto del logo "DevFlow" aparece gradualmente de opacidad 0 a 1 (fotogramas 0-30)
2. El logo se agranda ligeramente con un efecto de rebote (fotogramas 15-45)
3. El eslogan "Build faster. Ship smarter." aparece gradualmente debajo (fotogramas 45-90)
4. Todo se mantiene durante los fotogramas restantes
Usa tipografía moderna y limpia con la familia de fuentes Inter.

3.3 Claude Code genera los archivos:
Claude Code creará o modificará estos archivos:
src/Root.tsx - Definición de composición:
import React from 'react';
import { Composition } from 'remotion';
import { DevFlowIntro } from './DevFlowIntro';
export const RemotionRoot: React.FC = () => {
return (
<>
<Composition
id="devflow-intro"
component={DevFlowIntro}
durationInFrames={150}
fps={30}
width={1920}
height={1080}
/>
</>
);
};
src/DevFlowIntro.tsx - Componente de video principal:
import React from 'react';
import {
AbsoluteFill,
useCurrentFrame,
interpolate,
spring,
useVideoConfig,
} from 'remotion';
export const DevFlowIntro: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
// Logo fade in (frames 0-30)
const logoOpacity = interpolate(frame, [0, 30], [0, 1], {
extrapolateRight: 'clamp',
});
// Logo bounce scale (frames 15-45)
const logoScale = spring({
frame: frame - 15,
fps,
from: 1,
to: 1.1,
config: {
damping: 10,
stiffness: 100,
},
});
// Tagline fade in (frames 45-90)
const taglineOpacity = interpolate(frame, [45, 90], [0, 1], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
return (
<AbsoluteFill
style={{
background: 'linear-gradient(135deg, #1a1a2e 0%, #16213e 100%)',
justifyContent: 'center',
alignItems: 'center',
fontFamily: 'Inter, sans-serif',
}}
>
<div style={{ textAlign: 'center' }}>
<h1
style={{
fontSize: 120,
fontWeight: 700,
color: 'white',
margin: 0,
opacity: logoOpacity,
transform: `scale(${frame >= 15 ? logoScale : 1})`,
}}
>
DevFlow
</h1>
<p
style={{
fontSize: 36,
color: 'rgba(255, 255, 255, 0.8)',
marginTop: 24,
opacity: taglineOpacity,
fontWeight: 400,
}}
>
Build faster. Ship smarter.
</p>
</div>
</AbsoluteFill>
);
};
3.4 Previsualiza tu video:
Si Remotion Studio no está ejecutándose, inícialo:
npm run dev
Selecciona "devflow-intro" del menú desplegable de composición. Usa la línea de tiempo para navegar por tu video y previsualizar las animaciones.

Resultado esperado: Tu video de introducción reproduciéndose con las animaciones de aparición gradual del logo y el eslogan.
Paso 4: Refina Tu Video con Prompts de Seguimiento
El poder de Claude Code es el refinamiento iterativo. Mejoremos nuestro video.
4.1 Añade un efecto de fondo de partículas y cambia el esquema de color
Añade un sutil fondo de partículas animado con pequeños puntos blancos
que flotan lentamente hacia arriba. Mantenlo minimalista - alrededor de 20-30 partículas,
muy baja opacidad (0.1-0.2), y movimiento lento.
Cambia el gradiente a un tema azul-púrpura:
- Color inicial: #0f0c29
- Color intermedio: #302b63
- Color final: #24243e
Hazlo un gradiente de 3 paradas.


4.3 Añade una señal de efecto de sonido (opcional):
Añade un comentario de marcador donde un efecto de sonido de "silbido" debería reproducirse
cuando el logo rebote. Añadiré el audio más tarde.
Cada vez que das retroalimentación, Claude Code modifica el código relevante y puedes previsualizar los cambios inmediatamente en Remotion Studio.
Paso 5: Añade Contenido Dinámico con Props
Haz tu video reutilizable aceptando props dinámicos. Esto te permite generar múltiples videos con contenido diferente.
5.1 Pide a Claude Code que añada props:
Refactoriza el video para que acepte estas props:
- companyName (string) - reemplaza "DevFlow"
- tagline (string) - reemplaza el texto del eslogan
- primaryColor (string) - color principal del gradiente
- secondaryColor (string) - color secundario del gradiente
También añade validación de esquema Zod para la seguridad de tipos.
5.2 Claude Code genera el esquema:
src/DevFlowIntro.tsx (actualizado):
import { z } from 'zod';
export const introSchema = z.object({
companyName: z.string().default('DevFlow'),
tagline: z.string().default('Build faster. Ship smarter.'),
primaryColor: z.string().default('#0f0c29'),
secondaryColor: z.string().default('#24243e'),
});
type IntroProps = z.infer<typeof introSchema>;
export const DevFlowIntro: React.FC<IntroProps> = ({
companyName,
tagline,
primaryColor,
secondaryColor,
}) => {
// ... el componente usa estas props
};
src/Root.tsx (actualizado):
import { Composition } from 'remotion';
import { DevFlowIntro, introSchema } from './DevFlowIntro';
export const RemotionRoot: React.FC = () => {
return (
<>
<Composition
id="company-intro"
component={DevFlowIntro}
durationInFrames={150}
fps={30}
width={1920}
height={1080}
schema={introSchema}
defaultProps={{
companyName: 'DevFlow',
tagline: 'Build faster. Ship smarter.',
primaryColor: '#0f0c29',
secondaryColor: '#24243e',
}}
/>
</>
);
};
5.3 Prueba con diferentes props en Remotion Studio:
En Remotion Studio, haz clic en el panel de Props y modifica los valores:
{
"companyName": "Apidog",
"tagline": "Design. Debug. Test. Document.",
"primaryColor": "#1e3a5f",
"secondaryColor": "#0d1b2a"
}
La previsualización se actualiza en tiempo real.
Paso 6: Crea un Video Multi-Escena
Construyamos un video más complejo con múltiples escenas.
6.1 Prompt para Claude Code:
Crea un video de demostración de producto de 30 segundos con estas escenas:
Escena 1 (0-5 segundos): Animación de introducción del logo
Escena 2 (5-12 segundos): Muestra de características con 3 iconos apareciendo uno por uno
- Icono 1: Cohete (Velocidad)
- Icono 2: Escudo (Seguridad)
- Icono 3: Gráfico (Análisis)
Cada icono debe deslizarse desde la izquierda con un desvanecimiento
Escena 3 (12-22 segundos): Maqueta del panel de control del producto
- Muestra una maqueta simple de la interfaz de usuario
- Resalta diferentes secciones secuencialmente
Escena 4 (22-30 segundos): Llamada a la acción
- "Comienza tu prueba gratuita"
- La URL del sitio web aparece gradualmente
Usa el componente <Sequence> para organizar las escenas.
Duración total: 900 fotogramas a 30fps.
6.2 Claude Code genera la estructura de la escena:
import { Sequence, AbsoluteFill } from 'remotion';
import { LogoIntro } from './scenes/LogoIntro';
import { FeatureShowcase } from './scenes/FeatureShowcase';
import { DashboardMockup } from './scenes/DashboardMockup';
import { CallToAction } from './scenes/CallToAction';
export const ProductDemo: React.FC = () => {
return (
<AbsoluteFill style={{ backgroundColor: '#0a0a0a' }}>
{/* Escena 1: Introducción del Logo (fotogramas 0-150) */}
<Sequence from={0} durationInFrames={150}>
<LogoIntro />
</Sequence>
{/* Escena 2: Muestra de Características (fotogramas 150-360) */}
<Sequence from={150} durationInFrames={210}>
<FeatureShowcase />
</Sequence>
{/* Escena 3: Maqueta del Panel de Control (fotogramas 360-660) */}
<Sequence from={360} durationInFrames={300}>
<DashboardMockup />
</Sequence>
{/* Escena 4: Llamada a la Acción (fotogramas 660-900) */}
<Sequence from={660} durationInFrames={240}>
<CallToAction />
</Sequence>
</AbsoluteFill>
);
};
6.3 Claude Code crea componentes de escena individuales:
src/scenes/FeatureShowcase.tsx:
import { useCurrentFrame, interpolate, AbsoluteFill } from 'remotion';
const features = [
{ icon: '🚀', label: 'Speed', delay: 0 },
{ icon: '🛡️', label: 'Security', delay: 30 },
{ icon: '📊', label: 'Analytics', delay: 60 },
];
export const FeatureShowcase: React.FC = () => {
const frame = useCurrentFrame();
return (
<AbsoluteFill
style={{
justifyContent: 'center',
alignItems: 'center',
gap: 80,
flexDirection: 'row',
}}
>
{features.map((feature, index) => {
const slideIn = interpolate(
frame - feature.delay,
[0, 30],
[-100, 0],
{ extrapolateRight: 'clamp', extrapolateLeft: 'clamp' }
);
const opacity = interpolate(
frame - feature.delay,
[0, 30],
[0, 1],
{ extrapolateRight: 'clamp', extrapolateLeft: 'clamp' }
);
return (
<div
key={index}
style={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
transform: `translateX(${slideIn}px)`,
opacity,
}}
>
<span style={{ fontSize: 80 }}>{feature.icon}</span>
<span style={{ fontSize: 24, color: 'white', marginTop: 16 }}>
{feature.label}
</span>
</div>
);
})}
</AbsoluteFill>
);
};
Paso 7: Añade Audio a Tu Video
7.1 Añade una pista de música de fondo:
Coloca tu archivo de audio en la carpeta public:
public/
└── audio/
└── background-music.mp3
7.2 Pide a Claude Code que integre el audio:
Añade música de fondo desde public/audio/background-music.mp3
- Aparición gradual durante los primeros 30 fotogramas
- Desvanecimiento durante los últimos 30 fotogramas
- Establece el volumen a 0.5
7.3 Claude Code añade el componente de Audio:
import { Audio, interpolate, useCurrentFrame, useVideoConfig } from 'remotion';
import { staticFile } from 'remotion';
export const ProductDemo: React.FC = () => {
const frame = useCurrentFrame();
const { durationInFrames } = useVideoConfig();
// Aparición/desvanecimiento de audio
const volume = interpolate(
frame,
[0, 30, durationInFrames - 30, durationInFrames],
[0, 0.5, 0.5, 0],
{ extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }
);
return (
<AbsoluteFill>
<Audio src={staticFile('audio/background-music.mp3')} volume={volume} />
{/* ... resto de escenas */}
</AbsoluteFill>
);
};
Paso 8: Renderiza Tu Video
Ahora exportemos tu video a un archivo.
8.1 Renderiza desde la línea de comandos:
# Renderiza a MP4 (recomendado para la mayoría de los usos)
npx remotion render company-intro out/company-intro.mp4
# Renderiza con props personalizadas
npx remotion render company-intro out/apidog-intro.mp4 \
--props='{"companyName":"Apidog","tagline":"Design. Debug. Test. Document."}'
8.2 Opciones de renderizado:
# Alta calidad (más lento)
npx remotion render company-intro out/video.mp4 --crf=18
# Menor calidad (más rápido, archivo más pequeño)
npx remotion render company-intro out/video.mp4 --crf=28
# Renderizar como GIF
npx remotion render company-intro out/video.gif --codec=gif
# Renderizar como WebM
npx remotion render company-intro out/video.webm --codec=vp8
# Renderizar rango de fotogramas específico
npx remotion render company-intro out/preview.mp4 --frames=0-90
8.3 Progreso del renderizado:
Verás una salida como:
ℹ Renderizando fotogramas 0-150
████████████████████████████████████████ 100% | 150/150 fotogramas
✓ Renderizado 150 fotogramas en 12.3s (12.2 fps)
✓ Video codificado en 3.2s
✓ Video guardado en out/company-intro.mp4
Resultado esperado: Un archivo de video renderizado en tu directorio out/.
Paso 9: Escala con Remotion Lambda (Opcional)
Para renderizar videos a escala (cientos o miles), usa Remotion Lambda.
9.1 Instala las dependencias de Lambda:
npm install @remotion/lambda
9.2 Configura las credenciales de AWS:
# Configurar credenciales de AWS
aws configure
# Crear rol de Remotion Lambda
npx remotion lambda policies role
9.3 Despliega tu función Lambda:
# Desplegar la función de renderizado
npx remotion lambda functions deploy
# Desplegar tu sitio de video
npx remotion lambda sites create src/index.ts --site-name=my-videos
9.4 Renderiza vía Lambda:
npx remotion lambda render \
--function-name=remotion-render \
--serve-url=https://your-bucket.s3.amazonaws.com/sites/my-videos \
--composition=company-intro \
--props='{"companyName":"ClientCo"}'
9.5 Renderizado programático:
import { renderMediaOnLambda } from '@remotion/lambda/client';
const result = await renderMediaOnLambda({
region: 'us-east-1',
functionName: 'remotion-render',
composition: 'company-intro',
serveUrl: 'https://your-bucket.s3.amazonaws.com/sites/my-videos',
codec: 'h264',
inputProps: {
companyName: 'Apidog',
tagline: 'Design. Debug. Test. Document.',
},
});
console.log('URL del video:', result.url);
Paso 10: Construye una API de Generación de Video
Crea un endpoint de API que genere videos bajo demanda.
10.1 Pide a Claude Code que cree un servidor Express:
Crea un servidor API Express.js con estos endpoints:
POST /api/videos/generate
- Acepta: template, props, format
- Dispara un renderizado de Remotion Lambda
- Devuelve: jobId, status
GET /api/videos/status/:jobId
- Devuelve el progreso del renderizado y la URL de descarga cuando esté completo
Incluye manejo de errores adecuado y validación Zod.
10.2 Claude Code genera el servidor:
server/index.ts:
import express from 'express';
import { renderMediaOnLambda, getRenderProgress } from '@remotion/lambda/client';
import { z } from 'zod';
const app = express();
app.use(express.json());
const generateSchema = z.object({
template: z.enum(['company-intro', 'product-demo']),
props: z.record(z.unknown()),
format: z.enum(['mp4', 'webm', 'gif']).default('mp4'),
});
app.post('/api/videos/generate', async (req, res) => {
try {
const { template, props, format } = generateSchema.parse(req.body);
const { renderId, bucketName } = await renderMediaOnLambda({
region: 'us-east-1',
functionName: 'remotion-render',
composition: template,
serveUrl: process.env.REMOTION_SITE_URL!,
codec: format === 'gif' ? 'gif' : 'h264',
inputProps: props,
});
res.json({
jobId: renderId,
bucketName,
status: 'processing',
});
} catch (error) {
res.status(400).json({ error: (error as Error).message });
}
});
app.get('/api/videos/status/:jobId', async (req, res) => {
const { jobId } = req.params;
const { bucketName } = req.query;
const progress = await getRenderProgress({
renderId: jobId,
bucketName: bucketName as string,
region: 'us-east-1',
functionName: 'remotion-render',
});
res.json({
status: progress.done ? 'completed' : 'processing',
progress: progress.overallProgress,
downloadUrl: progress.outputFile,
});
});
app.listen(3001, () => {
console.log('API de Video ejecutándose en http://localhost:3001');
});
10.3 Prueba tu API con Apidog:
Usa Apidog para probar tus endpoints de generación de video:

- Crea una nueva solicitud a
POST /api/videos/generate - Establece el cuerpo:
{
"template": "company-intro",
"props": {
"companyName": "TestCorp",
"tagline": "Testing made easy"
},
"format": "mp4"
}
- Envía y verifica que la respuesta contiene un
jobId - Consulta el endpoint de estado hasta que
status: "completed"
Las funciones de prueba automatizadas de Apidog te ayudan a validar que tu pipeline de generación de video funciona de manera fiable.

Ejemplo Completo: Generador de Videos de Marketing
Aquí tienes un ejemplo completo que puedes usar como plantilla.
Prompt para Claude Code:
Crea un generador de videos de marketing completo con estas características:
1. Plantilla: "social-promo"
- Duración: 15 segundos (450 fotogramas a 30fps)
- Resolución: 1080x1080 (cuadrado de Instagram)
2. Escenas:
- Texto de gancho (0-3s): Texto grande y en negrita que capta la atención
- Imagen del producto (3-9s): Muestra un producto con efecto Ken Burns
- Lista de características (9-12s): 3 puntos clave apareciendo secuencialmente
- CTA (12-15s): "Comprar ahora" con animación pulsante
3. Props:
- hookText: string
- productImageUrl: string
- features: string[] (array de 3 elementos)
- ctaText: string
- brandColor: string
4. Incluye atenuación de audio cuando aparece texto
Genera todos los archivos necesarios para que esto funcione.
Claude Code generará una plantilla de video completa y lista para producción que podrás personalizar y renderizar a escala.
Resolución de Problemas Comunes
Problema: "No se puede encontrar el módulo 'remotion'"
# Solución: Reinstalar dependencias
rm -rf node_modules
npm install
Problema: Fuentes no cargan
// Añade la importación de la fuente a tu componente
import { loadFont } from '@remotion/google-fonts/Inter';
const { fontFamily } = loadFont();
// Usar en estilos
style={{ fontFamily }}
Problema: El video se renderiza en negro
- Verifica que tus componentes devuelven contenido visible
- Verifica que
AbsoluteFilltiene un color de fondo establecido - Asegúrate de que las animaciones no estén todas en opacidad 0
Problema: Claude Code no reconoce las habilidades de Remotion
# Reinstala la habilidad
npx skills add remotion-dev/skills
# Verifica que .claude/skills/remotion/SKILL.md existe
ls .claude/skills/remotion/
# Reinicia Claude Code
Problema: Errores de desajuste de versión
# Verifica y actualiza las versiones de Remotion
npx remotion versions
# Esto a menudo soluciona problemas de compatibilidad
¿Construyendo APIs de generación de video? Prueba Apidog gratis para diseñar, probar y documentar tus endpoints. Valida esquemas de solicitud, automatiza escenarios de prueba y asegura que tu pipeline de video maneje los casos extremos con elegancia.
