AI Trailer Studio
Un prompt y una marca entran; sale un tráiler.
- TypeScript
- React
- Vite
- Express
- BullMQ
- PostgreSQL
- Redis
- Docker
El problema
Generar un tráiler no es una petición: son varios trabajos de minutos, con proveedores externos que fallan, cuestan dinero por intento y se caen a mitad. Tratarlo como un formulario que espera una respuesta garantiza que el usuario mire una pantalla congelada y que un error tardío borre lo que ya se pagó.
La solución
El estado de cada escena es el producto, no un detalle de implementación. Cada paso es un trabajo en cola con reintentos y costo medido, y la interfaz se construye contra los estados reales —incluido el fallido— en vez de contra el camino feliz. Los proveedores de vídeo, texto y voz viven detrás de interfaces estables para poder cambiarlos sin tocar la aplicación.
Arquitectura
- 01
Monorepo con una API y sus workers en la misma imagen y dos puntos de entrada: el mismo código de dominio corre atendiendo peticiones o procesando la cola.
- 02
Los esquemas de validación son la capa de contrato: los tipos se infieren de ellos, así que interfaz y servidor no pueden desviarse en silencio.
- 03
Los paquetes internos exportan TypeScript fuente en vez de código compilado. Elimina el paso de build entre paquetes y da recarga en caliente a través de todo el repositorio; solo el servidor compila, al final.
- 04
Una misma migración corre en Postgres pelado y en Supabase, gracias a un sustituto de la función de identidad que se crea solo si no existe.
- 05
El seed deja un proyecto a medio renderizar a propósito: escenas en cuatro estados distintos y un render fallido.
Stack
- TypeScript
- React
- Vite
- Express
- BullMQ
- PostgreSQL
- Redis
- Docker
Retos técnicos
Probar las migraciones sin levantar Docker
Un esquema que nadie prueba es un esquema que se rompe en producción, pero exigir Docker para correr los tests significa que nadie los corre. Las migraciones se ejecutan contra un Postgres compilado a WebAssembly, dentro del mismo proceso de test: cada corrida arranca con una base vacía, en segundos y sin contenedores.
Fronteras que se revisan solas
En un monorepo, la regla de «la interfaz no importa cosas del servidor» dura hasta que alguien tiene prisa. Acá la frontera es una regla de lint que ve el repositorio completo y falla el build, no una convención escrita en un documento que nadie relee.
Resultados
- Estado
- En construcción — base de datos y esqueleto completos
- Forma
- Monorepo: aplicación web, API, workers y paquetes compartidos