Leandro Baldan

Leandro Baldan

desenvolvedor back end em Python

Escrevo o back end que monitora usinas solares: puxo dado de portal, SCADA e inversor, desconfio dele, audito e transformo em série temporal confiável. Nas horas vagas construo APIs, agentes de IA e sistemas com RAG, sempre com o número saindo do teste.

  • 45 usinasmonitoradas na plataforma em que trabalho
  • 9 projetospúblicos, com número reproduzível
  • Eng. ElétricaIFES, conclusão prevista para 2027

1. e4 · quem sou

Da engenharia elétrica para o software

Sou de Vitória (ES) e estudo Engenharia Elétrica no IFES. Cheguei ao software pelo caminho da energia: comecei como estagiário em operação e manutenção de usinas solares e hoje sou desenvolvedor na Mola Mola, cuidando da plataforma que acompanha essas usinas.

Gosto de problema em que o dado mente: API que cai, sensor que trava no mesmo valor, fuso horário errado, portal que devolve o dia pela metade. Boa parte do meu trabalho é provar o que está certo antes de mostrar qualquer gráfico.

Fora do código, quase sempre tem metal tocando e, nas pausas, xadrez. Gosto de software livre e de conhecimento compartilhado, por isso meus projetos pessoais ficam públicos.

Música que estou ouvindo agora no Spotify

tocando agora, ao vivo do Spotify

2. Cf3 · no dia a dia

O que eu faço na Mola Mola

A plataforma acompanha 45 usinas fotovoltaicas de 7 organizações. Cada uma chega por um caminho diferente, e o trabalho é fazer tudo isso virar um dado só, confiável e auditável. Os problemas que mais ocupam a minha semana:

integração · Python · Django · Celery · PostgreSQL

Fazer 6 portais falarem a mesma língua

Cada usina reporta por um lugar: portais cloud de fabricantes, SCADA local na própria usina ou API do inversor. Escrevo os coletores que buscam esse dado, os pipelines que reconciliam o que chegou de fontes diferentes e os backfills que recuperam o histórico quando uma fonte fica fora do ar.

  • Falha é o caso normal: OAuth, retry e fallback para rate limit, indisponibilidade e dado faltando. O desenho assume consistência eventual e falha parcial.
  • Fuso e calendário: cada usina tem o seu, e o dia solar real não é o dia do calendário do servidor.
  • Entrega: séries temporais em PostgreSQL/TimescaleDB, servidas para dashboard, alertas, exportações CSV/Excel e relatórios.
Fluxo de dados: portais, SCADA local e APIs de inversores alimentam coletores Celery, que passam por reconciliação até o PostgreSQL, que serve dashboard, alertas e relatórios 6 portais cloudOAuth · REST · scraping SCADA localScada-LTS · via VPN APIs de inversoresREST Coletores Celeryretry · fallbackrate limit Reconciliaçãobackfill · auditoriafuso da usina PostgreSQLTimescaleDBséries temporais Dashboardtempo real Alertasregras + ML RelatóriosPDF · CSV · Excel

visão simplificada do fluxo de dados

qualidade de dados · SQL · LaTeX

Auditar o dado antes de confiar nele

Montei um framework de auditoria que compara, usina por usina, três versões da mesma medição: a gravada localmente, a do SCADA e a da API cloud. Quando elas divergem, uma hierarquia de confiança entre as fontes decide quem está certo, e o relatório diz o que corrigir e como.

  • 45 usinasauditadas com o mesmo método
  • 0,5% / 1 kWhcritério de aceite entre as fontes
  • PDFrelatório automático com plano de remediação

O que costuma aparecer: lacunas de captura, sensor travado, drift de calibração e janelas em que a API ficou fora do ar.

machine learning · LightGBM · scikit-learn

Modelo onde ajuda, regra onde é mais confiável

Implementei de ponta a ponta o classificador de alertas de inversores em 5 classes. As features vêm do domínio solar: razão de potência e de irradiância contra uma baseline móvel, detecção de flatline, dia solar real e comparação entre inversores da mesma usina. O cuidado principal foi não me enganar: treino e teste separados por usina, com validação cruzada agrupada, para o modelo não decorar a planta.

  • 0,94de F1 na detecção de anomalia (binário)
  • 0,82 a 0,99de F1 nas classes do multiclasse
  • 5 classescom SMOTE no desbalanceamento
