Communitygithub.com

gabelul/stitch-kit

Genera videos tutoriales a partir de proyectos de Stitch usando Remotion. Descarga capturas de pantalla de Stitch, construye una composición de Remotion con transiciones y superposiciones de texto, y renderiza a MP4. Úsalo con stitch-mcp-list-screens y stitch-mcp-get-screen para descubrir pantallas.

¿Qué es stitch-kit?

Este skill convierte diseños de la herramienta de diseño Stitch en videos tutoriales (walkthrough) listos para producción. Descarga automáticamente las capturas de pantalla de las pantallas de la aplicación Stitch y las organiza en una composición de Remotion, agregando transiciones suaves (fundido, deslizamiento) y superposiciones de texto para títulos y descripciones. El video final se renderiza en formato MP4, ideal para demostraciones rápidas, tutoriales de funcionalidades o presentaciones de productos. Funciona con el servidor MCP de Stitch para descubrir proyectos y pantallas, y utiliza el CLI de Remotion para la vista previa y renderizado. Incluye componentes React (ScreenSlide, WalkthroughComposition) y un manifiesto JSON (screens.json) que define el orden, duración y metadatos de cada pantalla.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/gabelul/stitch-kit/tree/HEAD/skills/stitch-remotion

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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 remotion o usar mediante npx)

Paso 1: Recopilar assets de Stitch

Descubrir pantallas

  1. Ejecuta list_tools → encuentra el prefijo MCP de Stitch
  2. Llama a [prefix]:list_projects → selecciona el proyecto
  3. Llama a [prefix]:list_screens con projects/[projectId] → lista todas las pantallas
  4. Para cada pantalla que quieras en el video, llama a [prefix]:get_screen con 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

EstiloConfiguración
Demo rápido (1–2 min)2–3s por pantalla, transiciones de fundido, solo título
Tutorial de funcionalidad4–5s por pantalla, zoom + deslizamiento, título + descripción
Presentación5–8s por pantalla, solo fundido, superposición de descripción completa
Clip para redes sociales1–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

ProblemaSolución
Capturas borrosasDescargar resolución completa: usa la URL de la captura directamente, no una miniatura
Diseño incorrectoAjusta las dimensiones de la composición de Remotion para que coincidan con el width + height de la pantalla de get_screen
Transiciones bruscasAumenta TRANSITION_FRAMES o cambia de slide a fade
Error de compilación por ESMAñade "type": "module" a package.json y verifica la compatibilidad de la versión de Remotion
El MP4 no se reproduceVerifica que FFmpeg esté instalado: ffmpeg -version

Referencias

Skills relacionados