[{"data":1,"prerenderedAt":550},["ShallowReactive",2],{"content-pt":3},{"id":4,"about":5,"education":11,"experience":25,"extension":66,"meta":67,"projects":68,"stem":548,"__hash__":549},"site\u002Fsite\u002Fpt.yml",{"title":6,"paragraphs":7},"Sobre mim",[8,9,10],"Sou desenvolvedor full stack e trabalho com Laravel, Vue, Livewire, TypeScript e PostgreSQL. Desenho e construo produtos web inteiros, da conversa com o cliente sobre o requisito até o deploy.","Desde 2023 trabalho pela Overclock Tech entregando aplicações em Laravel com Vue ou Livewire. Nos projetos maiores, defino o escopo com o cliente e coordeno os desenvolvedores parceiros.","Também faço mestrado em Nanociências na Universidade Franciscana, onde construí o AETHER, um pipeline em Python com API em FastAPI e interface em Vue.",{"title":12,"items":13},"Educação",[14,20],{"period":15,"title":16,"subtitle":17,"description":18,"link":19},"2025 – Presente","Mestrado em Nanociências","Universidade Franciscana","Pesquiso redes neurais de grafos para a triagem de catalisadores de hidrogênio verde.","\u002Fprojetos\u002Faether",{"period":21,"title":22,"subtitle":17,"description":23,"link":24},"2020 – 2024","Ciência da Computação","Trabalho final sobre um protótipo de veículo automatizado para logística na Indústria 4.0.","https:\u002F\u002Ftfgonline.lapinf.ufn.edu.br\u002Fmedia\u002Fmidias\u002Ftfg2-mau_8CsAUZs.pdf",{"title":26,"cvButton":27,"cvHref":28,"items":29},"Experiência","Currículo completo em PDF","\u002Fcurriculo.pdf",[30,47,56],{"period":31,"title":32,"subtitle":33,"link":34,"description":35,"tags":36},"Out 2023 – Presente","Desenvolvedor \u002F Analista de Sistemas","Overclock Tech","https:\u002F\u002Foverclk.tech","Aplicações web de ponta a ponta com Laravel, combinado a Vue ou Livewire conforme o projeto. Coordeno desenvolvedores parceiros em projetos maiores e defino escopo em reunião direta com o cliente.",[37,38,39,40,41,42,43,44,45,46],"TypeScript","PHP","Laravel","Vue","Livewire","Nuxt","PostgreSQL","Docker","Tailwind CSS","Playwright",{"period":48,"title":49,"subtitle":50,"link":51,"description":52,"tags":53},"Fev – Ago 2023","Desenvolvedor Web","Prefeitura Municipal de Santa Maria","https:\u002F\u002Fwww.santamaria.rs.gov.br","Manutenção e desenvolvimento dos sistemas internos e externos da Prefeitura, com entregas no gerenciador de chamados, no Imposto Solidário e em sistemas ligados ao CadÚnico.",[39,38,54,44,41,55],"MySQL","JavaScript",{"period":57,"title":58,"subtitle":59,"link":60,"description":61,"tags":62},"Set 2022 – Fev 2023","Estagiário de TI","Instituto Nacional do Seguro Social","https:\u002F\u002Fwww.gov.br\u002Finss\u002Fpt-br","Responsável por manutenção, suporte e administração de computadores.",[63,64,65],"Manutenção","Reparo","Suporte","yml",{},{"title":69,"intro":70,"contributionLabel":71,"highlightsLabel":72,"problemLabel":73,"requirementsLabel":74,"dataModelLabel":75,"stackLabel":76,"galleryLabel":77,"caseStudyLabel":78,"backLabel":79,"otherTitle":80,"otherItems":81,"items":102},"Trabalhos selecionados","Uma seleção de produtos digitais, plataformas públicas e pesquisa aplicada em que participei da estratégia à entrega.","Minha contribuição","Destaques do projeto","O problema","Requisitos","Modelo de dados","Tecnologias","Telas do sistema","Ver estudo de caso","Voltar aos projetos","Outros projetos de engenharia",[82,93],{"period":83,"title":84,"description":85,"link":86,"image":87,"tags":88},"2024","Monitoramento de Veículo de Transporte Industrial","Sistema web para gerenciamento e telemetria de um Veículo Guiado Automatizado, integrando software, eletrônica e automação industrial.","https:\u002F\u002Fgithub.com\u002Fmauricioprb\u002Ftfg-agv-sistema","\u002Fprojetos\u002Fprojeto-sistema-agv.jpg",[89,37,90,91,92],"Next.js","tRPC","Prisma","MQTT",{"period":94,"title":95,"description":96,"link":97,"image":98,"tags":99},"2023","CSA, Cultura de Segurança dos Alimentos","Software de pesquisa desenvolvido com programas de pós-graduação e Nutrição da UFN para coleta e análise de cultura de segurança dos alimentos.","https:\u002F\u002Fgithub.com\u002Flabedufn\u002Fculturanutri","\u002Fprojetos\u002Fprojeto-csa.png",[89,100,37,91,101],"Node.js","Zod",[103,161,214,264,326,389,444,512],{"id":104,"title":33,"accessNote":105,"contribution":106,"cover":107,"coverAlt":108,"dataModel":105,"description":109,"extension":66,"facts":110,"gallery":120,"highlights":135,"links":145,"meta":149,"order":150,"problem":151,"requirements":105,"slug":152,"stem":153,"summary":154,"tags":155,"__hash__":160},"projects\u002Fprojects\u002Fpt\u002Foverclock-tech.yml",null,"Criei a marca como um sistema. A Overclock Tech é a marca guarda-chuva, e Systems e Games usam o mesmo mascote, mudando só a cor e a segunda linha do nome. As cores vêm do teste de chama, em que o elemento que queima muda a cor do fogo, com o sódio no amarelo da Tech, o selênio no azul da Systems e o bário no verde da Games. Os tons das três divisões têm a mesma luminância, para nenhuma parecer rebaixada, e o contraste de cada combinação de fundo foi medido. O resultado são 24 logotipos em SVG, ícones que funcionam a partir de 16 pixels e um manual de marca de 30 páginas. No site, construí a interface sem biblioteca de componentes. A arte em ASCII da página inicial é desenhada em um OffscreenCanvas dentro de um Web Worker, fora da thread principal. O site é estático, com todas as rotas pré-renderizadas, tema claro e escuro, animações com GSAP e Lenis que respeitam a preferência por movimento reduzido e formulário de contato com envio pelo Resend. Os testes de ponta a ponta em Playwright incluem verificação de acessibilidade com axe.","\u002Fprojetos\u002Foverclock-home.webp","Home da Overclock Tech com o título 'We make tech. Overclocked.' sobre uma arte em ASCII amarela","Marca e site institucional da Overclock Tech, que apresentam as duas frentes da empresa, a Overclock Systems e a Overclock Games, em português e inglês.",[111,114,117],{"label":112,"value":113},"Papel","Marca, direção visual e desenvolvimento",{"label":115,"value":116},"Período","2026",{"label":118,"value":119},"Tipo","Marca e site institucional",[121,126,129,132],{"src":122,"caption":123,"w":124,"h":125},"\u002Fprojetos\u002Foverclock-marca-divisoes.webp","A marca guarda-chuva e as duas divisões, com o mesmo mascote e as cores do sódio, do selênio e do bário.",2560,1600,{"src":127,"caption":128,"w":124,"h":125},"\u002Fprojetos\u002Foverclock-marca-versoes.webp","Versões verticais, avatares e ícones de aplicativo, desenhados para funcionar a partir de 16 pixels.",{"src":130,"caption":131,"w":124,"h":125},"\u002Fprojetos\u002Foverclock-antes-home.webp","Antes, o site da Overclock Labz era uma página de venda de protótipos em 14 dias.",{"src":133,"caption":134,"w":124,"h":125},"\u002Fprojetos\u002Foverclock-antes-pacote.webp","Antes, a oferta era um único pacote, com protótipo, hospedagem, subdomínio e suporte por 30 dias.",[136,139,142],{"value":137,"label":138},"24","logotipos em SVG, com manual de marca",{"value":140,"label":141},"2 frentes","Systems e Games sob a mesma marca",{"value":143,"label":144},"Web Worker","arte em ASCII fora da thread principal",[146],{"label":147,"href":34,"icon":148},"Visitar site","ri:external-link-line",{},1,"A empresa nasceu como Overclock Labz, um estúdio de desenvolvimento, e passou a atuar em duas frentes, sistemas e jogos. O site anterior, que também fiz, só falava de protótipos. Era preciso uma marca que abrigasse as duas frentes sem que uma parecesse menor que a outra, e um site com página própria e linguagem para o público de cada uma.","overclock-tech","projects\u002Fpt\u002Foverclock-tech","Site institucional da empresa, com as frentes de sistemas e de jogos.",[156,37,157,158,159,46],"Nuxt 4","Tailwind CSS v4","GSAP","Lenis","FUZxulubhelpzLG_hHKp-hYYfSir4Simn5REu1PfZMk",{"id":162,"title":163,"accessNote":105,"contribution":164,"cover":165,"coverAlt":166,"dataModel":105,"description":167,"extension":66,"facts":168,"gallery":174,"highlights":190,"links":200,"meta":203,"order":204,"problem":205,"requirements":105,"slug":206,"stem":207,"summary":208,"tags":209,"__hash__":213},"projects\u002Fprojects\u002Fpt\u002Flapinf.yml","LaPInf","Extraí o conteúdo do site antigo para arquivos Markdown e YAML e reconstruí o site em Vue 3 com Vite SSG, que gera o HTML de cada rota e funciona sem JavaScript. Cada projeto ganhou página própria, com professores, alunos, parceiros, cursos e registros do INPI, e o acervo pode ser filtrado por curso, com o filtro guardado na URL. Projetos, avisos, parceiros e perguntas frequentes são editados pelo Pages CMS, sem mexer no código, e um plugin do Vite valida cada coleção com Zod durante o build, apontando o arquivo de origem quando um campo é inválido. Os avisos têm data de publicação, início e expiração no horário de Brasília. O HTML sai com os avisos vigentes no momento do build e o navegador reavalia a lista a cada 30 segundos, então um aviso entra e sai do ar sem novo deploy. Os testes unitários cobrem conteúdo, filtros, paginação, créditos e horários dos avisos, e os de ponta a ponta rodam no Chromium com verificação de acessibilidade pelo axe.","\u002Fprojetos\u002Flapinf-home.webp","Home do LaPInf com a chamada 'Alunos aplicam o que aprendem em sala a desafios apresentados pela comunidade.'","Site do Laboratório de Práticas de Computação da Universidade Franciscana, que substituiu a página feita em 2019 a partir de um template Bootstrap. Reúne o acervo de projetos dos cursos de computação, a autoria de cada um e os registros no INPI.",[169,171,172],{"label":112,"value":170},"Desenvolvimento",{"label":115,"value":116},{"label":118,"value":173},"Site institucional",[175,178,181,184,187],{"src":176,"caption":177,"w":124,"h":125},"\u002Fprojetos\u002Flapinf-acervo.webp","O acervo reúne os projetos dos cursos, com filtro por curso, a autoria de cada um e a indicação dos sistemas que estão no ar.",{"src":179,"caption":180,"w":124,"h":125},"\u002Fprojetos\u002Flapinf-projeto.webp","Cada projeto tem página própria, com descrição, acesso ao sistema e créditos de professores, alunos e parceiros.",{"src":182,"caption":183,"w":124,"h":125},"\u002Fprojetos\u002Flapinf-antes-home.webp","Antes, a página de 2019 montada sobre o template Bolt, com Bootstrap e jQuery.",{"src":185,"caption":186,"w":124,"h":125},"\u002Fprojetos\u002Flapinf-antes-projetos.webp","Antes, os créditos de cada projeto abriam em um modal, sem página nem endereço próprio.",{"src":188,"caption":189,"w":124,"h":125},"\u002Fprojetos\u002Flapinf-antes-inpi.webp","Antes, os registros do INPI eram uma montagem de imagens dos certificados.",[191,194,197],{"value":192,"label":193},"34","projetos no acervo",{"value":195,"label":196},"8","registros do INPI verificáveis",{"value":198,"label":199},"Sem JavaScript","HTML gerado para cada rota",[201],{"label":147,"href":202,"icon":148},"https:\u002F\u002Flapinf.ufn.edu.br",{},2,"O site antigo era uma única página HTML montada em 2019 sobre o template Bolt, com Bootstrap e jQuery, e mantida por sete anos com edições direto no código. Os projetos não tinham endereço próprio, os créditos ficavam em texto livre espalhados por cards, modais e até caixas de confirmação do navegador, e os registros do INPI eram uma montagem de imagens dos certificados, sem número que se pudesse copiar ou ligar ao projeto. Quem avalia o laboratório de fora, como gestores, parceiros e instituições, não conseguia entender rapidamente o que foi produzido, por quem e como conferir.","lapinf","projects\u002Fpt\u002Flapinf","Site do Laboratório de Práticas de Computação da UFN.",[210,37,211,157,101,212,46],"Vue 3","Vite SSG","Pages CMS","2WXuN9w2uwqwBM0HcO3tjIPvyfLXiG5eNSLoNj0W-8A",{"id":215,"title":216,"accessNote":105,"contribution":217,"cover":218,"coverAlt":219,"dataModel":105,"description":220,"extension":66,"facts":221,"gallery":227,"highlights":234,"links":244,"meta":252,"order":253,"problem":254,"requirements":105,"slug":255,"stem":256,"summary":257,"tags":258,"__hash__":263},"projects\u002Fprojects\u002Fpt\u002Ffuse-ui.yml","FUSE UI","Defini a arquitetura do monorepo e a camada dupla de design tokens (primitivos e semânticos em CSS), e escrevi 82 componentes e 26 blocos sobre as primitivas acessíveis do Reka UI, com variantes em CVA, além de gráficos e composables. Publiquei a CLI no npm e mantenho o Storybook de desenvolvimento, a documentação bilíngue em Nuxt, com tabela de props gerada a partir do código-fonte e um gerador de temas, os 117 arquivos de teste em Vitest e o versionamento por Changesets.","\u002Fprojetos\u002Ffuse-ui-calendar.webp","Documentação do FUSE UI mostrando o componente Event Calendar em modo mês","Biblioteca de componentes Vue 3 no modelo registry\u002FCLI, em que o comando copia o código-fonte para dentro do projeto. Quem usa é dono do componente e pode editá-lo.",[222,224,225],{"label":112,"value":223},"Autor e mantenedor",{"label":115,"value":116},{"label":118,"value":226},"Biblioteca de componentes",[228,231],{"src":229,"caption":230,"w":124,"h":125},"\u002Fprojetos\u002Ffuse-ui-button.webp","Cada componente documenta preview, comando de instalação, uso, referência de props e notas de acessibilidade.",{"src":232,"caption":233,"w":124,"h":125},"\u002Fprojetos\u002Ffuse-ui-docs.webp","A documentação é um site Nuxt com busca, tema claro e escuro, e conteúdo em português e inglês.",[235,238,241],{"value":236,"label":237},"82","componentes no registry",{"value":239,"label":240},"26","blocos prontos para copiar",{"value":242,"label":243},"117","arquivos de teste em Vitest",[245,249],{"label":246,"href":247,"icon":248},"Ver documentação","https:\u002F\u002Ffuseui.overclk.tech","ri:book-open-line",{"label":250,"href":251,"icon":148},"Ver no npm","https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@overclock\u002Ffuse-ui",{},3,"Bibliotecas instaladas como dependência resolvem o começo e atrapalham o resto, porque qualquer customização vira gambiarra por cima do CSS de outra pessoa. O FUSE UI inverte essa lógica e o componente entra no repositório de quem usa, com tokens de design que permitem retematizar tudo sem tocar em um componente sequer.","fuse-ui","projects\u002Fpt\u002Ffuse-ui","Componentes Vue que o comando copia para dentro do seu projeto.",[210,37,259,157,260,261,42,262],"Reka UI","CVA","Vitest","Changesets","BgQKl-h407LMnL0BswySibBQa6bbBaqk20JDGNq8fcE",{"id":265,"title":266,"accessNote":105,"contribution":267,"cover":268,"coverAlt":269,"dataModel":105,"description":270,"extension":66,"facts":271,"gallery":277,"highlights":281,"links":291,"meta":295,"order":296,"problem":297,"requirements":298,"slug":316,"stem":317,"summary":318,"tags":319,"__hash__":325},"projects\u002Fprojects\u002Fpt\u002Fdumphere.yml","Dumphere","A primeira versão, de março de 2026, usava o Laravel Reverb com Echo para eventos de presença ao lado de um servidor Yjs que guardava as salas só em memória, com deploy em Docker. Em julho reescrevi a sincronização para depender só do Yjs, com o servidor Node exigindo um token assinado pelo Laravel e persistindo snapshots no PostgreSQL, troquei o Docker pelo deploy com o Laravel Forge e passei de 2 para 31 arquivos de teste. A edição rica usa Tiptap, com cache local por documento no IndexedDB. No servidor, o HTML é sanitizado antes de persistir, criação e conexões têm rate limit por IP e um scheduler remove documentos sem acesso há 30 dias. A interface é bilíngue e coberta por testes Pest. Também avaliei a camada de sincronização em um artigo, comparando-a com transformação operacional e com a substituição periódica do documento inteiro, modelo comum em editores por endereço. Com clientes automatizados digitando ao mesmo tempo, o Dumphere preservou 100% das palavras em todas as condições, inclusive durante desconexões, enquanto a substituição integral chegou a manter só 13% a 15% com oito clientes.","\u002Fprojetos\u002Fdumphere-editor.webp","Editor do Dumphere com documento em Markdown, bloco de código e cursor de outro participante","Editor público de documentos com colaboração em tempo real, experiência offline e compartilhamento por URL, sem exigir conta.",[272,274,275],{"label":112,"value":273},"Concepção, arquitetura e desenvolvimento",{"label":115,"value":116},{"label":118,"value":276},"Produto próprio",[278],{"src":279,"caption":280,"w":124,"h":125},"\u002Fprojetos\u002Fdumphere-home.webp","Na página inicial, o endereço é o próprio mecanismo de criação e compartilhamento.",[282,285,288],{"value":283,"label":284},"100%","das palavras preservadas com 8 clientes simultâneos",{"value":286,"label":287},"~101 ms","de mediana até outro cliente ver a edição, com 100 ms de ida e volta",{"value":289,"label":290},"30 dias","expiração automática de páginas sem acesso",[292],{"label":293,"href":294,"icon":148},"Abrir o Dumphere","https:\u002F\u002Fdumphere.app",{},4,"Abrir um espaço compartilhado para escrever costuma custar uma conta, um convite e uma configuração de permissões. O Dumphere reduz tudo isso a escolher um endereço. O primeiro acesso cria a página e qualquer pessoa com o link já edita junto.",[299,308],{"title":300,"items":301},"Funcionais",[302,303,304,305,306,307],"Criar a página no primeiro acesso a um caminho válido, com até quatro segmentos e 100 caracteres.","Editar ao mesmo tempo no modo visual ou na fonte Markdown, com cursores e presença dos participantes.","Mostrar o estado da conexão e do salvamento.","Manter o conteúdo no navegador durante quedas de rede e sincronizar quando a conexão voltar.","Exportar o documento em Markdown ou HTML.","Remover a página após 30 dias sem acesso.",{"title":309,"items":310},"Não funcionais",[311,312,313,314,315],"Funcionar sem conta, autenticação ou coleta deliberada de dados pessoais.","Sanitizar o HTML no servidor e limitá-lo a 512 KB, com limite de 2 MB para o snapshot colaborativo.","Limitar por IP a criação de documentos, as requisições e as conexões colaborativas.","Manter o conteúdo dos documentos e os tokens de conexão fora dos logs.","Atender ao WCAG 2.2 AA nos temas claro e escuro, em português e inglês.","dumphere","projects\u002Fpt\u002Fdumphere","Editor colaborativo em tempo real que não pede conta.",[320,321,210,322,323,43,324],"Laravel 13","Inertia","Tiptap","Yjs","Pest","1qdsf6muLo_0nZskzoCFGUweEYSxoCSbkgTtpjyPYno",{"id":327,"title":328,"accessNote":329,"contribution":330,"cover":331,"coverAlt":332,"dataModel":333,"description":339,"extension":66,"facts":340,"gallery":347,"highlights":351,"links":361,"meta":362,"order":363,"problem":364,"requirements":365,"slug":382,"stem":383,"summary":384,"tags":385,"__hash__":388},"projects\u002Fprojects\u002Fpt\u002Fclips.yml","Clips","Repositório privado","A primeira versão, de dezembro de 2025, foi feita em Next.js com Prisma e já resolvia o mês de um bolsista, mas não tinha convites nem administração de usuários. Em 2026 reescrevi a aplicação em Laravel com Inertia e Vue e cobri as regras com 68 testes em Pest e 15 em Vitest. O botão de completar o mês lança a grade semanal nos dias em que ela vale e preenche cada dia útil até a meta com as atividades padrão, em rodízio pela prioridade, sem nunca alterar um lançamento manual. A meta considera feriados nacionais e os cadastrados pelo bolsista, e o relatório em PDF lista apenas os dias úteis. O acesso é só por convite, com administração de usuários, e o deploy acontece pelo Laravel Forge depois que os testes passam no CI.","\u002Fprojetos\u002Fclips-mes.webp","Calendário do mês no Clips, com as horas lançadas em cada dia útil e o total de 84 horas cumprido",{"src":334,"srcDark":335,"caption":336,"w":337,"h":338},"\u002Fprojetos\u002Fclips-er.webp","\u002Fprojetos\u002Fclips-er-dark.webp","Cada bolsista tem seus lançamentos, sua grade semanal, suas atividades padrão e seus feriados, e o convite fica separado da conta até a senha ser criada.",2088,1068,"Sistema web em que o bolsista registra as horas da bolsa, completa o mês automaticamente a partir da grade semanal e das atividades padrão e baixa o relatório mensal em PDF.",[341,343,345],{"label":112,"value":342},"Concepção e desenvolvimento",{"label":115,"value":344},"2025 – 2026",{"label":118,"value":346},"Sistema web",[348],{"src":349,"caption":350,"w":124,"h":125},"\u002Fprojetos\u002Fclips-atividades.webp","As atividades padrão preenchem os dias úteis em rodízio. A prioridade alta entra três vezes, a média duas e a baixa uma.",[352,355,358],{"value":353,"label":354},"1 clique","para completar o mês",{"value":356,"label":357},"PDF","relatório mensal pronto para entregar",{"value":359,"label":360},"Por convite","acesso controlado por administradores",[],{},5,"Todo mês o bolsista precisa entregar um relatório com as horas cumpridas, dia a dia, até atingir a carga horária da bolsa. Montar isso à mão em planilha toma tempo e é fácil errar a conta de dias úteis, feriados e meta mensal.",[366,373],{"title":300,"items":367},[368,369,370,371,372],"Cadastrar os dados da bolsa, a grade semanal com período de validade, as atividades padrão com prioridade e os feriados próprios.","Lançar as atividades de cada dia com horário de início e fim.","Completar o mês com a grade semanal e as atividades padrão, primeiro de manhã e depois à tarde.","Gerar o relatório mensal em PDF.","Convidar pessoas por e-mail, com link para criar a senha válido por 7 dias, e bloquear ou desbloquear o acesso.",{"title":374,"items":375},"Regras de negócio",[376,377,378,379,380,381],"A meta diária é a carga horária semanal dividida por 5, e a meta do mês é a meta diária vezes os dias úteis.","Dias úteis vão de segunda a sexta, exceto feriados nacionais e os cadastrados pelo bolsista.","O preenchimento automático nunca altera nem sobrepõe um lançamento manual.","A prioridade define quantas vezes cada atividade padrão é usada (alta 3, média 2, baixa 1).","O relatório lista apenas os dias úteis, e horas em fins de semana e feriados ficam fora do total.","Não existe cadastro aberto.","clips","projects\u002Fpt\u002Fclips","Registro de horas e relatório mensal de bolsistas.",[320,386,210,37,387,157,43,324],"Inertia 3","PrimeVue 5","H-00tfrQ1Zdn3kjGkuhMVVzq-aGz2bvb4XubQatlPvI",{"id":390,"title":391,"accessNote":105,"contribution":392,"cover":393,"coverAlt":394,"dataModel":105,"description":395,"extension":66,"facts":396,"gallery":402,"highlights":414,"links":424,"meta":429,"order":430,"problem":431,"requirements":105,"slug":432,"stem":433,"summary":434,"tags":435,"__hash__":443},"projects\u002Fprojects\u002Fpt\u002Faether.yml","AETHER","Construí um pipeline reproduzível de curadoria, treino, comparação e explicabilidade sobre 5.860 estruturas do Catalysis Hub, avaliado em duas partições, uma aleatória e outra que separa as composições do bulk entre treino e teste, para medir a generalização para materiais que o modelo não viu. Comparei quatro abordagens no mesmo dado (descritores físico-químicos com Extra Trees, SchNet treinada do zero, uma cabeça MLP sobre o MACE-MP-0 pré-treinado e congelado e Extra Trees sobre os embeddings do MACE), reportando média e desvio sobre 5 seeds. A seleção de descritores com SHAP é feita sem vazamento do conjunto de teste, e a diferença de MAE entre os modelos vem com intervalo de confiança por bootstrap. O melhor resultado, um ensemble de 5 SchNets, chega a R² de 0,9734 e MAE de 0,0585 eV. Os modelos são servidos por uma API FastAPI com interface em Vue 3, que estima o ΔG_H de uma estrutura, e o registro do software no INPI está em andamento.","\u002Fprojetos\u002Faether-compare.webp","Tela de comparação do AETHER com as métricas dos quatro modelos lado a lado","Pipeline de IA para estimar a energia de adsorção de hidrogênio e apoiar a triagem de catalisadores para produção de hidrogênio verde.",[397,399,400],{"label":112,"value":398},"Autor da pesquisa e do pipeline",{"label":115,"value":344},{"label":118,"value":401},"Dissertação de mestrado",[403,406,410],{"src":404,"caption":405,"w":124,"h":125},"\u002Fprojetos\u002Faether-triagem.webp","A triagem começa numa tabela periódica que só habilita os elementos presentes na base, e ranqueia os candidatos pela proximidade do ótimo de Sabatier.",{"src":407,"caption":408,"w":124,"h":409},"\u002Fprojetos\u002Faether-abstract.webp","O desenho do estudo, da adsorção calculada por DFT ao transfer learning e à triagem final de candidatos.",984,{"src":411,"caption":412,"w":124,"h":413},"\u002Fprojetos\u002Faether-parity.webp","Paridade predito × DFT para as quatro abordagens no mesmo conjunto de teste. É a comparação que sustenta a conclusão.",656,[415,418,421],{"value":416,"label":417},"5.860","estruturas curadas",{"value":419,"label":420},"0,9734","R² do melhor ensemble",{"value":422,"label":423},"5 seeds","avaliação reproduzível",[425],{"label":426,"href":427,"icon":428},"Ver código e pesquisa","https:\u002F\u002Fgithub.com\u002Fmauricioprb\u002Faether","ri:github-line",{},6,"Descobrir catalisadores para a reação de evolução de hidrogênio por cálculo de DFT é caro e lento. A pergunta prática é se um modelo pré-treinado em milhões de estruturas consegue substituir esse cálculo com erro aceitável, e se essa vantagem se sustenta quando o experimento é repetido com seeds diferentes.","aether","projects\u002Fpt\u002Faether","IA para triagem de catalisadores de hidrogênio verde.",[436,437,438,439,440,441,442],"Python","PyTorch","PyTorch Geometric","MACE","SchNet","SHAP","FastAPI","gr06OdENtOT50UbTUHPbNWwAjIyEg0SjFtbvQgRLFA4",{"id":445,"title":446,"accessNote":105,"contribution":447,"cover":448,"coverAlt":449,"dataModel":450,"description":456,"extension":66,"facts":457,"gallery":464,"highlights":468,"links":478,"meta":482,"order":483,"problem":484,"requirements":485,"slug":501,"stem":502,"summary":503,"tags":504,"__hash__":511},"projects\u002Fprojects\u002Fpt\u002Fcategoriza-brasil.yml","Categoriza Brasil","Desenvolvi a plataforma como um monólito modular em Laravel, com seis domínios separados (site público, painel administrativo, identidade, contas, clientes de aplicação e área institucional). A peça central é o cadastro de estabelecimentos integrado à API do Google Places. A busca com autocomplete traz nome, endereço quebrado em campos, coordenadas, telefone, site e foto de capa, e ainda traduz as categorias do Google para as categorias sanitárias da plataforma. Arrastar o marcador no mapa dispara geocodificação reversa. A primeira versão da interface usava Vue com Pinia, e migrei tudo para Livewire 4, o que removeu cerca de 2 mil linhas e deixou a aplicação em uma única stack. Também construí o CMS de publicações e mídia com storage S3, o mapa público com clusterização em Leaflet e a camada de segurança, com CSP, rate limit no login e no cadastro, upload validado pelo conteúdo do arquivo, verificação de e-mail por PIN e registro das ações administrativas. Em produção, a aplicação se recusa a subir contra um banco sem migrações e bloqueia comandos que apagariam um banco que não seja local.","\u002Fprojetos\u002Fcategoriza-home.webp","Página inicial do Categoriza Brasil com os selos A, B e C de qualidade sanitária",{"src":451,"srcDark":452,"caption":453,"w":454,"h":455},"\u002Fprojetos\u002Fcategoriza-er.webp","\u002Fprojetos\u002Fcategoriza-er-dark.webp","Estabelecimentos, notícias, publicações, páginas e mídia registram quem os criou, e o log de auditoria guarda o id e o nome do usuário sem chave estrangeira, então o registro permanece mesmo se a conta for excluída.",2296,1168,"Ecossistema para classificação sanitária de serviços de alimentação, conectando conteúdo público, estabelecimentos e gestão institucional.",[458,460,462],{"label":112,"value":459},"Desenvolvimento full stack",{"label":115,"value":461},"2023 – 2025",{"label":118,"value":463},"Plataforma pública",[465],{"src":466,"caption":467,"w":124,"h":125},"\u002Fprojetos\u002Fcategoriza-mapa.webp","Mapa de georreferenciamento com clusterização, filtros por selo e localização, e a lista sincronizada com a viewport.",[469,472,475],{"value":470,"label":471},"6","domínios no mesmo monólito",{"value":473,"label":474},"1 busca","preenche o cadastro do estabelecimento",{"value":476,"label":477},"−2 mil","linhas na troca de Vue por Livewire",[479],{"label":480,"href":481,"icon":148},"Visitar plataforma","https:\u002F\u002Fcategorizabrasil.com.br",{},7,"A classificação sanitária de bares, restaurantes e padarias precisava sair do papel e virar informação pública consultável, sem perder o controle institucional de quem emite e mantém cada selo.",[486,495],{"title":300,"items":487},[488,489,490,491,492,493,494],"Cadastrar estabelecimentos com selo A, B ou C, categoria, endereço, coordenadas, contato, data da inspeção e foto de capa.","Preencher o cadastro pela busca do Google Places e ajustar a posição arrastando o marcador no mapa.","Mostrar ao público o mapa dos estabelecimentos publicados, com agrupamento dos marcadores.","Publicar notícias com galeria, publicações e páginas institucionais pelo painel.","Organizar a mídia em pastas, com arquivos no storage S3.","Manter uma newsletter com descadastro por link.","Criar contas com verificação de e-mail por PIN, com acesso ao painel liberado por um administrador.",{"title":309,"items":496},[497,498,499,500],"Separar os domínios em módulos dentro de um único monólito.","Aplicar CSP, rate limit no login e no cadastro e validação de uploads pelo conteúdo do arquivo.","Registrar as ações administrativas com usuário, ação, alvo e IP.","Recusar a inicialização contra um banco sem migrações e bloquear comandos destrutivos fora do ambiente local.","categoriza-brasil","projects\u002Fpt\u002Fcategoriza-brasil","Classificação sanitária de serviços de alimentação, aberta ao público.",[505,506,507,43,508,509,45,510,44],"Laravel 12","Livewire 4","Alpine.js","Google Places API","Leaflet","S3","mMMyKyYKkznACCTzI44Ks_Fgyf4GCRPpC7fg-ou4xBU",{"id":513,"title":514,"accessNote":105,"contribution":515,"cover":516,"coverAlt":517,"dataModel":105,"description":518,"extension":66,"facts":519,"gallery":524,"highlights":528,"links":537,"meta":540,"order":541,"problem":542,"requirements":105,"slug":543,"stem":544,"summary":545,"tags":546,"__hash__":547},"projects\u002Fprojects\u002Fpt\u002Flabed.yml","LABED","Criei o site do zero em 2024, como uma SPA em React com Vite, com a identidade visual do laboratório e o cadastro de membros, projetos e apoiadores. Em 2026 migrei tudo para Nuxt 4 com Tailwind CSS v4, preservando a identidade original. A migração trocou a renderização no navegador por páginas pré-renderizadas, e cada projeto passou a ter endereço próprio, com galeria de fotos e meta tags de compartilhamento, o que a SPA não tinha. Membros, projetos e apoiadores ficam em arquivos JSON tipados e editáveis pelo Pages CMS, e as animações de scroll, feitas com CSS e Lenis, respeitam a preferência por movimento reduzido.","\u002Fprojetos\u002Flabed-home.webp","Home do site do LABED com o título Laboratório de Eletrônica e Desenvolvimento","Site do Laboratório de Eletrônica e Desenvolvimento da UFN, criado para tornar projetos, membros e áreas de atuação mais fáceis de descobrir.",[520,521,523],{"label":112,"value":342},{"label":115,"value":522},"2024 – 2026",{"label":118,"value":173},[525],{"src":526,"caption":527,"w":124,"h":125},"\u002Fprojetos\u002Flabed-projetos.webp","Cada projeto do laboratório tem página própria, pré-renderizada e compartilhável.",[529,532,535],{"value":530,"label":531},"2024 → 2026","de SPA em React para Nuxt pré-renderizado",{"value":533,"label":534},"Página por projeto","endereço próprio e compartilhável",{"value":212,"label":536},"membros, projetos e apoiadores editáveis sem código",[538],{"label":147,"href":539,"icon":148},"https:\u002F\u002Fwww.labed.com.br",{},8,"O laboratório produzia robôs de combate, seguidores de linha e cabines de realidade virtual, mas nada disso era encontrável fora do Instagram. Faltava um lugar onde cada projeto tivesse endereço próprio e pudesse ser compartilhado.","labed","projects\u002Fpt\u002Flabed","Site do Laboratório de Eletrônica e Desenvolvimento da UFN.",[156,37,157,159,212],"0CILLGHIgh3N44lF3sZ2sO1nzep25apKqL6apRYJQu8","site\u002Fpt","bue2cfZVvqYhOKTLlEHD6frfbeA-Bnfv-Ugi1fWmMvo",1791995179136]