Communitygithub.com

YouTube Thumbnail

Miniaturas y portadas que funcionan en tamaño pequeño: thumbnails de YouTube (16:9), portadas de Shorts, Reels y TikTok (9:16), portadas de podcasts y cursos (1:1), a partir de un título y una foto opcional del rostro, un @handle, colores de marca o un fotograma del video del usuario. El texto se hornea con GPT Image 2.5; los rostros se fijan mediante ediciones de referencia.

¿Qué es YouTube Thumbnail?

Esta skill automatiza la creación de thumbnails y portadas para múltiples plataformas de video (YouTube, Shorts, Reels, TikTok) y audio (podcasts, cursos), generando diseños a partir de un título o tema, con soporte para rostros (foto o @handle), colores de marca y fotogramas de video. Utiliza modelos de IA generativa como GPT Image 2.5 y Seedream para garantizar texto legible incluso en tamaños reducidos (aproximadamente 160 px de ancho en feeds). Su flujo de trabajo consta de tres fases: pre-vuelo (verificación de herramientas y costos), generación de tres conceptos diferentes (seleccionados por el usuario) y refinamiento final con hasta tres rondas de revisión. Está diseñada para agentes como Claude Code, Cursor y Codex, y se integra con scripts locales y servicios en la nube (FAL.ai) para la generación y edición de imágenes. La skill prioriza la veracidad (no inventar datos o personas), el consentimiento para rostros reales y el control de costos mediante umbrales configurables.

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

Preguntar en tu IA favorita

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

Documentación

¿Qué hace YouTube Thumbnail?

Miniaturas y portadas evaluadas al tamaño que la gente realmente las ve: unos 160 px de ancho en un feed. Un título de entrada, tres conceptos diferentes de salida, el usuario elige, un final, revisiones limitadas, archivos en el tamaño exacto de entrega. El oficio (marcos conceptuales, plantilla de prompt, reglas de texto, el filtro de tamaño pequeño) reside aquí; la mecánica en references/cli-contract.md y references/platform.md.

Paso 0 — Pre-vuelo

Una vez por sesión:

command -v genmedia
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflight
python3 "${CLAUDE_SKILL_DIR}/scripts/thumbcheck.py" tools
  • 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 por su cuenta; espera. Nunca leas, imprimas, solicites o escribas una clave.
  • Mantén config.announce_above_usd y config.confirm_above_usd (valores predeterminados 0.50 y 2): son los umbrales de control de costos.
  • thumbcheck.py tools indica cuáles de preview, sheet, fit, frame pueden ejecutarse aquí (necesita ffmpeg local o macOS sips), y si lockup puede (necesita un navegador de la familia Chromium). Si ninguno está presente → el modo degradado en el Paso 6 del flujo de trabajo. Nunca planifiques con drawtext, Pillow o ImageMagick: el texto lo renderiza el modelo.
  • Reanuda primero: un .genmedia/projects/<slug>/thumbnail.md que coincida con esta solicitud → léelo, continúa en su primer paso abierto. Nunca reinicies un proyecto que tenga entradas de ledger.

