Communitygithub.com

funi-ai/demo-video

Videos de demostración, vistas previas de tiendas, vídeos de encabezado/búsqueda de App Store y bucles recortados de la GRABACIÓN DE PANTALLA REAL del usuario: recortados, acelerados, ampliados, enmarcados, subtitulados y locutados con ffmpeg local. Los modelos añaden solo lo que no es el producto: narración (Eleven v3, Gemini TTS para turco), música y sonido de interfaz.

¿Qué es demo-video?

Este skill, `demo-video`, transforma grabaciones de pantalla reales del usuario en vídeos de demostración pulidos, vistas previas para tiendas de aplicaciones, vídeos promocionales y bucles GIF, todo ello sin regenerar nunca la interfaz de la aplicación. Está diseñado para desarrolladores que necesitan producir activos promocionales como vídeos de vista previa para App Store, vídeos de encabezado para App Store, promos para Google Play o vídeos de lanzamiento para Product Hunt directamente desde sus capturas de pantalla. El skill utiliza `ffmpeg` local para todas las operaciones de edición de vídeo (cortar, acelerar, ampliar, añadir marcos y superposiciones), lo que garantiza que los píxeles del producto nunca pasen por un modelo de IA. Los componentes generados por IA se limitan estrictamente a añadir narración (a través de Eleven Labs o Gemini TTS para turco), música de fondo y efectos de sonido de interfaz. El flujo de trabajo se rige por un archivo `cut.json` y el script `democut.py`, que gestiona todo el proceso, desde la ingesta inicial de la grabación y el análisis hasta el renderizado, la generación de subtítulos y la validación final. El skill impone una disciplina rigurosa: el usuario debe aprobar una 'tarjeta de corte' (una lista detallada de escenas) antes de generar o renderizar nada. La narración se genera primero para medir la duración, y luego se corta el vídeo para que coincida. Se incluyen comprobaciones de validación exhaustivas para garantizar el cumplimiento de las pautas de la tienda de aplicaciones (como la duración, el tamaño y la velocidad de fotogramas correctos) y para evitar mostrar datos reales de usuarios. También maneja variantes para diferentes plataformas de destino y garante que los bucles comiencen y terminen sin problemas.

Compatible con✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/funi-ai/claude-plugins/tree/main/plugins/genmedia-skills/skills/demo-video

Preguntar en tu IA favorita

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

Documentación

Vídeo de demostración

Una demostración de producto, una vista previa de tienda o un bucle de funcionalidad construido a partir de la grabación de pantalla real del usuario. La interfaz nunca se regenera: la grabación se corta, acelera, amplía, enmarca, subtitula y locuta. Apple establece la misma regla para las vistas previas (2.3.4: se permiten capturas de vídeo de la propia aplicación, narración y superposiciones). Un cut.json contiene las grabaciones, las escenas ordenadas y las variantes; democut.py lo convierte en archivos con ffmpeg local, y volver a cortar es gratuito.

Paso 0 — Verificación previa

Una vez por sesión:

python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
  • kind: "ffmpeg_missing" → no es posible cortar localmente. Dilo y ofrece la ruta de utilidad de pago en references/routing-utility.md, o pide al usuario que instale ffmpeg. Nunca improvises con otras herramientas.
  • Mantén can.burn_captions (libass), can.duck (sidechaincompress), can.webm. Los que falten cambian lo que prometes, nunca lo que afirmas.
  • Solo cuando se vaya a generar algo (narración, música, sonido, doblaje, una placa):
    command -v genmedia
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflight
    
    blockers no vacío, CLI faltante o más antiguo que 0.7.0 → /genmedia-skills:setup. Clave faltante → el usuario ejecuta genmedia setup o exporta FAL_KEY él mismo; espera. Nunca leas, imprimas, solicites ni escribas una clave. Mantén config.announce_above_usd y config.confirm_above_usd (valores predeterminados 0.50 y 2).
  • Reanuda primero: si existe .genmedia/projects/<slug>/demo-video/cut.json → continúa desde ahí, nunca inicies un segundo corte para el mismo producto.

