recipes
Una receta es un vídeo de lanzamiento publicado, estudiado y escrito para que un agente pueda reconstruir su artesanía para otro producto.
Vive en <studio>/src/recipes/<id>/:
| Archivo | ¿Siempre? | Qué te da |
|---|---|---|
recipe.md | sí | cuándo usarlo, la hoja de ritmos (tiempos, fotogramas, imagen, cámara, movimiento, transición, sonido), técnicas enlazadas a la artesanía, qué adaptar, errores comunes, componentes faltantes |
recipe.json | sí | los mismos datos (esquema schemas/recipe.schema.json): structure[], techniques, audio, inputs, components, source |
Recipe.tsx + index.tsx | solo si status: "built" | código listo: un componente parametrizado por brand + content, registrado con una marca demo |
La mayoría de las recetas son solo texto (status: "studied"), y eso es suficiente para construir: escribes las escenas a partir de
la hoja de ritmos con los preajustes y componentes del estudio. Una receta nunca contiene el vídeo original, sus fotogramas ni su texto; el
enlace de origen es cómo el usuario ve la referencia.
Ejecuta comandos desde launch-video/ (usuario) o studio/ (repositorio launchfilm). recipes/ y schemas/ están en la raíz del
entorno (launch-video/ en un proyecto de usuario, la raíz del repositorio en launchfilm).
1. Saber lo que necesitas (de BRIEF.md / STORYBOARD.md)
Escribe antes de buscar: preajuste(s) (aspecto), duración objetivo, modo (vídeo de producto / vídeo de lanzamiento / híbrido), tema
(oscuro/claro de brand.json), VO sí/no, los ritmos que necesitas cubrir (hook, feature, logo…), las entradas que el usuario
tiene realmente (logotipo, capturas de pantalla, una grabación de pantalla, una IU reconstruible, estadísticas, una URL).
2. Buscar
Ojea recipes/CATALOG.md (una línea por receta, agrupadas por familia: formato, técnicas principales, entradas, fuente, texto/código),
o busca:
npx launchfilm ref search "statement vertical dark" # texto libre sobre título, resumen, etiquetas, técnicas
npx launchfilm ref search "launch aspect:9:16 max:30 theme:dark" # filtros: family: aspect: tech: theme: max: min: status:
O filtra recipes/index.json directamente (campos: references/index-format.md):
node -e '
const idx=JSON.parse(require("fs").readFileSync("recipes/index.json","utf8")).recipes;
const want={aspect:"9:16",dur:30,techniques:["statement-sequence","end-card"],theme:"dark"};
for(const r of idx){const t=r.techniques.filter(x=>want.techniques.includes(x)).length;
if(r.format.aspect===want.aspect||t>0) console.log(r.id,r.format.aspect,r.format.duration_s+"s",r.theme,r.vo?"vo":"-",t,r.code?"code":"text");}'
¿No hay índice? Busca globalmente src/recipes/*/recipe.json y léelos.
3. Puntuar y elegir 1–3
| Criterio | Puntos |
|---|---|
format.aspect coincide con el aspecto del preajuste principal | +3 (recomponer es posible pero cuesta trabajo) |
format.duration_s dentro del ±30 % del objetivo (o la receta cubre el ritmo que necesitas) | +2 |
| cada técnica que solapa las necesidades del guion gráfico | +1 (máximo +4) |
cada inputs que necesita es algo que el usuario tiene | +2; cualquier entrada faltante que no pueda crearse |
theme coincide con brand.json theme | +1 |
vo coincide con el plan | +1 |
code: true (Recipe.tsx lista) cuando el usuario tiene prisa | +1; status: "reviewed" |
render_cost pesado mientras el usuario está en un portátil o tiene prisa | −1 |
Texto vs código es un bonus de velocidad, no un filtro de calidad: una receta de texto que encaja con el resumen supera a una de código que no encaja. Toma la mejor para un vídeo completo, o hasta 3 para diferentes ritmos (gancho de A, características de B, tarjeta final de C).
4. Mostrar las selecciones
Para cada selección, muestra al usuario:
- título (
id), ytextocode; - una línea sobre por qué encaja con su resumen (aspecto, duración, el ritmo que cubre, las entradas que tiene);
- la hoja de ritmos en 3–6 filas cortas (
0–3.1 s hook: nombre se desenfoca palabra por palabra…), resumida desde recipe.md; - el enlace de origen (
source.url) para que pueda ver el original. No hay previsualizaciones alojadas.
En una sesión con atención, deja que elija. Si dijo "decide tú", toma la mejor puntuación y menciónalo en una línea.
5. Leer la receta
Lee la recipe.md elegida por completo: la hoja de ritmos, movimiento en fotogramas y muelles nombrados, transiciones, sonido en cada
evento, "Qué adaptar", "Errores comunes", "Componentes faltantes". Lee recipe.json structure[], audio, inputs,
components. Estos números son la artesanía que estás reutilizando; la imagen y el texto serán del usuario.
6. Generar la estructura
npx launchfilm new <slug> --recipe <id> --preset x-16x9 [--title "Product"] [--dry-run]
- Receta con código:
films/<slug>/Film.tsxobtiene una escenarecipeque renderiza el componente de la receta con sus valores predeterminados; cambias sus propscontent(recipe.jsonparams) y pasas la marca. - Receta de texto:
film.jsonobtiene un plano por fila de la hoja de ritmos (los tiempos de la receta, sus transiciones y SFX), yFilm.tsxobtiene unTodoScenepor plano con la imagen, cámara, movimiento y sonido de la fila como comentarios. El CLI imprime la lista de TODOs. Un TodoScene renderiza un marcador de posición etiquetado, ynpx launchfilm qafalla (B1) mientras quede uno. - Ambos copian
recipe.mdafilms/<slug>/RECIPE.mdy prellenanSTORYBOARD.mdcon las filas de la receta. - Combinar recetas: genera la estructura desde la que tiene más tiempo de ejecución, luego añade las filas de las otras recetas como planos
(su componente
Recipecomo escena cuando tienen código, escenas TODO en caso contrario).
7. Construir (detalles: references/remix.md)
- Reajusta primero el esqueleto a la duración y cuadrícula rítmica del usuario (remix.md §3): mantén el orden y las proporciones de los ritmos, ajusta
cada límite a un tiempo fuerte o una frase de VO. Actualiza los planos de
film.jsony las filas de STORYBOARD; el usuario aprueba el guion gráfico (puerta 3) antes de construir las escenas. - Marca: brand.json en cada escena a través de
useBrand()(recetas de código: la propbrand). Nunca edites la carpeta de la receta. - Contenido: el nombre del producto del usuario, líneas, estadísticas e IU. Nunca el texto del vídeo original ni el de la marca demo.
- Escenas de recetas de texto: reemplaza cada
TodoScenecon una escena construida desdesrc/presetsysrc/components(leeAPI.mdprimero; la skillscene-buildes dueña de las reglas). Usa los componentes que lista recipe.json; mantén exactamente los muelles nombrados, conteos de fotogramas, escalonamientos e IDs de transición de la fila; las duraciones de movimiento no escalan con la longitud del vídeo. Un componente que la receta lista bajo "Componentes faltantes" se construye enfilms/<slug>/scenes/desde su especificación. - Sonido: cada evento en
audio.sfxy cadasfxde fila mantiene su sonido en el nuevo fotograma (regla de pegamento, craft/02). - Fotogramas fijos en cada plano antes de cualquier render (paso 4 de scene-build), luego
film-qa.
Reglas
- Las recetas son puntos de partida, no el resultado: el vídeo lleva la historia del usuario (STORYBOARD aprobado primero).
- Nada del original va al vídeo: ni texto original, ni marca original, ni metraje original. El enlace de origen es para que el usuario lo vea, y permanece en
recipe.jsony tu mensaje, nunca en el vídeo. - Componente faltante → constrúyelo dentro de
films/<slug>/scenes/, no en la carpeta de la receta ni en los preajustes compartidos. - Registra en STORYBOARD.md qué receta(s), qué filas, el factor de escala y los parámetros, para que una repetición sea reproducible.