Gabriel Neuman
Gabriel Neuman
VisualPúblico

/carrusel-gnb

Convierte texto en slides visuales para redes con marca GNB. Modo recomendado: un prompt → PNG en los 3 formatos (1080x1080, 1920x1080, 1080x1920) sin UI, vía generate_slides.py (Pillow). 4 tipos: carousel, quote, podcast, tweet-pic. Modo HTML alternativo para iterar visual. Úsalo cuando el usuario diga: 'slide', 'carrusel', 'post visual', 'stories', 'quote', 'tweet pic', 'frase', 'podcast slide', 'thumbnail', 'contenido visual'.

Cómo invocarlo

Slash command directo o cualquiera de estas frases naturales:

slidecarruselpost visualstoriesquotetweet picpodcast slide

Hereda de

Este skill carga automáticamente las reglas de:

/voz-gnb

SKILL.md completo

skills/carrusel-gnb/SKILL.md

carrusel-gnb — Slides visuales con marca GNB

Genera slides para redes con la voz e identidad de Gabriel Neuman / GNB Labs. Dos modos: un prompt → PNGs listos (default) o HTML interactivo (para iterar antes de exportar).

Cuándo activar

  • Usuario pide "slide", "carrusel", "tweet pic", "quote", "post visual" o equivalentes.
  • Adaptar una frase, cita o pieza de podcast a formato visual.
  • Convertir un texto largo en 4-7 slides estructurados.

No-negociables

  1. Voz pasada por voz-gnb antes de entrar al render. El texto en slide es copy, aplica MX y ban list.
  2. Watermark gnb.mx siempre presente. Color #b86f4a, peso 600.
  3. Sin emojis en los slides (override sobre default global, aquí es estricto por estética).
  4. Foto circular siempre con tamaño fijo en píxeles. Nunca clamp() ni %.
  5. Sin sliders, sin flechas de navegación (solo dots), sin @handle.
  6. Tipografía: Georgia / DejaVu Serif. Paleta fija (ver abajo).

Inputs requeridos

  • Tipo de slide: tweet-pic | quote | podcast | carousel. Si el usuario no dice, preguntar.
  • Texto principal. Si es carousel, pedir hook (≤12 palabras) + 3-6 slides + CTA final.
  • Para quote: autor.
  • Para podcast: nombre del podcast.
  • CTA + link si es carousel (siempre preguntar, default vacío no aplica).

Proceso

1. Setup

  • Cargar VOICE GATE de voz-gnb.
  • Identificar tipo. Preguntar si falta.
  • Para carousel: generar JSON de slides (hook + body + CTA).

2. Aplicar voz

  • Pasar todo el texto por VOICE GATE de voz-gnb. Argentinismos = bloqueo.
  • Hook ≤12 palabras. Body cada uno: 1-3 oraciones máx.

3. Render

Ejecutar generate_slides.py desde la carpeta del skill:

python3 skills/carrusel-gnb/generate_slides.py \
  --type {tweet-pic|quote|podcast|carousel} \
  --text "..." \
  --author "..."           # solo quote
  --podcast-name "..."     # solo podcast
  --slides '[{...},...]'   # solo carousel
  --photo public/gabriel.jpg \
  --name "Gabriel Neuman" \
  --slug mi-post \
  --out content/social/[carruseles/]

Salida: <slug>_1080x1080.png, <slug>_1920x1080.png, <slug>_1080x1920.png (3 por slide).

4. Guardar en destino correcto

  • tweet-pic, quote, podcastcontent/social/
  • carouselcontent/social/carruseles/

(Tabla canónica de destinos en CLAUDE.md.)

Esquema --slides para carousel

[
  {"hook": "3 errores al lanzar tu producto",
   "body": "Lecciones tras 5 años construyendo."},
  {"title": "1. No validar antes",
   "body": "Construir sin hablar con usuarios no es opción."},
  {"title": "2. Pricing al final",
   "body": "El precio es parte del producto. Defínelo el día 1."},
  {"title": "3. Esperar el momento",
   "body": "El mejor momento fue ayer.",
   "cta": "Agenda una llamada",
   "cta_link": "https://gnb.mx/cowork"}
]

Reglas:

  • Slide 1: hook ≤12 palabras.
  • Último slide: cta + cta_link (preguntar al usuario).
  • Fondo: impares claro, pares oscuro (automático).

Modo HTML (alternativo)

Solo si el usuario quiere iterar visualmente antes de exportar. Genera HTML con selector de formato + html2canvas (PNG) + jsPDF (PDF).

Detalles técnicos largos (CSS clamp, aspect-ratio, descargas, ffmpeg para audiogramas) en references/html-mode.md.

Banned patterns

Heredados de voz-gnb + específicos del skill:

  • Emojis en slides (override estricto).
  • Hooks con preguntas-cebo ("¿te ha pasado?", "¿sabías que…?").
  • Más de 7 slides en un carousel.
  • Body de más de 3 oraciones por slide.
  • @handle, hashtags, frameworks CSS externos.

Output contract

3 PNGs por slide en content/social/[carruseles/]:
  <slug>_1080x1080.png   (square)
  <slug>_1920x1080.png   (landscape)
  <slug>_1080x1920.png   (vertical)

Para carousel: <slug>_sNN_<tamaño>.png por cada slide.

Quality gate

  • VOICE GATE de voz-gnb corrido y pasado sobre todos los textos del slide.
  • Watermark gnb.mx visible en cada slide.
  • Foto circular sin deformación (verificar en formato landscape).
  • Hook ≤12 palabras.
  • CTA con link real (no placeholder) si es carousel.
  • Los 3 formatos generados sin truncamiento de texto.

Paleta y tipografía

Georgia / DejaVu Serif
--beige: #f5f3f0
--dark:  #2a2a2a
--accent:#b86f4a

Atajos

Frase Comando
"tweet pic con X" --type tweet-pic --text "X"
"cita de Y" --type quote --text "..." --author "Y"
"slide del podcast" --type podcast --text "..." --podcast-name "..."
"carrusel sobre X" generar JSON 4-7 slides + --type carousel

Errores conocidos

  • Texto se trunca en landscape: reducir hook a ≤8 palabras o partir en 2 slides.
  • Foto se deforma: verificar que circle_avatar() está activo en el script.
  • PNG sale sin watermark: verificar --name y que el script no esté en modo debug.

Related skills

  • voz-gnb — pasa por aquí ANTES de renderizar.
  • observatorio-creadores — fuente común de hooks virales para inspirar carousels.
  • newsletter-gnb — los carousels suelen reutilizar piezas del newsletter.

Skills relacionados

¿Quieres construir uno así?

Llevo casi un año construyendo skills para operar GNB Labs. Si quieres convertir uno de tus procesos repetitivos en un skill que opere por ti, agendemos.