¿Qué hace Stickman Story Reels?
Convierte una premisa en un reel vertical terminado de 60–90 segundos: un guion con gancho optimizado para retención, viñetas de figuras de palitos dibujadas en código, locución con subtítulos sincronizados, diseño de sonido y una votación de dos opciones que hace que la gente comente y vuelva para la Parte 2. Construido a partir del flujo de trabajo de las historias interactivas PlotVote (@plotvote).
El pipeline es determinista: escribes episode.json (guion, temporización, movimiento) y scenes.js (dibujos), y scripts/reel.py hace el resto (voz → sonido → montaje → verificación → renderizado). Sin modelos de imagen, sin metraje de archivo, sin herramientas de pago excepto la voz.
Configuración (una vez por máquina)
Verifica python3 --version (3.9+), ffmpeg -version y node --version (18+). El primer renderizado descarga HyperFrames y un Chrome sin cabeza a través de npx; es normal y tarda un minuto. Para la voz, el usuario coloca ELEVENLABS_API_KEY=... en un archivo .env dentro de su carpeta de proyecto (o lo exporta). Nunca imprimas la clave. Sin clave, todo funciona igual en modo --draft (silencioso, temporizado a velocidad real).
Define esta función de shell una vez por sesión de terminal (una función, no una variable de cadena, para que funcione tanto en zsh como en bash). Los comandos siguientes la usan:
reel() { python3 "<carpeta de esta skill>/scripts/reel.py" "$@"; }
Flujo de trabajo
1. Entiende la solicitud
- "Haz esta historia" con una premisa clara → escribe un guion sólido y constrúyela.
- "Dame opciones" o "ideas de guiones" → presenta 3 opciones completas (ver el manual §10), deja que elijan, luego construye.
- "Siguiente parte" o "X ganó la votación" → continúa la serie: abre con la consecuencia, resuelve la última pista, da una respuesta real, escala la tensión, nueva votación (manual §9). Lee la biblia de la serie si existe.
- Solo guion (o sin shell disponible) → entrega la tabla del guion, más
episode.jsonyscenes.jspor si quieren renderizarlo ellos mismos.
2. Escribe el guion
Lee references/viral-script-playbook.md primero, cada vez. Contiene las reglas que deciden si la gente se queda más allá de los 3 segundos. Al inventar una premisa, una serie o una temporada, lee también references/story-engines.md.
Escribe el guion como una tabla (# · voz · texto · en pantalla), apuntando a unas 210–230 palabras (unos 85 segundos al ritmo habitual). Ejecuta la lista de verificación previa a la voz del manual. Los errores más comunes: el fotograma 1 debe moverse; el dónde, cuándo y quién en los primeros 5 segundos; cada decisión supera la prueba del niño de 12 años; los personajes dicen sus propias revelaciones en primera persona; la votación son dos acciones físicas de una palabra con un costo en ambos lados; una pista susurrada después de la votación apunta a algo plantado antes.
Si el usuario pidió opciones, o si puede querer aprobar antes de gastar créditos, muestra la tabla del guion y espera. Si no, continúa.
3. Crea el andamio del reel
reel new reels/<slug>-parte1 --title "<Título> — Parte 1"
Esto crea episode.json y scenes.js a partir de un iniciador pequeño funcional. Reemplázalos con tu historia.
4. Dibuja las viñetas (scenes.js)
Lee references/drawing-kit.md, y abre examples/sundown-part1/scenes.js como biblioteca de patrones (una criatura asomándose, un mapa en zoom, un muro de reglas revelado línea por línea, criaturas en stop-motion, una ventana casi impacto, una radio parlante, una linterna entre árboles, la división de la elección, una portada).
Una función por viñeta desde tu tabla de guion. Cada una devuelve un SVG de 1080×1920 construido con ayudas del kit (defs(), sky(), forest(), cabin(), room(), water(), stick(), kid(), creature(), phone(), radio(), chip(), ring(), splitChoice()…). Un escenario que el kit no tenga (un parque acuático, un tren, un desierto) es normal: dibújalo con rectángulos, trazados y las ayudas, siguiendo la sección "Construir un nuevo escenario" del kit de dibujo. Asigna un id a todo lo que deba moverse o aparecer en una palabra. Mantén las caras fuera de la banda de subtítulos (y 1180–1380) y de los 140 px de la derecha. Añade un mode para la portada (sujeto colocado debajo del título) y para los recuadros de tarjeta de votación.
5. Conecta el episodio (episode.json)
Lee references/episode-format.md. Para cada escena: draw, líneas say, kenburns y entradas animate que aterricen en palabras habladas ("at": "faster"). Luego: voces (con fx y etiquetas tag de subtítulos para otros personajes), píldoras HUD con un reloj, sfx colocados manualmente en palabras, pistas bed, la escena de votación (dos opciones, recuadros, la línea de pista), cover y post (subtítulo con {vote_line}, comentario fijado, posts_at). Para voces, sonidos y subtítulos, consulta references/sound-voice-posting.md.
6. Pase de borrador (gratuito)
reel voice reels/<slug> --draft # silencioso, temporizado a velocidad real
reel sound reels/<slug>
reel build reels/<slug>
reel check reels/<slug>
reel snap reels/<slug> --at scenes # dos imágenes fijas por viñeta (o --at 0.5,12,30.5 segundos)
Mira cada imagen fija en reels/<slug>/snaps/. Corrige lo que las reglas de legibilidad del kit de dibujo advierten: cosas demasiado oscuras para leer, caras debajo de subtítulos, sujetos demasiado pequeños, una revelación mal temporizada. check debe decir "Verificación superada" (all se detiene antes de renderizar si no es así). Estas advertencias son esperadas y están bien: "estructura anidada", "pista demasiado densa", "archivo de composición demasiado grande" y recuadros "desbordando" su recorte.
7. Voz y renderizado
reel all reels/<slug> # voz (ElevenLabs) → sonido → montaje → verificación → renderizado
reel frames reels/<slug> --every 2 # hoja de contacto de todo el reel, para revisión
Verifica la duración impresa (60–90 s; recorta la introducción si excede). Mira renders/review.png: el sujeto es legible, los subtítulos son claros, lo nombrado se mueve en su palabra, y aparecen la tarjeta de votación y el recuadro de pista. Escucha la línea 1; si una palabra puede malinterpretarse, cámbiala y vuelve a poner la voz (solo las líneas cambiadas consumen créditos).
8. Entrega
Entrega al usuario renders/<slug>.mp4, renders/cover.png y POST.md (subtítulo, comentario fijado, texto alternativo, hora de cierre de votación). Para una serie, escribe o actualiza bible.md junto a la carpeta del reel: reparto, reglas, canon, la pista, y una línea por opción de votación de cómo comienza la siguiente parte (story-engines §4).
Comandos
| Comando | Qué hace |
|---|---|
reel new <dir> --title "…" | Crea el andamio de una carpeta de reel |
reel voice <dir> [--draft] | Voz + temporización de palabras → timing.json, assets/audio/narration.wav |
reel sound <dir> | Sintetiza 19 efectos de sonido + la banda ambiental |
reel build <dir> | Compila index.html, cover/, POST.md |
reel check <dir> | HyperFrames lint, maquetación y puerta de contraste (sale con error si falla) |
reel snap <dir> --at scenes | PNGs fijos de la composición, dos por viñeta (o --at 1,5.5,9 segundos) |
reel render <dir> [--draft] | MP4 a −14 LUFS + cover.png + hoja de contacto |
reel all <dir> [--draft] | voz → sonido → montaje → verificación → renderizado (se detiene si la verificación falla) |
reel frames <dir> --every 2 | Hoja de revisión de todo el MP4 renderizado |
Solución de problemas
"palabra" no se dice ahí: la referencia temporal usa la ortografía del subtítulo y se busca solo dentro de esa escena; el error imprime lo que dice la escena. Usapalabra#1para la segunda aparición,sN:palabrapara otra escena,start+0.2para un desplazamiento, o12.5spara un tiempo absoluto.- Voz no encontrada: usa un nombre predefinido (Liam, Brian, George, Daniel, Callum, Bill, Roger, Chris, Eric, Will, Harry, Charlie, River, Adam, Sarah, Matilda, Jessica, Alice, Lily, Laura, Bella) o el id de la voz.
- Créditos agotados: las líneas ya vocalizadas están en caché; recarga y vuelve a ejecutar
voice. - Una viñeta en blanco o negra: un error de JavaScript en ese conjunto.
checklo muestra; prueba la función volviendo a montar después de la corrección. - Más de 90 s: recorta líneas de presentación y adjetivos; conserva el gancho, el giro, la votación y la pista.
- Errores de
npxonode: instala Node 18+; en la primera ejecución deja quenpxdescargue HyperFrames y Chrome.
Qué incluye esta skill
scripts/reel.py: el CLI.scripts/synth.py: 19 efectos de sonido y la banda (zumbido, viento, pulso, murmullo, agua), todo sintetizado.assets/kit.js: el kit de dibujo.assets/runtime.js,assets/base.css: subtítulos, HUD y la tarjeta de votación.references/:viral-script-playbook.md(siempre),story-engines.md(premisas, series, biblia),episode-format.md(la especificación),drawing-kit.md(dibujo),sound-voice-posting.md(voces, sonido, subtítulos, publicación, seguridad).examples/sundown-part1/: una Parte 1 completa de 89 segundos (episode.json+scenes.js).examples/starter/: el iniciador de 4 viñetas usado pornew.examples/script-pitches.md: cinco guiones completos más de Parte 1 (LA RUEDA, ÚLTIMO COCHE, MAREA BAJA, 3:33, PRIMERA FILA).