<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Guilherme Bandeira Rondon on Guilherme Rondon</title><link>https://guirondon.dev/pt-br/</link><description>Recent content in Guilherme Bandeira Rondon on Guilherme Rondon</description><generator>Hugo</generator><language>pt-BR</language><lastBuildDate>Tue, 27 Oct 2026 18:00:00 -0300</lastBuildDate><atom:link href="https://guirondon.dev/pt-br/index.xml" rel="self" type="application/rss+xml"/><item><title>Detecção de intrusão em containers: invariantes de uid e auditoria do kernel</title><link>https://guirondon.dev/pt-br/posts/cluster-detection/</link><pubDate>Tue, 27 Oct 2026 18:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/cluster-detection/</guid><description>&lt;p&gt;No &lt;a href="https://guirondon.dev/pt-br/posts/cluster-hardening/"&gt;primeiro post&lt;/a&gt;&#10; eu tornei o cluster mais difícil de atacar, mas nada ali avisa se um ataque aconteceu. Se um processo escapasse de um container, eu não ficaria sabendo.&lt;/p&gt;&#10;&lt;p&gt;Este segundo post da série trata de &lt;strong&gt;detectar&lt;/strong&gt; essa fuga, com duas ferramentas: uma checagem periódica que aproveita uma regra deixada pelos user namespaces, e a auditoria do kernel, que registra eventos no instante em que acontecem. O terceiro post trata do tráfego que chega da internet.&lt;/p&gt;</description></item><item><title>Do RBAC ao AppArmor: seis fases para blindar um k3s num Raspberry Pi</title><link>https://guirondon.dev/pt-br/posts/cluster-hardening/</link><pubDate>Sun, 25 Oct 2026 20:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/cluster-hardening/</guid><description>&lt;p&gt;No &lt;a href="https://guirondon.dev/pt-br/posts/gitea-migration/"&gt;post sobre a migração para o Gitea&lt;/a&gt;&#10; contei como fiz os builds dos meus projetos funcionarem dentro do cluster. Para isso, peguei um atalho: o runner do Gitea (o programa que executa os workflows de CI) ganhou muito mais privilégios do que precisava.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;o &lt;strong&gt;socket do containerd&lt;/strong&gt;, o arquivo por onde se dão ordens ao programa que roda os containers no nó. Quem escreve nele pode pedir um container rodando como root e com o disco inteiro do Pi montado;&lt;/li&gt;&#10;&lt;li&gt;a pasta onde ficam as imagens e os dados do cluster;&lt;/li&gt;&#10;&lt;li&gt;o &lt;strong&gt;kubeconfig de administrador&lt;/strong&gt;, a credencial que deixa o &lt;code&gt;kubectl&lt;/code&gt; fazer qualquer coisa: ler senhas, criar e apagar qualquer recurso.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Funcionava, mas qualquer workflow de qualquer repositório tinha acesso ao cluster inteiro. Basta um &lt;code&gt;npm ci&lt;/code&gt; instalar uma dependência comprometida: o script dela roda dentro do job e só precisa ler o kubeconfig que está ali.&lt;/p&gt;</description></item><item><title>Meu site caiu, e a culpa foi dos meus vizinhos</title><link>https://guirondon.dev/pt-br/posts/wifi-channel-outage/</link><pubDate>Thu, 10 Sep 2026 15:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/wifi-channel-outage/</guid><description>&lt;p&gt;Não era a primeira vez. Umas semanas atrás eu tinha notado o site fora do ar numa manhã, sem acesso via SSH — mas as luzes de TX/RX piscando normalmente. Reiniciei pela tomada, tudo voltou ao normal, e por precaução ativei a persistência de logs no homelab. Deixei como estava e segui a vida.&lt;/p&gt;&#10;&lt;p&gt;Daí, um dia antes de eu começar a escrever este post, o Raspberry Pi que hospeda este site caiu de novo do nada. O site devolveu um 502, o SSH travou, e eu fiz o que normalmente é minha primeira tentativa de solução rápida: tirei da tomada, esperando que ele voltasse. Voltou — mas a instabilidade continuava, e após alguns minutos resolvi acessar o Pi remotamente.&lt;/p&gt;</description></item><item><title>Por trás do pedido de doação do Intercept Brasil: hipóteses sobre cache, borda e origem</title><link>https://guirondon.dev/pt-br/posts/edge-cache-security/</link><pubDate>Mon, 27 Jul 2026 14:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/edge-cache-security/</guid><description>&lt;!-- POST 1 - Série Security (escopo de posts futuros ainda em aberto) --&gt;&#10;&lt;!-- Foco: divisão de responsabilidade borda/origem, exposição de IP de origem, cache poisoning/deception, stale-if-error como resiliência. Todos os cenários de ataque tratados como especulação pessoal, nunca como causa confirmada. --&gt;&#10;&lt;!-- RASCUNHO EM PORTUGUÊS - versão em inglês vem depois, seguindo a convenção do repo. --&gt;&#10;&lt;p&gt;Me deparei com uma postagem patrocinada do Intercept Brasil pedindo doação para reforçar a segurança do site. De acordo com o próprio veículo, a matéria que envolvia o vazamento de áudios de Flávio Bolsonaro com o banqueiro Daniel Vorcaro saiu do ar logo em seguida de ser publicada, e agora eles estão pedindo dinheiro aos leitores para não passar por isso de novo.&lt;/p&gt;</description></item><item><title>Dividir para dobrar: o que aprendi levando duas soluções a um hackathon</title><link>https://guirondon.dev/pt-br/posts/hacarthon/</link><pubDate>Sun, 19 Jul 2026 20:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/hacarthon/</guid><description>&lt;p&gt;Três semanas antes do haCARthon começar, eu devia estar com a cabeça enterrada em trechos do Código Florestal, validando queries contra bases geo de municípios brasileiros. Em vez disso, estava numa chamada de vídeo tentando convencer minha equipe de quatro pessoas a se dividir em duas.&lt;/p&gt;&#10;&lt;p&gt;Não foi uma decisão impulsiva. Foi a conclusão de um mês inteiro mergulhado num desafio que eu não esperava gostar tanto.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="r15-mil-foi-o-gancho-que-faltava"&gt;&#10; R$15 mil foi o gancho que faltava&#10;&lt;/h2&gt;&#10;&lt;p&gt;Nunca fui muito entusiasta de hackathons. Mas dessa vez o gancho foi direto: minha companheira, UX/UI Designer, recebeu um e-mail da PanicLobster — organizadora do evento — avisando que em um mês aconteceria o &lt;strong&gt;haCARthon&lt;/strong&gt;, com premiação de R$15.000 para cada uma das cinco equipes vencedoras. O incentivo despertou meu interesse o suficiente para eu ir atrás dos desafios propostos.&lt;/p&gt;</description></item><item><title>Dos arquivos eleitorais brutos a um modelo dimensional: construindo um pipeline de dados para as eleições de 2026 no Brasil</title><link>https://guirondon.dev/pt-br/posts/etl-n-modeling/</link><pubDate>Fri, 10 Jul 2026 14:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/etl-n-modeling/</guid><description>&lt;p&gt;Em 2024, a cobertura eleitoral em que eu trabalhava dependia de um sistema terceirizado bem caro, que caiu justamente na noite da apuração e quase transformou a cobertura em prejuízo total. Em 2026 a decisão foi outra: em vez de comprar uma solução pronta, eu e outro desenvolvedor construímos o pipeline internamente em cerca de três meses, com seis serviços pequenos e um único agendamento diário.&lt;/p&gt;&#10;&lt;p&gt;O &lt;a href="https://guirondon.dev/pt-br/posts/elections-intro"&gt;primeiro post desta série&lt;/a&gt;&#10; contou a história: três encontros com os dados eleitorais do Brasil, e na terceira vez coube a mim liderar a construção. Este post é sobre essa construção: o que o TSE (a autoridade eleitoral do Brasil, que conduz toda eleição e publica os dados por trás dela) realmente publica, como esses dados chegam, e como viraram um modelo estruturado que uma API consegue servir.&lt;/p&gt;</description></item><item><title>Dei ao Claude 12.732 memórias. Eis o que ele percebeu.</title><link>https://guirondon.dev/pt-br/posts/kg-n-inferences/</link><pubDate>Mon, 06 Jul 2026 14:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/kg-n-inferences/</guid><description>&lt;p&gt;Montei o sistema de memória, usei por alguns meses, e depois parei para olhar o que ele realmente tinha acumulado.&lt;/p&gt;&#10;&lt;p&gt;O &lt;a href="https://guirondon.dev/pt-br/posts/mempalace-setup/"&gt;post anterior&lt;/a&gt;&#10; descreve como as três camadas funcionam: &lt;code&gt;CLAUDE.md&lt;/code&gt; para contexto estático, &lt;a href="https://github.com/MemPalace/mempalace" target="_blank" rel="noopener noreferrer"&gt;MemPalace&lt;/a&gt;&#10; para memória dinâmica de sessão, um grafo de conhecimento para fatos estruturados. O MemPalace não é o recurso de memória embutido do Claude — é uma infraestrutura que eu mesmo rodo, com memórias armazenadas em ChromaDB e SQLite na minha máquina e integração via MCP (Model Context Protocol), um padrão aberto que qualquer cliente compatível pode falar. Se eu trocasse de modelo amanhã, tudo o que ele acumulou continuaria no lugar.&lt;/p&gt;</description></item><item><title>A stack de memória por trás do workflow de IA: CLAUDE.md, MemPalace e um grafo de conhecimento</title><link>https://guirondon.dev/pt-br/posts/mempalace-setup/</link><pubDate>Sat, 04 Jul 2026 16:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/mempalace-setup/</guid><description>&lt;p&gt;O &lt;a href="https://guirondon.dev/pt-br/posts/ai-at-work/"&gt;primeiro post desta série&lt;/a&gt;&#10; foi sobre a prática — como estruturo prompts, itero em ciclos curtos, e delego trabalho mecânico mantendo o julgamento do meu lado. Este é sobre a infraestrutura por trás dessa prática: o sistema de memória em três camadas que faz isso funcionar entre sessões, projetos, e semanas.&lt;/p&gt;&#10;&lt;p&gt;Nenhuma dessas camadas é tecnicamente complexa. O valor vem de como elas se encaixam.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="o-problema-da-memória-de-ia-brevemente"&gt;&#10; O problema da memória de IA (brevemente)&#10;&lt;/h2&gt;&#10;&lt;p&gt;Modelos de linguagem não têm memória persistente. Toda sessão começa em branco. Isso é normal para uma pergunta pontual, mas se você usa IA como uma ferramenta séria de desenvolvimento, isso cria atrito: reexplicar a estrutura do projeto, reestabelecer convenções, corrigir o mesmo comportamento que você já corrigiu semana passada.&lt;/p&gt;</description></item><item><title>Três eleições, três encontros com os dados eleitorais do Brasil — e na terceira, era eu quem liderava</title><link>https://guirondon.dev/pt-br/posts/elections-intro/</link><pubDate>Fri, 03 Jul 2026 10:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/elections-intro/</guid><description>&lt;!-- POST 1 de 3 — série Eleições 2026 --&gt;&#10;&lt;!-- Post narrativo/introdutório. Três atos: 2019-2020, 2024, 2026. Pessoal e contextual. --&gt;&#10;&lt;!-- Sem implementação técnica profunda aqui — isso fica pros posts 2 e 3. --&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;Noite de eleição, 2024. A tela que passamos meses construindo para cobrir a apuração em todo o Brasil apaga — não nossos servidores, não nosso código. Um sistema terceirizado em .NET, rodando numa máquina que entregamos mas nunca tivemos acesso, cede exatamente sob a carga para a qual foi comprado.&lt;/p&gt;</description></item><item><title>Usando IA e dados de partidas de futebol para construir meu próprio narrador</title><link>https://guirondon.dev/pt-br/posts/ai-commentator/</link><pubDate>Mon, 29 Jun 2026 16:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/ai-commentator/</guid><description>&lt;!-- POST 2 de 3 — série Copa 2026 --&gt;&#10;&lt;!-- Foco: a camada de integração. Como os dados se movem da fonte, passando pelo LangChain, até um artigo publicado. --&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;No meio dessas sessões de código, tive um pensamento mais simples: se eu, como desenvolvedor de software, conseguia dar sentido àquele mesmo fluxo — eventos tipados, com timestamp, nomes de jogadores, estatísticas anexadas — por que um LLM não conseguiria?&lt;/p&gt;</description></item><item><title>Construindo para a Copa do Mundo: narração de torcedor em tempo real e editorial automatizado</title><link>https://guirondon.dev/pt-br/posts/produtos-copa/</link><pubDate>Wed, 24 Jun 2026 21:30:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/produtos-copa/</guid><description>&lt;!-- POST 1 de 3 — série Copa 2026 --&gt;&#10;&lt;!-- Foco: o que construímos e por quê. Os dois produtos, o ângulo editorial, o contexto da Copa do Mundo. --&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;Um gol é marcado numa partida da Copa do Mundo. Sessenta segundos depois, uma push notification chega no celular de um torcedor — com o nome do jogador, o minuto, e uma linha de narração. Nenhum jornalista escreveu. Ninguém apertou enviar. O sistema simplesmente soube.&lt;/p&gt;</description></item><item><title>O workflow de IA que ninguém mostra: estrutura, memória e trade-offs reais</title><link>https://guirondon.dev/pt-br/posts/ai-at-work/</link><pubDate>Mon, 22 Jun 2026 14:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/ai-at-work/</guid><description>&lt;p&gt;Existe uma diferença entre usar IA e usar IA bem. A segunda exige pensar sobre o que você está fazendo — não só no prompt que você escreve, mas na estrutura que você constrói ao redor da ferramenta.&lt;/p&gt;&#10;&lt;p&gt;Venho desenvolvendo essa prática nos últimos meses, tanto no trabalho quanto em projetos pessoais. O que aprendi não é sobre qual modelo é melhor ou qual ferramenta tem mais funcionalidades. É sobre como organizar contexto para que a IA seja consistentemente útil — não só na primeira sessão, mas na décima.&lt;/p&gt;</description></item><item><title>Do GitLab ao Gitea: como o CI/CD do meu homelab foi de 3,4 GB para 100 MB</title><link>https://guirondon.dev/pt-br/posts/gitea-migration/</link><pubDate>Sun, 21 Jun 2026 17:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/gitea-migration/</guid><description>&lt;p&gt;Um dos meus repositórios tem um histórico de commits que lê como uma história em três atos. O primeiro é sobre ambição pessoal. O segundo é sobre &lt;a href="https://guirondon.dev/pt-br/posts/homelab-gitea/"&gt;um Raspberry Pi que ficou mudo no meio da noite&lt;/a&gt;&#10;. O terceiro é sobre encontrar a ferramenta certa para a carga certa.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="ato-i-github-actions-com-um-runner-self-hosted"&gt;&#10; Ato I: GitHub Actions com um runner self-hosted&#10;&lt;/h2&gt;&#10;&lt;p&gt;O ponto de partida era simples: eu queria CI/CD rodando no Pi, builds acontecendo localmente, deploys automatizados. A escolha natural era continuar usando GitHub Actions — mas com um runner self-hosted no cluster.&lt;/p&gt;</description></item><item><title>Traefik como ingress no k3s: do roteamento local ao acesso público sem cert-manager</title><link>https://guirondon.dev/pt-br/posts/traefik-k3s/</link><pubDate>Sun, 21 Jun 2026 09:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/traefik-k3s/</guid><description>&lt;p&gt;Quando comecei a montar meu homelab num Raspberry Pi 4B, uma das primeiras perguntas foi: como faço para que múltiplos serviços rodando no cluster respondam cada um no seu próprio domínio, sem abrir uma porta diferente para cada um?&lt;/p&gt;&#10;&lt;p&gt;Eu já sabia a resposta — lembrava de ter trabalhado com EKS na AWS no passado, onde o ingress era um componente separado que precisava ser instalado e configurado. No k3s, ele já vem incluso, nome e tudo: Traefik.&lt;/p&gt;</description></item><item><title>Gitea no Raspberry Pi: a história de como o GitLab derrubou meu homelab</title><link>https://guirondon.dev/pt-br/posts/homelab-gitea/</link><pubDate>Sat, 20 Jun 2026 09:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/homelab-gitea/</guid><description>&lt;p&gt;Era uma sexta à noite e eu estava orgulhoso do que tinha acabado de construir. Tinha acabado de subir o GitLab Community Edition no meu Raspberry Pi 4B — um sonho antigo de ter um ambiente de desenvolvimento completo inteiramente sob meu próprio controle. Git, CI/CD, registry, tudo numa caixinha na prateleira.&lt;/p&gt;&#10;&lt;p&gt;Fui dormir.&lt;/p&gt;&#10;&lt;p&gt;Sábado de manhã, abri o terminal para dar push em algo e encontrei&amp;hellip; silêncio. O Raspberry Pi não respondia. SSH em timeout. Nenhum ping. Fui até a prateleira, olhei o LED verde piscando devagar, e entendi: o consumo de memória do GitLab — provavelmente um vazamento lento agravado por jobs em background competindo por CPU — tinha sufocado todos os outros serviços do nó até o kernel não ter escolha a não ser intervir. O Pi tinha reiniciado, e sem espaço suficiente para trazer tudo de volta, simplesmente ficou parado ali.&lt;/p&gt;</description></item><item><title>Quem sou eu?</title><link>https://guirondon.dev/pt-br/posts/hello-world/</link><pubDate>Fri, 19 Jun 2026 09:00:00 -0300</pubDate><guid>https://guirondon.dev/pt-br/posts/hello-world/</guid><description>&lt;p&gt;Existe uma lembrança que carrego com muito carinho: sentado num banco da minha escola técnica, papel milimetrado na mesa, caneta na mão — nenhum computador à vista. O professor tinha escrito um trecho de código C no quadro e a tarefa era simples: rastrear a execução. Variável por variável, pilha de chamadas por pilha de chamadas, na mão.&lt;/p&gt;&#10;&lt;p&gt;Isso me fisgou instantaneamente — e mudou a forma como penso sobre tudo.&lt;/p&gt;</description></item><item><title>Sobre mim</title><link>https://guirondon.dev/pt-br/sobre/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://guirondon.dev/pt-br/sobre/</guid><description>&lt;p&gt;Engenheiro de software que resolve problemas e descomplica processos. Há quase 10 anos desenho e construo sistemas em backend, dados e sistemas distribuídos, com base em análise e fundamentos, para entregar resiliência, qualidade e eficiência. Hoje também levo IA para o trabalho em produção.&lt;/p&gt;</description></item><item><title>Vamos conversar</title><link>https://guirondon.dev/pt-br/contato/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://guirondon.dev/pt-br/contato/</guid><description>&lt;p&gt;Oportunidades, projetos, uma dúvida sobre algum post ou só trocar ideia sobre backend, dados e IA.&lt;/p&gt;</description></item></channel></rss>