Pipeline de alertas: telemetria vira features de domínio, um LightGBM binário detecta anomalia, um multiclasse classifica, regras determinísticas complementam, e a revisão humana realimenta o treino Telemetriapotência · irradiância Features de domíniobaseline · flatline · dia solar LightGBM binárioé anomalia? F1 0,94 LightGBM multiclassequal das 5 classes Alertainferência assíncrona Regras determinísticasonde a regra é melhor Revisão do alertarótulo confirmado active learning

desenho do ciclo de inferência e de melhoria contínua

operação · SSH · VPN · Windows · Linux · Docker

Vigiar a usina e agir antes da coleta parar

Parte das usinas grava em um SCADA local (Scada-LTS sobre Tomcat e MySQL no Windows, ou em containers Docker no Linux). Estruturei o acesso SSH a essas máquinas via VPN, com inventário e runbooks, e escrevi um watchdog que vigia serviços, captura, memória, disco e banco. Quando algo falha, ele salva um pacote de diagnóstico na própria máquina e manda um e-mail curto explicando o que viu.

Nas máquinas Windows, uma tarefa separada de auto-restart age em casos específicos, para a coleta não ser interrompida:

  • Scada parado ou travado (página de login sem responder por 10 minutos): sobe o MySQL se precisar e reinicia o Scada.
  • Vazamento de memória: amostra o consumo a cada hora e, quando a tendência confirma o vazamento, faz um reinício preventivo de madrugada. Em memória crítica, reinicia na hora.
  • Freios: no máximo 3 tentativas por hora, e nenhum reinício se o banco estiver com problema (sem resposta, somente leitura ou com sinal de corrupção), para não piorar o que já está ruim.
  • Nasceu de um incidente real, em que uma usina ficou dias sem gravar sem ninguém perceber.
  • Versionado em SemVer, com o hash de cada release anotado por usina, e testes de regressão que rodam isolados na máquina da usina, com SMTP falso.
Dentro da máquina da usina, o watchdog observa o Scada-LTS, salva um pacote de diagnóstico e envia e-mail de alerta; o auto-restart reinicia o Scada com limite de tentativas e trava de banco; a equipe acessa a máquina por SSH via VPN máquina da usina · Windows ou Linux Scada-LTSTomcat + MySQL · Docker auto-restart3/h · trava de banco reinicia watchdogsó lê: serviços, memória, banco observa Pacote de diagnósticosalvo na própria máquina E-mail de alertacurto, em pt-BR Equipeinventário · runbooks SSH via VPN

o watchdog só observa e guarda evidência; quem age é o auto-restart, com limite e trava de banco · no Linux, só reporta

entrega · Docker · GitHub Actions

Colocar no ar sem susto

Mantenho os deploys Dockerizados de Django e Celery, com CI/CD no GitHub Actions: lint, type checking, testes unitários e de integração, deploy automático em staging e produção, rollback, health checks e logs estruturados. Cada tarefa roda numa stack Docker Compose isolada, com banco, broker e volumes próprios.

A plataforma é privada e tem dado de clientes, então aqui não entra print, nome de cliente nem de usina. Os números são agregados e os diagramas são desenhos meus, simplificados.

3. Bc4 · projetos paralelos

Projetos com o número saindo do teste

Aplicações completas que construí fora do trabalho, com dados fictícios de semente fixa. Cada indicador citado aqui é conferido por teste automatizado contra o gabarito do próprio repositório: dá para clonar e reproduzir.

Painel do ChatDesk com métricas, lista de conversas por estado e a transcrição de um atendimento que virou lead

ChatDesk

Atendimento com RAG

Problema: a mesma dúvida respondida à mão dez vezes por semana, e a conversa morrendo no mensageiro. Automatizar com um LLM cru é pior: bot que inventa prazo ou desconto não economiza trabalho, cria passivo.

Solução: o bot responde só com o que está nos documentos da empresa, citando a fonte, e recusa o resto. A recusa é decidida no código, antes de o modelo ser chamado, então não existe caminho em que ele responda sem contexto. Quem demonstra intenção de contratar é qualificado e vira lead no CRM, com a transcrição junto.

  • 5/5perguntas fora da base corretamente recusadas
  • 19/19perguntas da base respondidas da fonte certa, incluindo 9 reformuladas na língua do cliente
  • 100%de cobertura de teste da aplicação · 206 testes
  • Python 3.12
  • FastAPI
  • PostgreSQL + pgvector
  • RAG
  • Telegram Bot API
  • Docker Compose
  • Pytest
