Capivara — o dia em que o painel parou de mentir (e as seções mortas caíram)
🐷 Capivara·

Capivara — o dia em que o painel parou de mentir (e as seções mortas caíram)

📖 4 min de leitura← Voltar para timeline

⚡ O painel estava mentindo

Todo dashboard tem um pecado silencioso: mostrar como verde uma coisa que está morta.

No Capivara, eram dois pontos vermelhos que eu via há dias e empurrava com a barriga — a seção Stripe e a seção Portifolio Staging. Até que no dia 08/08 eu finalmente olhei com atenção:

  • A seção Stripe apontava pra um Supabase decommissionado — DNS morto, 500 em tudo.
  • A seção Portifolio Staging mostrava a URL staging.samuelmedeiros.vercel.app — que não existia mais (o staging foi removido há semanas).

O dashboard estava me mostrando ruído. E pior: cada olhada naquele painel era um pequeno voto de confiança em dados que não refletiam a realidade.

🧠 O problema real: dados mortos viram decisões erradas

Não era só estética. Um dashboard com seções mortas ensina o cérebro a ignorar o painel — e aí, quando algo importante de fato quebrar, você não percebe.

A regra que ficou depois dessa sessão é simples:

Se a fonte não existe mais, a seção não deve existir.

Duas linhas de commit resolveram:

b209043 feat(admin): remove secao Stripe (Supabase decommissionado 500 DNS morto)
a856ff3 feat(dashboard): remove secao Portifolio Staging (staging removido URL morta, dot vermelho)

Remover não é perder informação. É parar de pagar custo de atenção por algo que não entrega valor.

⚡ E o rate limit que bloqueava o IP errado

No mesmo dia, outro sintoma: requests legítimos do dashboard caindo com 429, mesmo com a API key correta.

O rate limit do Capivara usava o IP do request pra montar o bucket. O problema? Em produção atrás do Cloudflare, todos os requests vinham do mesmo IP do Tunnel — ou pior, o bucket era montado de um header que nem sempre existia.

A correção foi documentada e direta:

ae08d24 fix(ratelimit): CF-Connecting-IP p/ bucket real + API key 120/min

Usar o header CF-Connecting-IP — o IP real do cliente, que o Cloudflare injeta de forma confiável — em vez de tentar adivinhar a partir da conexão. E dar à API key um bucket próprio com 120 req/min, separado do rate limit por IP.

🧠 A lição em três pontos

  1. Painel que mente é pior que painel nenhum — seções mortas treinam você a ignorar o dashboard inteiro.
  2. Rate limit é sobre identidade — limitar por IP atrás de proxy é limitar o proxy, não o usuário. Use o header que o proxy garante (CF-Connecting-IP).
  3. Limpeza é feature — remover 2 seções mortas deixou o dashboard mais honesto em 10 minutos do que qualquer feature nova deixaria em uma semana.

🛠️ Detalhes técnicos

Item Antes Depois
Seção Stripe 500 DNS morto (Supabase decommissionado) Removida
Seção Portifolio Staging URL morta Removida
Rate limit por IP Bucket de IP do Tunnel (errado) CF-Connecting-IP (IP real)
Rate limit por API key Mesmo bucket do IP Bucket próprio, 120 req/min

O Capivara segue como o painel central do ecossistema — mas agora, quando ele diz que algo está verde, é porque está.