Videos Tutoriales de Stitch → Remotion
Restricción: Usa este skill solo cuando el usuario mencione explícitamente "Stitch" y video tutorial, demo o Remotion.
Eres un especialista en producción de video que crea videos tutoriales a partir de diseños de la aplicación Stitch. Obtienes capturas de pantalla de Stitch y construyes una composición de Remotion — transiciones de diapositivas, animaciones de zoom y superposiciones de texto.
Prerrequisitos
- Servidor MCP de Stitch (o IDs de pantalla ya conocidos)
- Node.js 18+ y npm
- CLI de Remotion (
npm install -g remotiono usar mediantenpx)
Paso 1: Recopilar assets de Stitch
Descubrir pantallas
- Ejecuta
list_tools→ encuentra el prefijo MCP de Stitch - Llama a
[prefix]:list_projects→ selecciona el proyecto - Llama a
[prefix]:list_screensconprojects/[projectId]→ lista todas las pantallas - Para cada pantalla que quieras en el video, llama a
[prefix]:get_screencon los IDs numéricos
Descargar capturas de pantalla
Para cada pantalla:
# Descarga la captura al directorio de assets
curl -L "[screenshot.downloadUrl]" -o "video/public/assets/[screen-name].png"
O usa el script de descarga:
bash scripts/fetch-stitch.sh "[htmlCode.downloadUrl]" "temp/[screen-name].html"
# Las capturas son independientes — descarga mediante curl con la URL de la captura
Crear manifiesto de pantallas
Crea screens.json describiendo el video:
{
"projectName": "Mi App",
"fps": 30,
"screens": [
{
"id": "home",
"title": "Pantalla de inicio",
"description": "Panel principal con métricas clave",
"imagePath": "./public/assets/home.png",
"width": 390,
"height": 844,
"durationSeconds": 4
},
{
"id": "profile",
"title": "Perfil de usuario",
"description": "Configuración y gestión de cuenta",
"imagePath": "./public/assets/profile.png",
"width": 390,
"height": 844,
"durationSeconds": 3
}
]
}
Paso 2: Configurar proyecto Remotion
# Crea un nuevo proyecto Remotion dentro del directorio de trabajo
cd video
npm create video@latest -- --blank
cd walkthrough-video
npm install @remotion/transitions
Paso 3: Construir la composición
Componente ScreenSlide
// video/src/ScreenSlide.tsx
import { AbsoluteFill, Img, interpolate, spring, useCurrentFrame, useVideoConfig } from 'remotion'
interface ScreenSlideProps {
/** Ruta a la imagen de la captura */
imagePath: string
/** Título de la pantalla mostrado como superposición */
title: string
/** Texto de descripción de apoyo */
description: string
/** Si se debe hacer zoom durante la visualización */
withZoom?: boolean
}
/**
* Diapositiva de pantalla única con efecto de zoom opcional y superposición de texto.
* Se desvanece, se mantiene y se desvanece.
*/
export function ScreenSlide({ imagePath, title, description, withZoom = true }: ScreenSlideProps) {
const frame = useCurrentFrame()
const { fps, durationInFrames } = useVideoConfig()
// Aparecer gradualmente en los primeros 15 fotogramas
const fadeIn = spring({ fps, frame, config: { damping: 200 } })
// Zoom sutil: 100% → 105% durante la duración
const scale = withZoom
? interpolate(frame, [0, durationInFrames], [1, 1.05], { extrapolateRight: 'clamp' })
: 1
return (
<AbsoluteFill style={{ backgroundColor: '#000' }}>
{/* Captura de pantalla */}
<AbsoluteFill style={{ opacity: fadeIn, transform: `scale(${scale})`, transformOrigin: 'center' }}>
<Img src={imagePath} style={{ width: '100%', height: '100%', objectFit: 'contain' }} />
</AbsoluteFill>
{/* Superposición de texto inferior */}
<AbsoluteFill
style={{
justifyContent: 'flex-end',
padding: '40px 60px',
background: 'linear-gradient(transparent, rgba(0,0,0,0.7))',
opacity: fadeIn,
}}
>
<h2 style={{ color: '#fff', fontSize: 36, fontWeight: 700, margin: 0 }}>{title}</h2>
{description ? (
<p style={{ color: 'rgba(255,255,255,0.8)', fontSize: 20, margin: '8px 0 0' }}>
{description}
</p>
) : null}
</AbsoluteFill>
</AbsoluteFill>
)
}
Composición Walkthrough
// video/src/WalkthroughComposition.tsx
import { Series, TransitionSeries } from '@remotion/transitions'
import { fade } from '@remotion/transitions/fade'
import { slide } from '@remotion/transitions/slide'
import screensData from '../../screens.json'
import { ScreenSlide } from './ScreenSlide'
const TRANSITION_FRAMES = 15 // 0.5s a 30fps
/**
* Composición principal del tutorial — una pantalla por diapositiva, transiciones de fundido/deslizamiento.
*/
export function WalkthroughComposition() {
return (
<TransitionSeries>
{screensData.screens.map((screen, i) => (
<>
<TransitionSeries.Sequence
key={screen.id}
durationInFrames={screen.durationSeconds * screensData.fps}
>
<ScreenSlide
imagePath={screen.imagePath}
title={screen.title}
description={screen.description}
/>
</TransitionSeries.Sequence>
{/* Añadir transición entre pantallas (excepto después de la última) */}
{i < screensData.screens.length - 1 && (
<TransitionSeries.Transition
key={`t-${screen.id}`}
timing={fade({ durationInFrames: TRANSITION_FRAMES })}
/>
)}
</>
))}
</TransitionSeries>
)
}
Registrar en Root.tsx
// video/src/Root.tsx
import { Composition } from 'remotion'
import { WalkthroughComposition } from './WalkthroughComposition'
import screensData from '../../screens.json'
const TOTAL_FRAMES = screensData.screens.reduce(
(acc, s) => acc + s.durationSeconds * screensData.fps,
0
)
export const RemotionRoot = () => (
<>
<Composition
id="Walkthrough"
component={WalkthroughComposition}
durationInFrames={TOTAL_FRAMES}
fps={screensData.fps}
width={screensData.screens[0]?.width ?? 390}
height={screensData.screens[0]?.height ?? 844}
/>
</>
)
Paso 4: Vista previa y renderizado
# Vista previa en navegador
cd video/walkthrough-video
npm run dev
# Renderizar a MP4
npx remotion render Walkthrough output.mp4
# Renderizado de mayor calidad
npx remotion render Walkthrough output.mp4 --jpeg-quality 95 --concurrency 4
Estilos comunes de video
| Estilo | Configuración |
|---|---|
| Demo rápido (1–2 min) | 2–3s por pantalla, transiciones de fundido, solo título |
| Tutorial de funcionalidad | 4–5s por pantalla, zoom + deslizamiento, título + descripción |
| Presentación | 5–8s por pantalla, solo fundido, superposición de descripción completa |
| Clip para redes sociales | 1–2s por pantalla, cortes rápidos, pista musical |
Estructura de archivos
project/
├── screens.json ← Manifiesto de pantallas
├── scripts/fetch-stitch.sh ← Descargador GCS
└── video/
├── public/
│ └── assets/ ← Capturas descargadas
└── walkthrough-video/
├── src/
│ ├── WalkthroughComposition.tsx
│ ├── ScreenSlide.tsx
│ └── Root.tsx
├── remotion.config.ts
└── package.json
Solución de problemas
| Problema | Solución |
|---|---|
| Capturas borrosas | Descargar resolución completa: usa la URL de la captura directamente, no una miniatura |
| Diseño incorrecto | Ajusta las dimensiones de la composición de Remotion para que coincidan con el width + height de la pantalla de get_screen |
| Transiciones bruscas | Aumenta TRANSITION_FRAMES o cambia de slide a fade |
| Error de compilación por ESM | Añade "type": "module" a package.json y verifica la compatibilidad de la versión de Remotion |
| El MP4 no se reproduce | Verifica que FFmpeg esté instalado: ffmpeg -version |
Referencias
- Documentación de Remotion: https://www.remotion.dev/docs/
- Transiciones de Remotion: https://www.remotion.dev/docs/transitions
scripts/fetch-stitch.sh— Descargador GDS confiablestitch-mcp-list-screens— Descubre pantallas en un proyecto de Stitchstitch-mcp-get-screen— Obtén URLs de descarga de capturas