Reglas de UX

  1. Responde en el idioma del usuario. La narración, las líneas de say y el texto en pantalla permanecen en el idioma en el que se entregan; las indicaciones del modelo están en inglés. Las rutas, los identificadores y los nombres de campo permanecen como están.
  2. Sin JSON, gráficos de filtro, ID de solicitud ni narración de herramientas en el chat. Como máximo una línea de estado por paso largo.
  3. Presupuesto de preguntas: 2, una a la vez, opciones etiquetadas, solo cuando falte la respuesta:
    • P1 la grabación, cuando no se haya dado ningún archivo: pide las rutas y pasa la lista corta de captura de references/recording-tips.md. No hay valor predeterminado para el metraje.
    • P2 el destino, cuando la solicitud no lo especifique: A Demostración web (16:9) · B Vista previa de App Store · C Vídeo de encabezado o resultados de búsqueda de App Store · D Promo de Google Play · E Vídeo de lanzamiento de Product Hunt · F Un bucle silencioso o GIF. Se pueden elegir varios; un solo corte sirve para todos. Todo lo demás es un valor predeterminado que indicas en la entrega: 60 s para una demo, 20 s para una vista previa de tienda, 12 s para un vídeo de encabezado o búsqueda de App Store, 6 s para un bucle; narración activada para una demo, desactivada para un bucle o un vídeo de encabezado o búsqueda; música desactivada a menos que se solicite; subtítulos como archivo secundario; cortes, no fundidos; sin marco de dispositivo a menos que un destino de tienda o red social lo requiera.
  4. La tarjeta de corte es una parada obligatoria. Muestra la lista de escenas (tiempos, qué sucede, qué se dice, duraciones) y espera un «sí» antes de generar o renderizar algo. El silencio no es aprobación, y un «sí» a una versión anterior no es un «sí» a esta.
  5. La narración antes que la imagen. Genera la voz por escena, deja que time la mida y corta la imagen para que coincida. Nunca cronometres una escena adivinando cuánto tarda una oración (references/narration-and-audio.md).
  6. Mira antes de entregar. Lee el fotograma de póster y una hoja de contactos del archivo terminado, y lee el primer fotograma de cualquier GIF. Una demo que se valida pero muestra la pantalla incorrecta sigue siendo incorrecta.
  7. Los hechos y la privacidad provienen del usuario. Las calificaciones, recuentos, premios, nombres de clientes y logotipos aparecen solo cuando el usuario los ha proporcionado. Si un fotograma muestra datos reales, la solución es una nueva grabación, no un desenfoque; dilo claramente.
  8. Coste: el corte, los fotogramas, los bucles y cada comprobación cuestan USD 0. Antes de cualquier generación, estima y aplica el límite de la verificación previa: por debajo de announce_above_usd → ejecuta e indícalo; hasta confirm_above_usd → una línea, luego ejecuta; por encima → «sí» explícito. Nunca cotices un precio de memoria.
  9. Acotado: como máximo 3 intentos de reparación por paso, algo cambia cada vez; un rechazo por política de contenido nunca se reenvía sin cambios; un trabajo con un ID de solicitud se reanuda, nunca se reenvía.

Barrera de descubrimiento

scripts/video-surfaces.json es una caché con fecha (verified_on, leído por democut.py specs): un null es un número que nadie leyó de la página oficial, nunca lo rellenes de memoria, y cuando una tienda rechaza un archivo, la página oficial gana y la fila se corrige.

Antes de la primera llamada de pago a un endpoint en una sesión:

genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>

status debe ser active; los campos, enumeraciones y límites provienen del esquema. Si no está activo → el siguiente nivel de esa tarea en references/routing-audio.md. Nunca genmedia run con una indicación en lugar de un ID de endpoint. Las nuevas versiones se encuentran bajo espacios de nombres de proveedores, no solo fal-ai/.

Enrutamiento

