4

📺 Crom TV: fiz uma TV de internet em 6 dias com uma equipe de IAs — 865 commits, ~880 agentes, 888 testes e um site que aguenta 15 mil pessoas ao mesmo tempo - 1.5 milhões de vídeos

Você abre o YouTube e passa 10 minutos escolhendo o que assistir. Às vezes desiste. A TV antiga resolvia isso de um jeito simples: você ligava e já estava passando alguma coisa.

A Crom TV é isso, só que na internet — e com coisas que a TV nunca teve:

  • 📡 76 canais no ar 24 horas, montados com vídeos do YouTube: notícias, política, economia, tecnologia, IA, crime, filmes, desenhos, música, K-pop, podcasts, documentários e mais.
  • 🔄 Canais que se atualizam sozinhos. Os canais de notícias puxam os vídeos novos das fontes durante o dia: saiu notícia no YouTube, ela entra na grade sem ninguém mexer.
  • ✂️ Cortes automáticos. O sistema pega só o trecho que importa de um vídeo longo e coloca na programação — o Crom Curto vive disso: pílulas de menos de um minuto.
  • ⏱️ Todo mundo vê o mesmo momento. Se o canal está no minuto 12, você entra no minuto 12. Troca de canal como no controle remoto, com guia de programação e zapping (tecla Z).
  • 💬 Chat ao vivo por canal, comunidades e votos.
  • 🎬 Outros jeitos de assistir: Cinema (filmes inteiros), Mural (explorar vídeos), Fluxo (vídeos curtos verticais).
  • 🧑‍🎨 Studio para criadores: qualquer um conecta o próprio canal do YouTube, monta a grade e publica.
  • 🧩 API para desenvolvedores, anúncios só entre vídeos (nunca no meio), doação por Pix e app Android a caminho.

Tela do Ao Vivo da Crom TV

O Ao Vivo: lista de canais à esquerda, o que está passando e a barra de progresso sempre visível embaixo.

E o mais curioso não é a TV. É como ela foi feita: uma pessoa dando ordens em português e uma equipe de IAs escrevendo, testando e publicando o código em paralelo, inclusive de madrugada.

Do primeiro commit, num domingo às 11h49, até aguentar 15 mil pessoas simultâneas sem erro, passaram seis dias.


🧭 A história, dia a dia

27/09 — arrumar a casa. Antes de escrever uma linha da TV, refiz a infraestrutura: backup criptografado de tudo, servidor novo limpo, domínio crom.run apontado para ele e tudo pensado para rodar em Docker.

28/09 — a ideia vira site. O pedido inicial foi curto: um sistema simples, sem login, com vários modos de layout. No mesmo dia nasceram a TV em tela cheia, a página inicial, os anúncios entre vídeos, o admin, a contagem real de visualizações (sem número inventado) e os backups diários.

29/09 — regras e curadoria. Módulos que ligam e desligam pelo admin, votos, analytics e as primeiras listas de canais. Nasceu o docs/CHECKLIST.md, que virou a memória do projeto — porque IA esquece, e eu não queria refazer o que já estava 85% pronto.

30/09 — o dia dos agentes. 256 commits num dia só. Comecei a deixar agentes trabalhando enquanto eu dormia. Entraram o Studio (para montar canais), dezenas de canais temáticos, importação de playlists sem gastar cota da API e filtros por canal (para o canal de South Park não virar gameplay).

01/10 — zapping, carga e segurança. Modo offline, zapping, SEO, logo nova, estudo dos termos do YouTube (decisão: só o player oficial, nada de baixar vídeo), Cloudflare na frente e os primeiros testes de estresse.

02/10 — tudo ao mesmo tempo. Chat ao vivo, app Android em preparação, testes de carga no GitHub Actions e doações.

03/10 — da tela preta aos 15 mil. O dia que mais ensinou. Está tudo nas seções abaixo.

Guia de programação

Crom TV no celular

O guia de programação (com escala de 1 min para canais de cortes) e a versão de celular.


🤖 Como foi feito: uma pessoa + uma equipe de IAs

O projeto tem uma pessoa: eu. Dou as ordens, testo no celular e tomo as decisões de produto e de dinheiro. O resto é uma equipe:

  1. Claude como coordenador. Conversa comigo, anota cada pedido no checklist, escreve o prompt de cada agente, revisa, roda os testes e publica. Regra minha: o chat principal fica sempre livre.
  2. Agentes Codex escrevendo código em paralelo. Cada um numa cópia própria do repositório (git worktree), com um prompt e um relatório no fim. No máximo três ao mesmo tempo — senão o PC trava.
  3. Subagentes Sonnet para auditorias, pesquisa e tarefas de texto (inclusive o rascunho deste artigo).
  4. Painel web + timer. Um painel mostra o que cada agente faz e tem um botão "Verificar"; um timer a cada 3 minutos confere logs, testes e fila.
