📺 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.

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.


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:
- 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.
- 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.
- Subagentes Sonnet para auditorias, pesquisa e tarefas de texto (inclusive o rascunho deste artigo).
- 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
| Papel | Modelo |
|---|---|
| Coordenador (chat principal) | Claude Opus 5.5, no Claude Code |
| Auditorias, pesquisa, texto, comandos | Claude 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 acabava | Antigravity (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
- Peço algo no chat ("deixa a barra de progresso sempre visível").
- Claude escreve o prompt e lança um Codex numa branch própria.
- O Codex implementa, escreve teste e entrega relatório.
- Claude junta numa branch de publicação, confere migrations repetidas, roda
tsce os testes. - 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:
- 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.
- 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.
- 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
- Grade servida pela Cloudflare (cache de 5 min) e cópia de emergência se a origem cair.
- Grade espelhada no Cloudflare R2: o navegador lê de lá primeiro; a VPS é só reserva. O plano gratuito cobre.
- Presença em lotes: os "estou aqui" viram uma escrita no banco a cada ~30 s, em vez de uma por pessoa.
- 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.
- "O que passa agora" sem cache e leve.

Além do Ao Vivo: o modo Cinema…

…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
| Pessoas | p95 | Erro |
|---|---|---|
| 500 | 0,4 s | 0,06% |
| 1000 | 1,3 s | 1,5% |
| 1500 | 2,2 s | 5% |
| 2000 | 10 s | 17% |
Depois: só o Ao Vivo, via Cloudflare, ritmo real
| Pessoas | "Agora" p95 | Página p95 | Erros |
|---|---|---|---|
| 500 | 0,2–0,6 s | 0,5–1,2 s | 0 |
| 1000 | ~0,2 s | 0,5–0,8 s | 0 |
| 2000 | ~0,2 s | 0,5–0,8 s | 0 |
| 3000 | 0,15–0,23 s | 0,5–0,77 s | 0 |
Rodada de limite, 20 máquinas
| Pessoas | Resultado |
|---|---|
| 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á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
ccopara outros harness e virar o novo crom-agente.
O que eu faria diferente
- Pedir menos coisas ao mesmo tempo.
- Ter backup e handoff desde o primeiro dia.
- 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 📺