Reglas de UX

  1. Responde en el idioma del usuario (Turco de entrada → Turco de salida). Escribe los prompts del modelo en inglés; el texto en la imagen permanece en el idioma y ortografía exacta en que se publicará. Los IDs de endpoint, nombres de campo y rutas se mantienen como están.
  2. Sin JSON, IDs de solicitud, prompts ni narración de herramientas en el chat. Espera en silencio; como máximo una línea de estado por lote.
  3. Presupuesto de preguntas: 2, una a la vez, como opciones etiquetadas, solo cuando falte la respuesta:
    • P1 las palabras gancho: sin título y sin tema → pregunta por el título. Título conocido → no preguntes; escribe tú mismo las 2 a 4 palabras gancho (tres diferentes entre los conceptos).
    • P2 rostro o sin rostro: pregunta solo si nada lo decide. Una foto, un @handle o "yo / mi cara / ben" → rostro. "Sin rostro", un producto, una grabación de pantalla, un paisaje → sin rostro. El usuario pide solo un thumbnail o nombra el concepto → un borrador en lugar de tres; la elección se convierte en un sí o no. Todo lo demás es un valor predeterminado que indicas en la línea de entrega: formato 16:9; idioma del texto = idioma del título; paleta = los colores de marca proporcionados, si no, elegidos por concepto; aspecto fotorrealista de póster; 3 conceptos; maestro final 2560x1440 entregado como 1920x1080 y 1280x720. No cuentan: la confirmación de consentimiento, la elección, una confirmación de costo.
  4. La elección es una parada forzosa. Muestra la hoja comparativa y espera. El silencio, un trabajo exitoso o tu propia preferencia nunca son una elección. Recomendar uno está permitido; elegir no.
  5. Veracidad. Un thumbnail puede dramatizar, nunca tergiversar. Todo lo mostrado o escrito debe estar en el video o seguir honestamente de él: sin números, resultados, reacciones, productos o invitados inventados; sin UI falsa de una plataforma real; sin logotipos o personajes que el usuario no posea. No puedes saber lo que entrega el video → pregunta antes de prometerlo (esto reemplaza a P1 o P2, no añade una pregunta).
  6. Rostros. Foto de una persona real (incluido el usuario) → una confirmación de que tiene el consentimiento de esa persona, y una línea que indica que las subidas están en URLs públicas. Nunca una celebridad o figura pública que el usuario no sea; "se parece a " es rechazado, ofrece un rostro inventado o un concepto sin rostro. Un rostro inventado es un sustituto: nunca lo presentes como una persona real nombrada, cliente, experto o invitado, y di en la entrega que el rostro es generado por IA.
  7. Costo: estima toda la solicitud antes de la primera llamada pagada (Paso 4 del flujo de trabajo) y aplica el control con los umbrales del pre-vuelo: por debajo de announce_above_usd → ejecuta; hasta confirm_above_usd → una línea con la estimación, luego ejecuta; en o por encima → muestra la estimación y espera un sí explícito (references/platform.md sección 8). Una aprobación cubre el plan mostrado; un plan más grande necesita uno nuevo. Nunca cotices un precio de memoria; nunca cambies un modelo que el usuario nombró para ahorrar dinero.
  8. Acotado: como máximo 3 rondas de borrador y 3 rondas de revisión; cada intento cambia algo; 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

El enrutamiento a continuación es una caché con fecha (references/routing-image.md, verificado 2026-09-19). Antes de la primera llamada pagada 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. No activo o 404 → siguiente nivel de la misma tarea en references/routing-image.md, si no genmedia models "<nombre>" --no-classify --limit 10 --json, la coincidencia activa más reciente, y di qué modelo se ejecutó.
  • Los nombres de campo, enumeraciones y límites provienen del esquema, nunca de la memoria. El usuario nombra un modelo → busca antes de dudar; los nuevos lanzamientos están bajo espacios de nombres de proveedores (openai/, bytedance/, google/, alibaba/), no fal-ai/.
  • Nunca genmedia run sin un ID de endpoint (el enrutamiento inteligente resuelve valores predeterminados obsoletos).

Enrutamiento

PasoEndpointPor qué
Borradores, nada que referenciaropenai/gpt-image-2.5/flare/text-to-image, quality: "medium"líder en tipografía; solo la familia objetivo puede previsualizar el texto, un modelo de borrador barato no puede
Borradores con foto de rostro, referencias @handle, foto de producto o fotograma de videoopenai/gpt-image-2.5/flare/edit, quality: "medium"las referencias van en image_urls (máx. 16); misma familia que el final
Finalopenai/gpt-image-2.5/sunburst/edit, quality: "high"nivel de precisión; el borrador elegido es la imagen 1, así que el final es esa composición, no una nueva tirada
Revisión (texto, expresión, fondo, color)openai/gpt-image-2.5/sunburst/edit, quality: "high"el final actual es la imagen 1; un alcance por ronda
Lámina sin texto, fotorrealista (ruta alternativa)bytedance/seedream/v5/pro/text-to-imagearena #1 fotorrealista; el texto se añade después con una edición de GPT Image 2.5
Lámina de identidad cuando el rostro se desvíafal-ai/nano-banana-2/editenrutamiento predeterminado para imágenes consistentes en identidad; texto añadido después
Ampliar un fotograma o foto realfal-ai/seedvr/upscale/image; rostros o texto primero: topaz/upscale/image/precisionfiel; Topaz tiene modelos Faces y Text Refine
Fotograma del video del usuariothumbcheck.py frame (ffmpeg local)marca de tiempo exacta; sin ffmpeg → pide al usuario una captura de pantalla
Logotipo propio del usuario en una lámina sin textothumbcheck.py lockup (navegador local)la marca se coloca desde el archivo del usuario; un modelo la redibujaría