NecesidadCómoPor qué
Recortar, acelerar, ampliar, enmarcar, unir, superponer, mezclar, volumen, GIF, comprobacionesdemocut.py (ffmpeg local)exacto, gratuito, repetible; los píxeles del producto nunca pasan por un modelo
Mirar una grabación o un resultado sin verlodemocut.py analyze, sheet, grab; frames.py sheetdetectores y hojas de contactos en lugar de suposiciones
Narraciónfal-ai/elevenlabs/tts/eleven-v3; Turco: fal-ai/gemini-3.1-flash-ttsTTS predeterminado; la ruta turca está verificada por esquema
Música de fondo, sonidos de interfazelevenlabs/music/v2.5 (duración exacta), fal-ai/elevenlabs/sound-effects/v2control de duración; económico por segundo
Sincronización de subtítulos precisa por palabrafal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captionsmarcas de tiempo por palabra
Otro idioma para un archivo terminadofal-ai/elevenlabs/dubbinguna llamada por idioma
Marco de dispositivo, tarjeta final, texto exacto en imagen/genmedia-skills:launch-graphics (layers, PNGs compuestos)el texto se compone donde es exacto, nunca se genera
Placa de fondo detrás de un dispositivo enmarcadobytedance/seedream/v5/pro/text-to-imageuna placa por vídeo, sin letras
Sin ffmpeg localfal-ai/ffmpeg-api/* en references/routing-utility.mdcéntimos por llamada, un plan de respaldo y no el predeterminado

Desempates y trampas:

  1. La interfaz nunca se genera, rediseña, reenmarca ni «mejora». video-reframe, video-edit y los upscalers repintan el texto de la interfaz de usuario: son para metraje generado, no para una grabación.
  2. Zoom en fracciones del fotograma de origen, leído de grab --grid o sheet --grid; hold para detalle, push una vez para guiar la vista, pull una vez para revelar contexto (references/editing.md).
  3. Una vista previa de tienda no es la demo con un final más corto: es su propia variante con su propio subconjunto de escenas.
  4. Play y Product Hunt requieren una URL de YouTube, no un archivo: entrega el archivo y di quién lo sube.
  5. Un vídeo de encabezado o resultados de búsqueda de App Store (activo creativo de iOS 27) es su propia variante silenciosa y en bucle: appstore-header-video (3840x1646) o appstore-search-video (3:2), 30 o 60 fps, 5-30 s, una idea, escenas de 2 s o más, terminando donde empezó. Apple no enumera un vídeo universal; las imágenes fijas son trabajo de launch-graphics (references/surfaces.md sección 1a).
  6. Una grabación de teléfono necesita un marco de teléfono; time rechaza una discrepancia de aspecto del 30 %.
  7. Quemar solo cuando can.burn_captions; de lo contrario, un archivo secundario, o la ruta de subtítulos de pago, dicho en voz alta.
  8. El usuario nombró un modelo → úsalo después de la comprobación en vivo.

Flujo de trabajo

  1. Ingesta. Objetivo, destinos, grabaciones, marca. Lee cada archivo que el usuario nombró. Luego, por grabación:
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<Product>" --target web-16x9
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktop
    
    La respuesta incluye tamaño, fps, duración, audio, cualquier letterboxing incorporado y los destinos que se ajustan al aspecto. Una grabación más pequeña que el destino, o que muestra datos reales, recibe una solicitud de regrabación ahora, no después de la edición (references/recording-tips.md).
  2. Mírala.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" analyze --slug <slug> --source app
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" sheet --slug <slug> --source app --count 12 --cols 4 --grid
    
    Lee la hoja. dead_spans y keep_spans son candidatos, nunca una edición: una pantalla estática a veces es el punto. grab --at <s> --grid para cualquier fotograma en el que vayas a hacer zoom.
  3. Tarjeta de corte. Escenas en orden: id, entrada/salida de origen, velocidad, zoom, qué ve el espectador, qué dice la voz, duración; luego las variantes, qué se genera, qué se necesita del usuario y las suposiciones. Muéstrala, para, espera un «sí» (references/editing.md).
  4. Narración, medida (solo si la demo tiene voz). Precio y ejecuta un lote por references/narration-and-audio.md, un archivo por escena, luego deja que los números decidan la imagen:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price fal-ai/elevenlabs/tts/eleven-v3,elevenlabs/music/v2.5 --explain
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" batch --plan .genmedia/projects/<slug>/demo-video/voice-plan.json
    
  5. Escribe el corte. Edita .genmedia/projects/<slug>/demo-video/cut.json con la herramienta de Escribir o Editar: scenes, audio, variants. Cada campo: references/cut-json.md. Los marcos de dispositivo provienen de launch-graphics layers (references/frames-and-loops.md).
  6. Compuerta.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>
    
    Corrige cada error antes de renderizar: scene_shorter_than_voice (alarga el intervalo, reduce la velocidad o corta palabras — nunca aceleres la voz), duration_out_of_range en un destino de tienda, wrong_size, fps_not_allowed, transition_too_long, frame_aspect_mismatch, overlay_invisible. Actúa sobre las advertencias (quick_cut, fast_motion, narration_muted en un vídeo de activo creativo) o explica las que mantengas.
  7. Construir.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>
    
    Tiempo de espera de Bash de 600000 ms. Las escenas se almacenan en caché por contenido: una revisión vuelve a renderizar solo lo que cambió (--scene <id>, --force). Luego subtítulos y bucles:
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" captions --slug <slug> --variant <id> --formats srt,vtt
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" gif --slug <slug> --variant loop-16x9 --budget-mb 3 --seconds 6
    
  8. Mira el resultado. Lee el fotograma de póster, luego una hoja de contactos del archivo terminado, luego el primer fotograma del GIF:
    python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3
    
    Verifica los primeros 3 segundos, los fotogramas ampliados (¿legibles?), el último fotograma (¿estable?), cada fotograma en busca de datos privados y lee el archivo de referencia letra por letra.
  9. Validar y entregar.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>
    
    Tamaño exacto, fps, duración dentro de la ventana de la plataforma, códec y perfil, límite de bytes, configuración de audio, volumen medido y pico verdadero, y en un destino de bucle la costura (loop_seam). Luego el mensaje de entrega. Revisiones: edita el corte, vuelve a construir, valida de nuevo.

Entrega

<Product> demo: genmedia-output/<slug>/demo-video/
Master 16:9: web-16x9/<slug>.mp4 (1920x1080, <n> s) · póster web-16x9/<slug>-poster.png
Vista previa App Store: appstore-iphone/<slug>.mp4 (886x1920, <n> s, H.264 High, AAC 256k) <solo si se construyó>
Vídeo de encabezado / búsqueda App Store: appstore-header-video/<slug>.mov (3840x1646, <n> s, <fps> fps, bucle silencioso) · fotograma de póster para seleccionar en App Store Connect: <t> s <solo si se construyó>
Promo Play / Product Hunt: el mismo master — ambas plataformas aceptan una URL de YouTube, así que súbelo y pega el enlace <solo si se construyó>
Bucles: loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif (<n> MB, <w>px@<fps>) · primer fotograma <slug>-loop-first.png <solo si se construyó>
Subtítulos: <variant>/<slug>.srt, .vtt (<language>) <solo si se construyó> · manifest.json
Tu grabación, sin cambios: cortada, <acelerada donde esperaba>, ampliada en <qué>, <enmarcada en un dispositivo dibujado>. Nada en la interfaz se regeneró.
Elegido para ti: <duración, número de escenas, narración activada/desactivada, música, subtítulos, marcos, ajuste — todos los valores predeterminados que el usuario no estableció>
Notas de tienda: <una línea cada una que corresponda: las vistas previas de App Store son de 15-30 s, hasta 3 por dispositivo, solo capturas de pantalla (2.3.4) · los vídeos de encabezado y búsqueda se repiten silenciados (búsqueda: nunca sin silenciar), se muestran en iOS 27 y iPadOS 27 o posterior, y su fotograma de póster se fija una vez aprobado · solo los primeros 30 s de una promo de Play se reproducen automáticamente · las imágenes de Product Hunt, incluido el GIF, deben pesar menos de 3 MB y el GIF se anima al pasar el ratón por encima>
Generado: <ninguno, USD 0 | narración <n> líneas en <modelo>, música, est. USD <x>> · Los archivos son locales; no se subió nada.
Siguiente: nombra una escena y qué cambiar (entrada/salida, velocidad, zoom, palabras); volver a cortar es gratuito.

Tradúcelo; mantén las rutas, tamaños y texto en pantalla sin cambios.

Errores

SeñalHaz
kind: "ffmpeg_missing"Sin ffmpeg local. Di que el corte no se puede hacer aquí; ofrece la ruta ffmpeg-api de fal (references/routing-utility.md) o pide al usuario que lo instale.
source_changedLa grabación se movió o cambió. source add --replace, luego vuelve a verificar cada entrada/salida: los tiempos antiguos ya no significan nada.
check_failed de timeCada entrada nombra una escena y un número. Arregla el corte; nada se renderiza mientras haya un error.
scene_shorter_than_voiceAlarga el intervalo, reduce speed o corta palabras. Nunca aceleres la narración para que encaje.
duration_out_of_rangeSe incumplió una ventana oficial (vistas previas de App Store 15-30 s, vídeos de encabezado y búsqueda 5-30 s). Elimina o acorta escenas solo para esa variante.
wrong_size, fps_not_allowed, fps_too_highEl tamaño o fps de la variante rompe su fila. Elimina la anulación o elige un valor que la fila acepte (specs).
loop_seam de validateEl bucle salta en su reinicio. Termina en el estado inicial o mantén la misma región, construye, valida de nuevo.
frame_aspect_mismatchLa relación de aspecto de la grabación no coincide con el destino. Elige un destino que coincida (specs) o pide una regrabación. El usuario debe saber qué destinos se ajustan.
overlay_invisibleLa imagen de superposición (marco, tarjeta final) no es visible en el fotograma de origen. Aumenta la escala o elige una superposición diferente de launch-graphics.

Referencias

(Las referencias se encuentran en los archivos indicados. La ruta es relativa al directorio del skill funi-ai/demo-video.)

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

funi-ai/ads

Ads from the user's REAL product: UGC and polished ad videos (presenter, unboxing, showcase, testimonial, TV spot) and static ads with copy. Physical products: keyframes locked to the product photo, Seedance clips or TTS + OmniHuman, GPT Image 2.5 copy. Apps and SaaS: real captures and recordings, composited, never regenerated. Use when: "make a UGC ad for this product", "15 second TikTok ad", "static ad with this headline", "app install ad from my screen recording", "A/B ad variants", "bu ürün için reklam videosu yap", "uygulamam için reklam hazırla", "indirim görseli hazırla". Chain: consumes `product-photoshoot` stills, `character` @handles, `launch-graphics` pages; produces ads and a manifest. NOT for: text-free product photos (use `product-photoshoot`); posters (use `image`); listing cards (use `marketplace-cards`); store screenshots, OG cards (use `launch-graphics`); one clip (use `video`); organic shorts (use `short-video`); product demos (use `demo-video`); thumbnails (use `youtube-thumbnail`).

funi-ai/youtube-thumbnail

Thumbnails and covers that survive at small size: YouTube thumbnails (16:9), Shorts, Reels and TikTok covers (9:16), podcast and course covers (1:1), from a title plus an optional face photo, @handle character, brand colours or a frame of the user's own video. Text baked in by GPT Image 2.5; faces locked through reference edits. Use when: "make a thumbnail for my video", "YouTube thumbnail with my face", "Shorts cover", "podcast cover art", "thumbnail from this frame", "change only the text on the thumbnail", "videoma thumbnail yap", "kapak görseli hazırla", "küçük resimdeki yazıyı değiştir". Chain: consumes an @handle from `character` and stills or frames from `image` and `video`; produces sized PNG and JPEG. NOT for: posters, photo edits (use `image`); logos (use `brandkit`); link cards, OG images (use `launch-graphics`); ad creatives (use `ads`); the video (use `video`, `short-video`); new characters (use `character`); batches (use `pipelines`); model choice (use `models`); setup problems (use `setup`).

Skills relacionados