Pitch: Como meu app de notícias lê 181 sites por RSS (e por que o Reddit nunca entrou)
Landing do projeto: camaleao.dev. Tô tocando isso em público, postando avanço, número e tombo no Bluesky, no X, no TikTok e no Instagram. Se quiser acompanhar de perto, é por lá.
No post sobre o Jev, o JhonnyFreire perguntou nos comentários se eu usava RSS pra pegar as notícias. Uso, e respondi que tava pensando em escrever um post só sobre a coleta. Esse é ele. E caiu numa semana boa pra isso: o Reddit acabou de anunciar que vai desligar o RSS dia 13 de novembro, e eu já tinha deixado o Reddit de fora lá em setembro.
Por que RSS
O Camaleão precisa de umas centenas de notícias por dia pra triar, agrupar e transformar em matéria. Dava pra raspar a home de cada site, mas aí cada mudança de layout vira um bug meu, e eu estaria pegando conteúdo de um jeito que o site não ofereceu. O feed é o site dizendo "isso aqui é pra ser lido por programa". É estável, é barato e não precisa de navegador.
O primeiro passo foi um script que bateu em 108 feeds e APIs se identificando como CamaleaoBot e anotou, pra cada um: se responde, quantos itens saíram em 7 dias, se o feed traz o texto completo ou só um resumo, e o que o robots.txt diz. O texto completo decide muita coisa. Quando o feed já traz, eu nem entro no site. Quando vem só título ou resumo, uso o feed pra achar a matéria, busco só aquela página, extraio o texto com readability e guardo por uns 14 dias. Ninguém lê esse texto além do pipeline.
Respeitar o robots.txt custa caro
Eu checo o robots.txt duas vezes: o do feed e o da página da matéria. Se qualquer um disser não, a fonte sai. Robots que não dá pra ler também conta como não.
Isso me custou fonte que eu queria muito. Canaltech, Mobile Time e The Register bloqueiam o feed. O 9to5Mac responde 403 pra robô. A página de matéria da Folha não responde pro meu robô. E tem o caso mais chato: o OpenAI News libera no robots, mas devolve 403 quando eu peço a página da matéria. Dava pra contornar trocando o user agent pelo de um navegador. Não fiz, ficou anotado como limitação.
O Reddit caiu nessa peneira em setembro: o robots bloqueia robô e a API já pedia acordo comercial. Agora quem lê subreddit por app de feed vai sentir a mesma coisa, e o Reddit não ofereceu substituto, só um relay no Discord pra moderador.
Um jornal que só publica release
Com a primeira lista, de 18 fontes, rodei um dia e saíram 12 matérias de 122 grupos. Onze vinham de uma fonte só, e cinco eram do changelog do GitHub. Isso não é jornal, é leitor de release.
O motivo é uma regra que eu não quero tirar: pra virar pauta, a notícia precisa vir de fonte primária (a própria empresa anunciando) ou de duas redações diferentes cobrindo o mesmo fato. A segunda parte quase nunca disparava.
Minha primeira aposta foi aumentar a janela de 24 pra 72 horas, achando que ia dar tempo da segunda redação aparecer. Piorou: grupos com mais de uma redação caíram de 2 pra 1. Com mais item velho na conta, o agrupador abre mais grupos em vez de juntar. O que resolveu foi largura. Com 25 fontes na mesma janela de 24 horas, foram 9.
E "redação diferente" precisa ser diferente de verdade. TechCrunch e Engadget parecem duas fontes, mas são do mesmo dono, o Yahoo. O Meio Bit é do Tecnoblog desde 2018. Pra regra, cada par desses conta como uma redação só, senão um grupo de mídia sozinho fabrica a confirmação.
De 68 pra 181 fontes
Essa semana eu abri o app de 10 pra 20 assuntos (games, cripto, tech no Brasil, carreira, produto e design...) e precisei de fonte pra tudo isso. Testei 166 candidatas com as mesmas regras e entraram 113. A lista foi de 68 pra 181.
Só que, rodando com as fontes novas, Brasil, games e cripto continuavam quase sem pauta. O Tecnoblog trazia 22 matérias num dia e uma passava. Aí eu fui olhar as notas.
A triagem perguntava pro modelo "o quanto isso importa para uma pessoa que trabalha com software?". Matéria de game tirava, em média, entre 0,4 e 1,3, e o corte é 2. Pela pergunta, faz sentido: lançamento de jogo não muda o trabalho de ninguém. Mas eu leio notícia de game toda semana e quase nunca é por causa do trabalho. A pergunta tava medindo a coisa errada.
Troquei por "quanto alguém do mundo do software se importaria com isso, por interesse em tecnologia ou pelo trabalho". Antes de trocar, reperguntei a nota de 382 itens três vezes, sem gravar nada. A pergunta velha reproduziu o que tava gravado em 378 deles, e a nova concordou com ela mesma nos mesmos 378. As pautas do dia foram de 40 pra 52 sem perder nenhuma, e entrou coisa como o incidente da MetaMask e o IPO da OpenAI adiado. A medição toda custou US$ 0,038.
Eu tava errado sobre o português
No post do Jev eu escrevi que a primeira versão ia ler só fonte em inglês e traduzir o state, porque o modelo é mais forte em inglês. Antes de pôr as fontes brasileiras, resolvi medir.
Peguei 40 matérias de 6 redações brasileiras e triei cada uma duas vezes, no original e numa tradução. O assunto bateu nas 40. No agrupamento, marquei à mão 22 pares de matérias sobre o mesmo fato, uma em português e outra em inglês: 16 juntaram com o texto em português, e 16 com a tradução. Os 6 que não juntaram são o mesmo fato contado por outro ângulo, coisa que já acontecia em inglês. O problema é a pergunta de "mesmo evento", não o idioma. Traduzir ia custar uma chamada por item sem ganho nenhum, então fonte brasileira entra direto.
Os tombos
O mais bobo: o coletor datava entrada de feed Atom pelo campo <updated> antes do <published>. O Fly.io refez o site, e 18 posts de 2025 entraram como notícia do dia. Viraram 11 pautas falsas numa rodada que eu joguei fora.
O mais chato de achar: em duas de três rodadas, uma queda de rede bem no começo derrubava dezenas de fontes de uma vez, porque robots.txt que não carrega vale como bloqueado pra rodada inteira. Agora o get() tenta de novo duas vezes, esperando 2 e 5 segundos, só em erro de rede, nunca em resposta HTTP. Se o site disse não, é não.
E o mais recente: o primeiro cron diário com as 181 fontes triou o histórico inteiro dos feeds, gastou o teto de US$ 0,10 do dia só nisso e saiu com zero pautas. Hoje de manhã ele nem rodou. Tô olhando isso enquanto escrevo.
O que ainda me preocupa
Backend e carreira continuam com zero pautas, mesmo com 181 fontes. Nesses assuntos quase nunca aparecem duas redações no mesmo fato, e a regra que me protege de release disfarçado de notícia é a mesma que deixa eles vazios. Ainda não sei se afrouxo a regra só pra esses assuntos ou se continuo procurando fonte.
E feed aberto não é licença de uso comercial. O texto das fontes só é usado internamente e a matéria final é minha, com link pra todas elas, mas ler os termos de uso de cada fonte ainda tá na lista de antes do lançamento. Com 181 fontes, essa lista cresceu bastante.
O que vocês acham?
Se você lê algum site de backend ou de carreira em tecnologia que tem RSS, em português ou inglês, me passa nos comentários que eu testo. E se você já teve que decidir se dava pra usar um feed aberto num produto, quero muito saber como resolveu.