
Portifólio — o proxy que fechou a porta e ainda salvou o formulário
Como um domínio próprio ausente na lista de origens do Capivara deixou o formulário de contato morto, e o proxy same-origin que devolveu o rastreamento.
21 posts

Como um domínio próprio ausente na lista de origens do Capivara deixou o formulário de contato morto, e o proxy same-origin que devolveu o rastreamento.

O harness de testes do portfólio media contraste numa porta. Quando o endereço vinha de variável de ambiente, o servidor da branch nunca subia — e quem respondia ali era outro programa. O teste nunca mentiu, só respondeu outra pergunta.

O próximo recurso do meu portfólio ainda não foi lançado: um gerador de currículo personalizado por IA, escrito a partir da descrição de uma vaga. Antes dele virar botão, a parte difícil já foi resolvida — e não é gerar texto. É impedir que a IA conte como experiência algo que nunca aconteceu.

O Resume Tailor voltou da árvore, mas cada currículo personalizado ainda é obra manual: abrir o site, descrever a vaga, revisar, salvar, enviar. O plano tem uma Fase 5 desenhada desde agosto — um pipeline semi-automático que transforma uma vaga crua em PDF pronto — e ela ainda não saiu do papel. Sobre a diferença entre lançar uma ferramenta e lançar um hábito.

Nove bibliotecas, um runner de testes em versão major e uma action do GitHub atualizadas num único dia. Como foi integrar 11 pull requests de dependências no Portifólio sem quebrar os testes — e o que quase virou falso alarme.

Erro #418 do React no rodapé do portfólio, um mistério que só acontecia à noite: o servidor renderiza em UTC, o visitante em fuso local, e o new Date() no JSX devolvia respostas diferentes pra cada um. A caçada até o useState(null), o timeZone pinado, e o epílogo em que eu mesmo criei um segundo bug arrumando o primeiro.

O hero do portfólio digitava, apagava e redigitava — não por efeito, mas por bug: a hidratação adiada montava o componente e zerava o texto que já estava na tela. A história de como o LCP de 3.6s caiu pra 2.7s removendo a hidratação ociosa do lugar errado.

Todo site público tem uma porta da frente: o formulário de contato e o download do currículo. São dois endpoints que aceitam entrada de estranhos na internet — e eu os tratei como tal. Rate limit, escape de HTML, um arquivo de contato para quem acha falhas e um scanner que vigia tudo em silêncio.

Quando a animacao de troca de tema revelava o tema antigo em vez do novo, a culpa nao era do CSS — era do React nao ter commitado o estado a tempo.

Um header Cache-Control errado no vercel.json sobrescrevia o revalidate=1800 do ISR e transformava a expiração do cache em duas chamadas síncronas ao GitHub dentro do TTFB. A história de como o cache frio virou quente: 3.6s pra 140ms.

A seção de projetos do portfólio quase ganhou um filtro por categoria. Não ganhou — e foi a melhor decisão. A história do grid de 2 colunas que resistiu à tentação da complexidade.

O pnpm audit do Portfólio gritava 61 vulnerabilidades. Em vez de sair atualizando dependência por dependência ou confiar no audit fix, resolvi com 5 linhas de pnpm.overrides no package.json. Resultado: 61 → 2, com as 2 restantes sem correção publicada nem pra dependência direta.

O Portfólio estava 100% funcional, 218 testes passando, zero erros no CI. Mas usuários de mobile Chrome viam versões antigas ao restaurar abas. A causa: o bfcache do Chrome ignora headers HTTP — e a solução veio cruzada de outro projeto.

Ninguém tocava no código, mas a Vercel recusava o build: ERR_PNPM_EEXIST. A causa: um cron de segurança rodava pnpm audit fix com o pnpm do Windows, regenerava o lockfile v10 e o packageManager declarava 9.12.3 — a saga de alinhar pnpm local, packageManager e CI.

529 commits, 218 testes, 5 mini-games, parallax scene multicamada, terminal interativo com 15+ comandos, i18n PT/EN — a jornada de um portfólio que virou vitrine interativa.

Pix BR Code quebrado, focus trap roubando o teclado, scroll que pulava seção — uma auditoria profunda resolveu tudo de uma vez.

Implementei Pix no portfólio com pagamento via BR Code. Só que o QR Code não funcionava em nenhum app de banco. O culpado: String.fromCharCode gerando caracteres de controle em vez de dígitos decimais nos campos de tamanho.

Julho de 2026 foi o mês em que o portfólio parou de ganhar features novas e começou a corrigir as que já tinha. Uma auditoria profunda revelou 10 problemas — do Pix ao focus trap — e no fim o deploy ficou mais automático do que nunca.

Explorando jogos do portfolio — aprendizados, desafios e descobertas.

Depois de construir ferramentas para os outros, resolvi dedicar tempo ao meu próprio espaço. Um portfólio que fosse mais que um currículo.

Explorando rebuild do portfolio — aprendizados, desafios e descobertas.