graph LR
  Eu[Eu: pedidos em pt-BR] --> C[Claude: coordenador]
  C -->|prompt| A1[Codex 1]
  C -->|prompt| A2[Codex 2]
  C -->|prompt| A3[Codex 3]
  C -->|texto, auditoria| S[Sonnet]
  A1 & A2 & A3 -->|branch + relatório| C
  C -->|tsc + 888 testes| P[Publicação]
  P -->|deploy com reversão automática| VPS[(VPS)]
  • 865 commits em 6 dias
  • 684 execuções de agentes Codex
  • 201 subagentes Claude
  • 888 testes automatizados
  • ~100 migrations do banco
  • ~41 mil linhas de TypeScript

Observação honesta: 684 conta arquivos de log; um mesmo agente pode ter sido relançado, e parte deles foi de curadoria de canais, não de código.

Os modelos que usei

PapelModelo
Coordenador (chat principal)Claude Opus 5.5, no Claude Code
Auditorias, pesquisa, texto, comandosClaude Sonnet 5.5 e Claude Haiku 4.5
Código em paralelo (a maior parte)Codex com GPT-5.6 e GPT-6 (OpenAI)
Reserva quando a cota acabavaAntigravity (Google) em outras contas
Tarefas leves (sempre auditadas depois)modelos gratuitos via OpenCode/OpenRouter: LongCat 2.5, MiMo v2.6, Big Pickle, Nemotron 3 e Gemma 4

Regra que funcionou: modelo gratuito pode fazer o trabalho leve, mas um modelo forte sempre revisa antes de ir para o ar.

🧪 O cco: meu mini sistema de agentes

Para rodar tudo isso criei o cco, um mini sistema que usa o Claude Code como harness — o "corpo" do agente (ferramentas, edição de arquivos, terminal, permissões) — mas troca o "cérebro" por outro provedor, como OpenRouter ou OpenCode. Resultado: dá para usar o modo ultracode do Claude Code em modelos gratuitos.

A ideia é que ele vire o upgrade do crom-agente: um orquestrador que não depende de um fornecedor só. Depois do Claude Code, o plano é suportar outros harness, para escolher a melhor combinação de corpo + cérebro por tarefa e por preço.

O fluxo de cada pedido

  1. Peço algo no chat ("deixa a barra de progresso sempre visível").
  2. Claude escreve o prompt e lança um Codex numa branch própria.
  3. O Codex implementa, escreve teste e entrega relatório.
  4. Claude junta numa branch de publicação, confere migrations repetidas, roda tsc e os testes.
  5. Publica com um script que volta atrás sozinho se a checagem de saúde falhar.

Quando a memória curta do Claude enche, ele escreve um handoff no checklist antes de compactar. Por isso a frase mágica: "leia a Atualização 24 e continue".


🧠 O que aprendemos

Muita coisa foi erro bobo, resolvido em minutos. As três lições que valem o artigo:

  1. O relógio é o coração. Uma resposta de cache sem a hora do servidor fez a TV achar que estava ~50 anos atrás — tela preta. Todo dado de hora precisa ser validado.
  2. Teste de carga mente se não imita gente. Robôs chegando no mesmo segundo e consultando 5× mais que uma pessoa fizeram o site parecer travar em 2000. Com ritmo real, aguentou 15 mil.
  3. Modo teste não testa tudo. O Mercado Pago de teste não faz Pix; foi a primeira doação real (R$ 5) que mostrou o último defeito. A saída foi não depender só do aviso: o site confere o pagamento direto.

Também teve uma auditoria de segurança feita por IA (nenhuma falha crítica; as altas e médias corrigidas no mesmo dia, com teste).


🛠️ Para quem quer ir fundo: a arquitetura

A TV é calculada no navegador

Não existe servidor de streaming. Cada canal tem uma hora de início e uma lista de vídeos com duração. A posição de agora é:

posição = ((agora − início) / 1000) mod duração_total

O navegador corrige o relógio com a hora do servidor, descobre qual vídeo e qual segundo estão no ar e manda o player oficial do YouTube começar ali. A cada 1–2 s compara o que deveria tocar com o que toca. Por isso a TV continua trocando de vídeo mesmo se o servidor ficar lento: o navegador já tem a grade.

graph TD
  N[Navegador] -->|1. grade| R2[(Cloudflare R2)]
  N -->|reserva| CF[Cloudflare cache 5 min]
  CF --> VPS[VPS: Node + SQLite]
  N -->|2. que horas são| VPS
  N -->|3. calcula vídeo + segundo| YT[Player oficial do YouTube]
  VPS -->|grade nova: purga + aviso ao vivo| CF

