O que é
Site com páginas estáticas geradas no build para serem encontradas na busca, aplicação React por cima para a navegação, e uma API própria em PHP/MySQL com painel de administração — cadastro de itens com upload de fotos, blog e registro de contatos.
Publicar um item no painel dispara um webhook que aciona o GitHub Actions, que reconstrói as páginas estáticas e envia por FTP. Ninguém precisa saber que existe um build.
Decisões técnicas
Correção de orientação de imagem no upload. Fotos de celular guardam a rotação em metadado EXIF. A biblioteca de redimensionamento ignora esse metadado, então as miniaturas saíam deitadas mesmo com o original aparentando estar certo no computador. A correção gira os pixels conforme o EXIF antes de redimensionar, cobrindo os oito casos possíveis, e regrava sem o metadado. Também escrevi um script de manutenção idempotente para corrigir o que já estava no servidor.
Diagnóstico de performance com número, não com palpite. A queixa era “o site parece lento”. Medindo, a página carregava mais de 4 MB de JavaScript — a maior parte um compilador rodando no navegador para transformar o código a cada visita. A correção foi passar a compilar no build.
O incidente
Este projeto também é meu registro de resposta a incidente. O site sofreu defacement por comprometimento da conta de hospedagem compartilhada — sites de terceiros abandonados na mesma conta, não o código do site. A resposta está documentada no repositório: identificação do vetor, rotação de todas as credenciais, redeploy limpo, varredura e remoção dos arquivos maliciosos, endurecimento de cabeçalhos e remoção do spam já indexado.
Semanas depois, analisando as métricas de busca, descobri resíduo do mesmo ataque que a primeira limpeza não pegou: uma pasta que respondia diferente para o robô do buscador e para o visitante. A lição que ficou não foi técnica: “limpo” precisa ser verificado com evidência, não presumido porque o sintoma sumiu.