Os clipes automáticos agora são vídeo curto de verdade
Toda partida concluída já virava um clipe vertical. Só que todos pareciam iguais. Agora cada um abre com um gancho, destaca o dinheiro e fecha com um cartão.

Em palavras simples
O opolyx transforma partidas concluídas em clipes verticais e os publica sozinho. Essa parte já funciona há algum tempo. O problema é que assistir a três deles parecia assistir a um só.
- cerca de 40% do quadro era fundo vazio em volta de um tabuleiro centralizado;
- começavam no meio da partida, num lance qualquer — que também é a miniatura;
- o desfecho era ilegível: um aluguel de 12.000 era uma linha cinza num feed pequeno;
- todo evento tinha o mesmo tempo de tela, então a preparação durava tanto quanto o momento;
- eram mudos, não tinham final, e a legenda e as hashtags nunca mudavam.
Agora cada clipe é dirigido em vez de despejado: abre com um gancho que anuncia o que você vai ver, o tabuleiro preenche o quadro, o dinheiro e os grandes lances são destacados no instante em que acontecem, e ele fecha com um cartão dizendo onde jogar. O ritmo passa por cima da contabilidade e desacelera no momento que importa — inclusive com uma breve pausa antes de um desfecho que você já adivinhou.
Legendas, títulos e hashtags agora vêm de repertórios em vez de uma única linha, e quando uma partida rende vários clipes eles são escolhidos para tratar de coisas diferentes, não três ângulos da mesma falência.
Para os mais técnicos
O renderizador é um worker num VPS pequeno que carrega o site no ar em Chromium sem interface e grava a rota de replay. Essa é a alavanca: toda a aparência de um clipe é código web, então ela viaja num deploy comum e não exige nada do worker.
A peça central é recuperar o momento âncora. A rota de replay só recebe um intervalo, não "o momento" — então a página roda de novo a pontuação de destaques do próprio motor sobre todo o log de eventos e fica com o ponto de maior pontuação dentro daquela janela. Isso recupera comprovadamente o momento que o worker escolheu, e foi o que permitiu lançar todo o visual sem tocar nele.
// lib/clip/pacing.ts — screen time is a function of what the event is
const BOOKKEEPING = 110; // turn_ended, dice_rolled: skim
const NORMAL = 320;
const ANCHOR_MIN = 1400; // the moment the clip exists for
const PREDICT_FREEZE = 600; // "what happens next?" before a guessable payoff
export function paceFor(event: DomainEvent, isAnchor: boolean): number {
if (isAnchor) return Math.max(ANCHOR_MIN, NORMAL);
return isBookkeeping(event) ? BOOKKEEPING : NORMAL;
}| Antes | Agora | |
|---|---|---|
| Estrutura | um replay contínuo | gancho, jogo, cartão final |
| Ritmo | 700 ms × 65 eventos | 110–1400 ms conforme o peso do evento |
| Duração | ~45 s, sempre | 14–27 s, ajustada |
| Texto da publicação | uma legenda, quatro hashtags fixas | repertórios com semente por clipe |
| Áudio | desligado no código | sons do jogo, trilha opcional |
A seleção também mudou: quando uma partida oferece vários momentos candidatos, o seletor fica com o melhor de cada tipo distinto, de modo que um único jogo deixa de produzir três clipes quase idênticos da mesma falência.