Ver o repositório e o case completo →
Terminal com a execução da demo do ClauseGuard: o laudo para no portão humano, é retomado e lista as violações com o trecho da política que as motivou

ClauseGuard

Agente com portão humano

Problema: empresa que assina contrato sem jurídico interno tem política escrita e ninguém a aplica. Prazo de pagamento, teto de multa e foro passam batido, e quando alguém confere, a conferência não deixa rastro do que foi olhado nem com base em quê.

Solução: um grafo de agente que extrai as cláusulas, busca a regra correspondente na base vetorial da política e só então julga. Nada acima do limiar, nenhuma chamada ao modelo: a cláusula vira "sem regra". A trava contra invenção está no código, não no prompt. Violação de risco alto congela a execução, espera a decisão de um humano e retoma do ponto onde parou, sem reprocessar nada.

  • 93,3%de recall na recuperação (14/15) contra o gabarito
  • 0falso positivo: cláusula fora da política não recupera nada
  • 92%de cobertura de teste · 30 testes, rodando offline
  • Python
  • LangGraph
  • LLM
  • Qdrant
  • FastAPI
  • PostgreSQL
  • Docker Compose
Ver o repositório e o case completo →
Pipeline comercial do LeadDesk com as oito etapas lado a lado

LeadDesk

CRM com prospecção acoplada

Problema: prospecção em planilha, histórico de conversa no WhatsApp e conversão para lead feita recadastrando dado à mão: um pipeline em que ninguém confia.

Solução: uma aplicação só, ligando os dois lados do funil: prospect com segmento e origem, meta semanal de pesquisa e contato, conversão para lead sem recadastro e pipeline comercial de 8 etapas com próxima ação e histórico de interações.

  • 17endpoints REST documentados no OpenAPI
  • 100%de cobertura de teste da aplicação
  • 15,0%de prospect pesquisado para lead no dataset demo (18/120)
  • Python 3.12
  • FastAPI
  • SQLAlchemy 2.0
  • PostgreSQL
  • Docker Compose
  • Pytest
Abrir a demo no ar → Ver o repositório →

A demo roda em plano gratuito do Render: o primeiro acesso depois de um período parado leva cerca de 30 segundos para a máquina subir.

Tela do ConciliaFlow mostrando o resumo da conciliação e a tabela de lançamentos

ConciliaFlow

Conciliação financeira

Problema: conciliar extrato bancário com o relatório de vendas era trabalho manual de planilha, com risco de erro e sem rastro do porquê de cada correspondência.

Solução: motor de conciliação com regras determinísticas em camadas (exata, por tolerância de valor e data, por agrupamento), fila de revisão assistida para o que não bate sozinho e exportação pronta para o Excel.

  • 77,2%conciliado automaticamente no dataset demo
  • 61testes automatizados
  • Python
  • FastAPI
  • Pandas
  • PostgreSQL
  • Docker
  • HTML/CSS/JS sem build
Abrir a demo no ar → Ver o repositório →

A demo roda em plano gratuito do Render: o primeiro acesso depois de um período parado leva cerca de 30 segundos para a máquina subir.

Página de produto do Promoly: preço atual, comparação com a média histórica e com o último preço registrado, e o veredito Bom momento para comprar

Promoly

Coleta de preço e decisão

Problema: promoção de marketplace mente. O anúncio sobe o preço na véspera e anuncia desconto sobre o número inflado, e quem divulga link de afiliado repassa a mentira: perde a confiança de quem clicou e ainda faz o trabalho na mão, produto a produto.

Solução: um coletor grava o preço de cada anúncio ao longo do tempo, e a decisão sai do histórico, não do selo do vendedor: produto sem série de preço não aparece. Sem dois registros, a queda não é verificável e o item é descartado antes de virar publicação. O que passa no critério vira página com média histórica, mínimo, máximo e o veredito, e alimenta a geração automática dos posts.

  • 206 testesverdes · 67% de cobertura na API e no coletor
  • 42 de 59cards extraídos da listagem real do Mercado Livre; o resto é anúncio patrocinado, ignorado de propósito
  • > 2%abaixo da média histórica: o piso para um produto entrar no radar
  • Python
  • FastAPI
  • PostgreSQL
  • Alembic
  • Next.js
  • TypeScript
  • Docker Compose
  • Pytest