Desempates:

  1. Texto en la imagen → GPT Image 2.5, incluso para un concepto fotorrealista. Sin texto en absoluto (el usuario lo dijo) → los borradores pueden ejecutarse en bytedance/seedream/v5/pro/text-to-image o su /edit; el resto del flujo no cambia. Seedream rechaza 1280x720 (su área mínima es 1024x1024) y no tiene campo quality: envía image_size 1920x1080 (9:16 → 1080x1920, 1:1 → 1536x1536) y cotízalo por imagen desde su fila de enrutamiento (aproximadamente USD 0.07 cada una al 2026-09-19: tres borradores son aproximadamente USD 0.20, recalcula el total).
  2. La estrategia de texto predeterminada es horneado en un solo paso. Usa la ruta de lámina (lámina sin texto, luego una edición de "añadir solo este texto") cuando: la misma lámina necesita varios idiomas o redacciones A/B; un diacrítico falló dos veces; la lámina es un fotograma o foto real. Detalles: references/text-and-readability.md.
  3. @handle → lee .genmedia/characters/<handle>/character.json (ancla description; refs[] con role: "face" y active: true), reutiliza la cdn_url de una referencia cuando la tenga, si no sube su archivo; usa el ancla textualmente. real_person: true → se aplica la regla 6 de UX; un consent_confirmed_at registrado es la confirmación. Handle desconocido → díselo, ofrece /genmedia-skills:character; nunca sustituyas.
  4. El usuario nombró un modelo → úsalo después de la verificación en vivo; ofrece el predeterminado en una línea.
  5. El diseño es una lámina más el logotipo propio del usuario (un canal de marca, un video de vista previa de una aplicación) → ruta de lámina, luego thumbcheck.py lockup coloca el archivo del logotipo centrado a una proporción del ancho (references/text-and-readability.md sección 2b). La lámina ya existe (una lámina de launch-graphics, la foto del usuario) → sin llamada pagada: lockup, control, paso 10. Sin archivo de logotipo → pídelo; nunca dejes que el modelo dibuje la marca.

Trampas:

  • Trampa de tamaño automático. Los endpoints de edición predeterminan image_size a auto, que sigue la imagen de entrada: una foto de rostro en retrato produce un thumbnail en retrato. Siempre envía {width,height}.
  • Trampa de calidad predeterminada. quality predetermina a high y la familia factura por tokens. Establécelo en cada llamada: medium en borradores, high en finales; xhigh o max solo después de que el usuario haya aceptado el precio.
  • Trampa de múltiplos de 16. 1920x1080 no es un tamaño legal de GPT Image. Renderiza 1280x720, 2560x1440 o 3840x2160 y deja que thumbcheck.py fit produzca 1920x1080.
  • Trampa de imagen adjunta. Un endpoint de texto a imagen no tiene campo de imagen; ignora la foto y factura de todos modos. Cualquier referencia → el endpoint /edit.
  • Trampa de nueva tirada. Volver a ejecutar el prompt en alta calidad da una imagen diferente (sin seed en esta familia). El final es una edición de la selección.
  • Trampa de mayúsculas. Nunca dejes que el modelo ponga en mayúsculas el turco: escribe tú mismo la cadena final (thumbcheck.py text), entre comillas, y revísala letra por letra.

