Cada partida se convierte en un carrete de highlights
Las partidas terminadas se convierten automáticamente en clips verticales de highlights y se publican en YouTube, Instagram y Discord, además de una transmisión en vivo del tablero.

En palabras sencillas
Los momentos más dramáticos de opolyx ahora viajan más allá del juego. Cuando una partida termina, el sistema encuentra sus mejores momentos —una victoria sobre la bocina, una bancarrota, una guerra de subastas, un golpe de alquiler enorme— y los convierte en clips verticales cortos que se publican automáticamente en YouTube, Instagram y Discord.
Los clips están personalizados con la marca y se leen bien en el móvil: el logo de opolyx arriba, el chat dentro del tablero y la clasificación debajo. También hay una transmisión en vivo de partidas de exhibición bot contra bot que corre desde una caja de emisión real.
Para los más técnicos
La base es una ruta de lectura solo para el emisor. La migración 0036 añade profiles.broadcaster y aplica con OR una comprobación is_broadcaster() en las seis políticas SELECT de las tablas del juego, desbloqueando dos rutas protegidas: /spectate (el tablero en vivo) y /replay (un pliegue de reproducción determinista del motor sobre el registro de eventos).
Una función pura del motor puntúa los highlights —victoria, bancarrota, alquiler grande, guerra de subastas, jackpot, cambio de liderato, intercambio, teletransporte— y elige las mejores ventanas que no se solapan. Un worker aparte apps/broadcaster renderiza cada ventana en Chromium headless, la canaliza por ffmpeg a un mp4, la sube al almacenamiento y la publica mediante un proveedor social más Discord. Es idempotente gracias a un marcador de almacenamiento, así que el daemon del juego nunca se toca.
// engine: scoreHighlights() — pure, deterministic
// win / bankruptcy / big-rent / auction-war / jackpot / lead-change / trade / teleport
// broadcaster: window -> headless Chromium /replay -> ffmpeg -> mp4 -> Storage -> publish
// .done marker = idempotent; daemon untouchedEl navegador headless de los clips inicia sesión como el emisor mediante el códec de cookies de Supabase para que se renderice el /replay protegido. Un puente de autenticación hace lo mismo con el navegador de OBS en la caja de emisión, dejándole renderizar directamente el tablero en vivo /spectate. Las partidas de exhibición se marcan de antemano como listas para quedar excluidas de la tubería de Shorts.