Projeto próprio em coautoria com Eduardo Coutinho. O print é de uma instalação local: os produtos e os preços vêm de uma captura real da listagem do Mercado Livre, e a série histórica é simulada, porque a coleta contínua está parada desde que o Mercado Livre passou a devolver página de bloqueio ao coletor.

Ver o repositório e o case completo →

4. d4 · pesquisa e dados

Quando o resultado é o achado, não a tela

Dois trabalhos em que o produto é o experimento: hipótese declarada, comparação sob a mesma partição e método descrito a ponto de outra pessoa reproduzir.

Gráfico de barras do AUC-ROC out-of-fold dos sete modelos, com o LightGBM por feature com contagem em 0,9181 no topo

Santander Customer Transaction Prediction

Classificação binária · Kaggle

Problema: prever transação futura a partir de 200 features anônimas, em 200.000 linhas com só 10,05% de positivos. Sem nome de coluna, não há intuição de negócio para guiar a engenharia de atributos: o sinal precisa sair da estrutura do próprio dado.

Solução: a extensão do trabalho descobriu que metade do conjunto de teste é sintética: linha gerada reamostrando cada coluna, que por isso nunca contém um valor inédito. O critério separa as 100.000 linhas reais sem zona cinzenta e sem usar o alvo. Com elas isoladas, a contagem de cada valor vira atributo, e só rende quando o modelo olha uma feature por vez, porque a informação é interação entre duas colunas, não sinal aditivo.

  • 0,9181de AUC-ROC out-of-fold, contra 0,8997 do baseline
  • 100.000linhas sintéticas separadas das reais, sem sobreposição
  • 5 foldsestratificados, mesma semente e partição para todos os modelos
  • Python
  • LightGBM
  • scikit-learn
  • Pandas
  • NumPy
  • LaTeX

A camada original (EDA, três modelos clássicos e o relatório) é trabalho de dupla com Murilo Fabri, na Engenharia Elétrica do IFES. A extensão descrita aqui é individual.

Ver o repositório e o case completo →
Precision, recall e mAP@50 dos três modelos YOLOv8: a Small com arquitetura otimizada é a mais alta nas três métricas

Detecção de armas de fogo com YOLOv8

Visão computacional · IFES

Problema: câmera de vigilância grava sem parar e ninguém assiste a tudo. Um detector que só roda em GPU de servidor não resolve o problema de quem tem dezenas de câmeras instaladas: o modelo precisa caber no hardware que já está no local.

Solução: em vez de aumentar a rede, buscar automaticamente uma rede menor que compense a capacidade perdida. O Optuna, com TPE, varreu não só os hiperparâmetros de treino como a própria arquitetura da backbone, acrescentando, removendo e trocando camadas a cada trial, com função objetivo única sobre precision, recall e mAP.

  • 0,935de precision, contra 0,829 da Large tradicional
  • +17,3 pontosde mAP@50 sobre a rede maior, com arquitetura menor
  • 3 modelostreinados em 100 épocas cada, sob a mesma validação
  • Python
  • PyTorch
  • Ultralytics YOLOv8
  • Optuna (TPE)
  • Iniciação científica

Pesquisa de iniciação científica no IFES, 2024. O artigo completo está no repositório.

Ver o repositório e o artigo →

5. O-O · coisa pequena que roda sozinha

Projetos de uso real

Dois projetos que existem para uso de verdade, não para demonstração: um publica todo dia sem ninguém apertar botão, o outro roda na máquina de quem transmite, sem servidor no meio.

Tela do jogo Conexões Bíblicas do Devocional Diário, com as dezesseis palavras a agrupar

Devocional Diário

Site estático com publicação automática

Problema: conteúdo diário em rede social morre no dia em que a pessoa esquece de postar. E manter site, jogos e posts em três lugares diferentes garante que os três vão divergir.