Flujo de trabajo

  1. Recepción. Título o tema, formato (predeterminado 16:9), rostro o no, colores de marca, referencias. HEIC, AVIF, TIFF o fotos muy grandes primero: thumbcheck.py fit <archivo> --max-side 2048 --out .genmedia/tmp/<nombre>.jpg; lee y sube esa copia. Abre cada imagen local con la herramienta Read antes de planificar (quién y qué hay realmente en ella decide los conceptos). Un fotograma del video del usuario: python3 "${CLAUDE_SKILL_DIR}/scripts/thumbcheck.py" frame <video> --at <segundos o m:ss>, luego léelo. Gasta el presupuesto de preguntas solo como permite la regla 3 de UX.
  2. Tarjeta de estado. Elige un <slug> ASCII corto (eksi-maya): es la label del lote, el filtro del ledger, la carpeta de salida y la carpeta del proyecto. Una etiqueta en lenguaje natural también funciona; el ayudante convierte "Ekşi maya" a Eksi-maya, y esa forma convertida es entonces el nombre de la carpeta. Escribe .genmedia/projects/<slug>/thumbnail.md con la herramienta Write y actualízalo después de cada paso:
    # <título> — thumbnail
    promesa: <una línea: lo que realmente entrega el video>
    formato: 16:9 | idioma del texto: <código> | rostro: <ninguno | ruta de foto | @handle> (consentimiento: <sí, fecha | n/a>) | paleta: <colores>
    [ ] conceptos  [ ] borradores-1  [ ] control  [ ] elección: -  [ ] final  [ ] revisiones 0/3  [ ] entregado
    registro:
    - <fecha> borradores-1: 1 <marco> "<TEXTO>", 2 <marco> "<TEXTO>", 3 <marco> "<TEXTO>"
    
  3. Tres conceptos diferentes. Lee references/frameworks.md. Haz una lluvia de ideas de al menos cinco en privado, conserva los tres más sólidos que usen marcos diferentes (no tres variaciones de color de una idea), cada uno con sus propias 2 a 4 palabras gancho. Ejecuta cada gancho a través de la verificación de texto y usa su cadena upper textualmente:
    python3 "${CLAUDE_SKILL_DIR}/scripts/thumbcheck.py" text "şimdi izle" --lang tr
    
    Las palabras gancho y las imágenes pueden usar solo números, resultados, citas, productos e invitados que el usuario haya indicado (título, resumen, sus archivos); el título solo no te da uno → usa una pregunta, un gancho sin restricciones o un concepto sin texto, o pregunta (regla 5 de UX). Rechaza cualquier concepto que falle la regla de veracidad. Rostro elegido → al menos dos de los tres conceptos lo muestran. El título ya lleva el gancho → un concepto puede ser sin texto.
  4. Verificar y cotizar. Barrera de descubrimiento para cada endpoint, luego:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price openai/gpt-image-2.5/flare/edit,openai/gpt-image-2.5/sunburst/edit
    
    GPT Image 2.5 responde 1 units, que no es un precio. Dólares para esta skill: trabajos x la fila por tamaño y calidad (un tamaño no listado → la siguiente fila más grande) de la tabla GPT Image 2.5 en references/routing-image.md (notas de t2i-typography; las filas de edición ya incluyen una imagen de entrada) + la asignación de referencias en references/platform.md §7 por cada imagen de referencia adicional. Pistas con fecha (2026-09-19): borrador 1280x720 medium aproximadamente USD 0.01; final o revisión 2560x1440 high aproximadamente USD 0.055; 3840x2160 high aproximadamente USD 0.10. Trabajo típico completo (3 borradores + final + 3 revisiones): aproximadamente USD 0.25 sin referencias, aproximadamente USD 0.45 con una referencia de rostro → por debajo del umbral de anuncio predeterminado, ejecuta y declara la estimación en la línea de entrega. Una segunda ronda de borrador, más referencias, xhigh, max, 4K, o varios videos en una solicitud (un slug y tarjeta de estado por video; la estimación es la suma) → recalcula y aplica primero el control.
  5. Borradores en un lote. Sube las referencias una vez y conserva las urls (orden de argumentos); las subidas son URLs públicas, dilo una vez para material privado:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" upload ./me.jpg
    
    Construye cada prompt desde references/prompt-blueprint.md. Escribe el plan con la herramienta Write en .genmedia/projects/<slug>/drafts-1.json:
    {"label": "<slug>", "max_parallel": 3, "jobs": [
      {"id": "draft-a", "endpoint_id": "openai/gpt-image-2.5/flare/edit", "est_cost_usd": 0.02,
       "input": {"prompt": "<concepto A>", "image_urls": ["<url del rostro>"], "image_size": {"width": 1280, "height": 720}, "quality": "medium", "num_images": 1, "output_format": "png"}},
      {"id": "draft-b", "endpoint_id": "openai/gpt-image-2.5/flare/edit", "est_cost_usd": 0.02, "input": {"prompt": "<concepto B>", "image_urls": ["<url del rostro>"], "image_size": {"width": 1280, "height": 720}, "quality": "medium", "num_images": 1, "output_format": "png"}},
      {"id": "draft-c", "endpoint_id": "openai/gpt-image-2.5/flare/edit", "est_cost_usd": 0.02, "input": {"prompt": "<concepto C>", "image_urls": ["<url del rostro>"], "image_size": {"width": 1280, "height": 720}, "quality": "medium", "num_images": 1, "output_format": "png"}}
    ]}
    

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/demo-video

Product demos, store previews, App Store header/search videos and loops cut from the user's REAL screen recording: trimmed, sped, zoomed, framed, captioned, voiced with local ffmpeg. Models add only what is not the product: narration (Eleven v3, Gemini TTS for Turkish), music and UI sound. Use when: "make a demo video of my app", "App Store preview video", "App Store header video", "Google Play promo video", "turn this screen recording into a demo", "GIF loop for my changelog", "Product Hunt launch video", "ekran kaydımdan tanıtım videosu yap", "changelog için GIF döngüsü". Chain: takes recordings, device frames (`layers`) and end cards from `launch-graphics`; produces MP4, WebM, GIF, SRT/VTT and posters. NOT for: generated b-roll shorts (use `short-video`); explainers with generated pictures (use `video-explainer`); paid ads (use `ads`); store screenshots, link cards (use `launch-graphics`); one generated clip (use `video`); voice or music alone (use `audio`); joining finished files (use `pipelines`).

Skills relacionados