Servidor

Uma VPS modesta: 2 vCPU, 8 GB de RAM, 100 GB de disco, Debian 13. E ela não é só da Crom TV: divide espaço com outros 14 containers — site e wiki da Crom, WordPress, n8n, um serviço de voz e lojas de demonstração. A TV roda em containers: Node 22 + Hono, Zod nas bordas, erros RFC 7807, SSE para o chat, um worker separado para tarefa pesada. Banco SQLite em WAL, migrations numeradas, backup com VACUUM INTO. Front em React 19 + Vite + Tailwind. Código dividido em contextos: catálogo, programação, publicidade, identidade, interação, comunidades.

O que fez o site aguentar 7× mais

  1. Grade servida pela Cloudflare (cache de 5 min) e cópia de emergência se a origem cair.
  2. Grade espelhada no Cloudflare R2: o navegador lê de lá primeiro; a VPS é só reserva. O plano gratuito cobre.
  3. Presença em lotes: os "estou aqui" viram uma escrita no banco a cada ~30 s, em vez de uma por pessoa.
  4. Pulso de 5 minutos em vez de 1. Lotado? O servidor recusa só o que não é essencial e mostra um aviso discreto — quem já está assistindo não cai.
  5. "O que passa agora" sem cache e leve.

Modo Cinema

Além do Ao Vivo: o modo Cinema…

Modo Mural

…e o Mural, para explorar vídeos.


📊 Os números do teste de carga

Rodamos no GitHub Actions com várias máquinas simulando espectadores. p95 = tempo em que 95% foram atendidos.

Antes: direto na VPS, ritmo pesado

Pessoasp95Erro
5000,4 s0,06%
10001,3 s1,5%
15002,2 s5%
200010 s17%

Depois: só o Ao Vivo, via Cloudflare, ritmo real

Pessoas"Agora" p95Página p95Erros
5000,2–0,6 s0,5–1,2 s0
1000~0,2 s0,5–0,8 s0
2000~0,2 s0,5–0,8 s0
30000,15–0,23 s0,5–0,77 s0

Rodada de limite, 20 máquinas

PessoasResultado
5 000✅ sem erro
10 000✅ sem erro
15 000✅ sem erro
20 000❌ timeouts após ~1 min 20 s

Limite real: entre 15 e 20 mil pessoas ao mesmo tempo, numa VPS de 2 vCPU e 8 GB — dividida com outros sistemas.

No começo do dia, ~2000. A última rodada foi cortada porque os minutos do GitHub Actions acabaram — os números do degrau de 20 mil vêm dos registros das máquinas.


🚀 Onde estamos e o que vem

A TV está no ar em tv.crom.run, ainda sem divulgação. Mercado Pago em produção, chat liberado para quem tem conta, proteções da Cloudflare religadas.

Página Sou criador

Páginas para criadores, desenvolvedores, espectadores e agências já estão no ar.

💡 Ideias futuras

  • Repartir parte da receita de assinaturas com os criadores dos vídeos.
  • Canais privados e comunidades pagas.
  • Vídeos próprios e parcerias com criadores.
  • App na Play Store e na TV da sala.
  • Levar o cco para outros harness e virar o novo crom-agente.

O que eu faria diferente

  1. Pedir menos coisas ao mesmo tempo.
  2. Ter backup e handoff desde o primeiro dia.
  3. Medir com teste realista antes de tirar conclusão sobre capacidade.

IA não substitui quem decide. Ela multiplica quem sabe o que quer — e cobra caro de quem pede tudo ao mesmo tempo.

Abre lá, liga e assiste: tv.crom.run 📺

Carregando publicação patrocinada...
4

Bem legal o projeto. Sucesso aí.
O plano gratuito da Cloudflare cobre tudo que tem usado?
Pretente divulgar o cco como open source? Ele cobre todo o SLDC, como uma software-factory?

1

Vlw.
Até agora cobriu os testes, tem um limite de 10 milhoes de acessos mensais, se não me engano.
cco foi só o harness do claude-code rodando outros provedores, estava fazendo ele como estudo para o crom-agente, provavelmente vou integrar a ele. E estudar melhor como constroem o ultracode que aciona um fluxo de agentes em paralelo ou em ordem para implementar também no opencorp(esse ainda nao comecei a falar sobre, refiz umas 3 vezes procurando uma arquitetura que dêm para deixar uma "empresa/projeto" rodando tanto com modelos free pelo opencode(zen, openrouter, free's) ou crom-agente(cco) quanto com outros harness cli's instalados).

Só tive que habilitar o cartão de crédito para o R2 object storage do cloudflare também. Para caso o site caia, ainda entrege pelo menos o frontend + a ultima programação por até 24hrs para novos usuários.