Solução: o conteúdo mora num arquivo só, lido pelo navegador e pelos scripts de publicação. Editar esse arquivo atualiza o site e os posts ao mesmo tempo. O GitHub Actions gera as imagens, monta o carrossel, o Story, o Reel em vídeo e publica no Instagram e no Threads em horários fixos, sem servidor, sem painel e sem custo de hospedagem.

  • 201devocionais no banco único de conteúdo
  • 90testes automatizados em Vitest, site e automação
  • 4 rotinasagendadas: devocional, conteúdo do dia, Reel e insights
  • JavaScript
  • Node
  • GitHub Actions
  • Vitest
  • ffmpeg
  • Graph API
  • GitHub Pages
Abrir o site publicado → Ver o repositório →
Overlay do Placar da Live sobre fundo escuro, com seis times ordenados por pontuação e o líder destacado

Placar da Live

Overlay de transmissão

Problema: quem transmite ao vivo e monta disputa entre times precisa somar presente na mão ou assinar ferramenta mensal. E overlay que zera quando a cena troca no meio da live destrói a disputa que estava em pé.

Solução: uma pasta com quatro arquivos que entra como fonte de navegador no LIVE Studio ou no OBS. Escuta a porta local do TikFinity, descobre de quem é o presente, para qual time vai e quanto vale. Grava a pontuação a cada ponto no próprio navegador, então recarregar a fonte não zera nada, e reconecta sozinho se a porta cair. Presente que não está na tabela vale as próprias moedas: presente novo já entra na disputa sem ninguém configurar.

  • 4 arquivosnuma pasta, sem instalação, servidor ou mensalidade
  • 1 arquivode configuração é tudo que o usuário edita
  • 0dado saindo da máquina de quem transmite
  • JavaScript sem build
  • WebSocket
  • localStorage
  • HTML/CSS
  • OBS · TikTok LIVE Studio
Ver o repositório e o manual →

6. Te1 · stack e atividade

Com o que eu trabalho, e com que frequência

back end

  • Python · Django · Django REST · FastAPI
  • Celery · SQLAlchemy 2.0 · Pydantic
  • APIs REST · OAuth · webhooks · integrações

dados e IA

  • PostgreSQL · TimescaleDB · SQL
  • Pandas · LightGBM · scikit-learn · PyTorch
  • LangGraph · RAG · pgvector · Qdrant

infra e operação

  • Docker · Docker Compose · GitHub Actions
  • Linux · Windows · SSH · VPN
  • Pytest · CI/CD · Git

front end

  • JavaScript · TypeScript
  • React · Next.js
  • HTML/CSS sem build quando cabe
Calendário de contribuições no GitHub no último ano
Contribuições por dia da semana Linguagens mais usadas nos repositórios públicos

gerado todo dia por um GitHub Action deste repositório · inclui contribuições em repositórios privados

7. h3 · experiência

Onde eu aprendi isso

  1. ago/2025 · atual

    Desenvolvedor de Software · Mola Mola

    Back end da plataforma de monitoramento de usinas fotovoltaicas: integração de portais, SCADA e APIs de inversores, pipelines assíncronos, auditoria de dados, classificação de alertas com machine learning, acesso remoto e watchdog das máquinas das usinas. Python, Django, Celery, PostgreSQL, JavaScript e React.

  2. fev/2025 · ago/2025

    Estagiário de Engenharia · AEVO Solar

    Operação e Manutenção e Centro de Engenharia e Performance. Relatórios de desempenho, geração e zeladoria, acompanhamento de indicadores operacionais e disponibilidade de ativos, documentação de ordens de serviço.

  3. abr/2024 · jan/2025

    Pesquisador · IFES

    P&D em visão computacional: otimização de modelos YOLOv8 para detecção de objetos, ajuste de hiperparâmetros, análise de métricas e validação experimental com foco em precisão, recall e inferência em tempo real.

  4. formação

    Bacharelado em Engenharia Elétrica · IFES

    Instituto Federal do Espírito Santo, Campus Vitória. Conclusão prevista para meados de 2027.

8. … · vamos conversar

Bora trocar uma ideia

Estou aberto a oportunidades como desenvolvedor back end. Também topo conversar sobre Python, dados de energia, agentes de IA ou uma partida de xadrez.

Também pego projeto pontual de automação e dados, quando o escopo é claro.