<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fabio Nobre</title>
    <description>The latest articles on DEV Community by Fabio Nobre (@fabiohcnobre).</description>
    <link>https://dev.to/fabiohcnobre</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F941079%2Fa0b7c034-0e56-4404-916d-7e6d8f07d2cd.jpg</url>
      <title>DEV Community: Fabio Nobre</title>
      <link>https://dev.to/fabiohcnobre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabiohcnobre"/>
    <language>en</language>
    <item>
      <title>O fantasma que assombra o PDF da Fecombustíveis: um robô que transforma a tributação dos combustíveis em XML</title>
      <dc:creator>Fabio Nobre</dc:creator>
      <pubDate>Tue, 27 Oct 2026 12:43:22 +0000</pubDate>
      <link>https://dev.to/fabiohcnobre/o-fantasma-que-assombra-o-pdf-da-fecombustiveis-um-robo-que-transforma-a-tributacao-dos-1b30</link>
      <guid>https://dev.to/fabiohcnobre/o-fantasma-que-assombra-o-pdf-da-fecombustiveis-um-robo-que-transforma-a-tributacao-dos-1b30</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Transparência antes de tudo:&lt;/strong&gt; este projeto usa o &lt;strong&gt;Google Gemini&lt;/strong&gt; (API fechada) para ler o PDF — não um modelo open-weight. Conto abaixo por que fiz essa escolha, onde o código &lt;em&gt;é&lt;/em&gt; aberto e o que falta para trocar por um modelo aberto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Todo mês, sem aviso de horário, aparece um PDF no site da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt;: a &lt;strong&gt;"Carga tributária estadual"&lt;/strong&gt; dos combustíveis. Ali estão o PMPF, a alíquota de ICMS, o tributo estadual e o federal de gasolina, diesel, etanol e GNV para as 27 UFs.&lt;/p&gt;

&lt;p&gt;Quem emite nota fiscal de combustível no Brasil precisa desses números para a &lt;strong&gt;Lei da Transparência&lt;/strong&gt; (o "valor aproximado dos tributos" no cupom). No nosso caso, eles alimentam o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; usado no nosso sistema de emissão fiscal. Antes, alguém abria o PDF — com as tabelas &lt;strong&gt;em imagem&lt;/strong&gt; — e digitava dezenas de valores à mão.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;&lt;a href="https://imextecnologia.github.io/tributacao/" rel="noopener noreferrer"&gt;Transparência de Tributos – Combustíveis&lt;/a&gt;&lt;/strong&gt; é o "fantasma na máquina" que faz isso sozinho:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👻 &lt;strong&gt;Assombra&lt;/strong&gt; a página da Fecombustíveis a cada 8 horas procurando o PDF novo;&lt;/li&gt;
&lt;li&gt;📄 &lt;strong&gt;Lê&lt;/strong&gt; o PDF com IA e devolve os valores por combustível e UF;&lt;/li&gt;
&lt;li&gt;🧮 &lt;strong&gt;Confere as contas&lt;/strong&gt; (PMPF × alíquota = ICMS; no GNV, PMPF × 9,25% = PIS/COFINS) e se recusa a gravar se algo não fechar;&lt;/li&gt;
&lt;li&gt;🕯️ &lt;strong&gt;Honra o passado&lt;/strong&gt;: o bloco de vigência antigo não é apagado — ele "termina" no dia anterior (ex.: até 30/09/2026) e nasce um bloco novo (01/10/2026 até 2050). O histórico de cada tributo fica preservado no XML;&lt;/li&gt;
&lt;li&gt;🔔 &lt;strong&gt;Avisa&lt;/strong&gt; por e-mail e no Discord quando a tributação muda;&lt;/li&gt;
&lt;li&gt;🌐 Publica uma página pública com os &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;tributos por estado&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minha leitura do tema: o PDF mensal é um fantasma que aparece quando quer, e a ideia foi deixar a máquina vigiando por mim — sem perder a memória dos meses anteriores, que é o que o fisco pede quando confere uma nota antiga.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gerador (passos 1–3):&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tributos por estado:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fluxo no site:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Passo 1&lt;/strong&gt; – o PDF mais recente já vem selecionado, com o XML do mês anterior como base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passo 2&lt;/strong&gt; – a IA extrai os valores; o que mudou fica &lt;strong&gt;amarelo&lt;/strong&gt; (com o valor antigo embaixo) e conta que não fecha ganha &lt;strong&gt;borda vermelha&lt;/strong&gt;. Tudo é editável na tabela.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passo 3&lt;/strong&gt; – &lt;em&gt;Gerar XML&lt;/em&gt;, &lt;em&gt;Baixar XML&lt;/em&gt; e, se quiser, &lt;em&gt;Baixar Excel&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/imextecnologia" rel="noopener noreferrer"&gt;
        imextecnologia
      &lt;/a&gt; / &lt;a href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;
        tributacao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tributacao
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Transparência de Tributos – Combustíveis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Site estático (GitHub Pages) que gera todo mês o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; a partir do PDF
"Carga tributária estadual" da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="nofollow noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt; · &lt;strong&gt;Tributos por estado:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Como funciona&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Busca do PDF&lt;/strong&gt; – a cada 8 horas um workflow procura o PDF novo na página da Fecombustíveis, salva em &lt;code&gt;pdf/&lt;/code&gt;
e já gera o XML do mês em &lt;code&gt;xml/&lt;/code&gt; (veja &lt;a href="https://github.com/imextecnologia/tributacao#busca-autom%C3%A1tica-do-pdf" rel="noopener noreferrer"&gt;Busca automática do PDF&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura com IA&lt;/strong&gt; – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação&lt;/strong&gt; – os valores são comparados com o XML do mês anterior (em &lt;code&gt;xml/&lt;/code&gt;) e o que mudou fica destacado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração&lt;/strong&gt; – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado
um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão
Também é possível baixar uma planilha…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sem servidor.&lt;/strong&gt; É um site estático no GitHub Pages; tudo roda no navegador ou num job do GitHub Actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Busca automática&lt;/strong&gt; (&lt;code&gt;.github/workflows/buscar-pdf.yml&lt;/code&gt;, cron &lt;code&gt;0 */8 * * *&lt;/code&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;scripts/buscar-pdf.js&lt;/code&gt; lê a página da Fecombustíveis e pega o link do PDF mais recente pela data no nome ("10 OUTUBRO 2026" vem antes de "01 OUTUBRO 2026"). Se a página falhar, tenta o link no padrão do mês atual e do próximo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/gerar-xml.js&lt;/code&gt; gera o XML do PDF novo usando &lt;strong&gt;o mesmo prompt, produtos e UFs do &lt;code&gt;index.html&lt;/code&gt;&lt;/strong&gt; — o script extrai essas constantes direto do HTML, então site e robô nunca divergem.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/buscar-painel.js&lt;/code&gt; relê o quadro oficial de percentuais e atualiza &lt;code&gt;painel.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Se algo mudou: commit, publicação do site e aviso por e-mail/Discord com o diff.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;A IA.&lt;/strong&gt; O PDF vai para o Gemini com um prompt que pede &lt;strong&gt;somente JSON&lt;/strong&gt; num formato fixo (gasolina/diesel com valor único; etanol e GNV por UF). O site tenta uma lista de modelos em ordem (&lt;code&gt;gemini-flash-latest&lt;/code&gt; → &lt;code&gt;gemini-flash-lite-latest&lt;/code&gt; → &lt;code&gt;gemini-2.5-flash&lt;/code&gt; → &lt;code&gt;gemini-2.5-flash-lite&lt;/code&gt;), com nova tentativa em 429/503.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A rede de segurança importa mais que o modelo.&lt;/strong&gt; IA lendo tabela em imagem erra dígito. Por isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// PMPF × alíquota precisa bater com o ICMS (etanol no MT usa base de 50%)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;etanol&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uf&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pmpf&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pmpf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aliquota&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;estadual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.0015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;estadual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// GNV: PIS/COFINS = PMPF × 9,25%&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gnv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pmpf&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.0925&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;federal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.0015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;federal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Actions, se qualquer conta não fecha, o XML &lt;strong&gt;não é gravado&lt;/strong&gt; — o aviso pede revisão humana no site, e as execuções seguintes tentam de novo. Uma alucinação nunca vira nota fiscal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Economia de chamadas:&lt;/strong&gt; se o XML do mês já existe em &lt;code&gt;xml/&lt;/code&gt;, o site carrega direto; o resultado da IA fica salvo no navegador, então recarregar a página não chama o modelo de novo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Sendo honesto: &lt;strong&gt;a parte de IA aqui não é aberta.&lt;/strong&gt; Escolhi o Gemini porque o plano gratuito lê PDF com tabela em imagem de forma confiável, não exige cartão e o volume é mínimo (uma leitura por mês). Para um site estático sem servidor, isso resolveu.&lt;/p&gt;

&lt;p&gt;Mas o projeto mostra exatamente onde um caminho fechado incomoda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A chave fica exposta&lt;/strong&gt; no &lt;code&gt;index.html&lt;/code&gt; publicado (restrita por referenciador e API, mas ainda assim pública). Um modelo local não teria chave nenhuma.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependência de fornecedor:&lt;/strong&gt; precisei de uma lista de &lt;em&gt;fallbacks&lt;/em&gt; porque modelos somem ou mudam de nome. Um modelo open-weight com versão fixa daria &lt;strong&gt;a mesma resposta amanhã&lt;/strong&gt; — algo valioso quando o resultado vai para documento fiscal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dados:&lt;/strong&gt; no plano gratuito o Google pode usar o conteúdo enviado. Hoje só vai o PDF público da Fecombustíveis, então não há problema — mas eu não poderia fazer o mesmo com documentos de clientes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O que &lt;strong&gt;é&lt;/strong&gt; aberto: todo o código, o workflow, as regras de validação e o histórico de XMLs estão no GitHub, públicos. Qualquer posto, contador ou software fiscal pode copiar, auditar as contas ou usar os XMLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Próximo passo:&lt;/strong&gt; como o prompt já pede JSON estrito e a validação aritmética independe do modelo, a troca é isolada numa função (&lt;code&gt;chamarGemini&lt;/code&gt;). O plano é testar um modelo de visão open-weight (por exemplo, Gemma) rodando dentro do próprio GitHub Actions ou localmente e comparar a taxa de "contas que não fecham" com o Gemini.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;No Día de los Muertos a gente lembra quem veio antes. No XML de tributos, nada é apagado: cada mês que passa vira um bloco com data de fim, e o novo começa no dia seguinte. Quando alguém abrir uma nota de setembro daqui a cinco anos, os valores de setembro ainda estarão lá.&lt;/p&gt;

&lt;p&gt;E o fantasma? Ele aparece às 21h, 5h e 13h (horário de Brasília), olha a página, e na maioria das vezes vai embora em silêncio. Quando a tributação muda, ele deixa um recado no Discord. 👻&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot&lt;/strong&gt; — a automação inteira (busca, geração do XML, publicação e avisos) roda em GitHub Actions.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>githubactions</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Deixei a IA ler o PDF de tributos dos combustíveis por mim todo mês</title>
      <dc:creator>Fabio Nobre</dc:creator>
      <pubDate>Wed, 21 Oct 2026 16:07:24 +0000</pubDate>
      <link>https://dev.to/fabiohcnobre/deixei-a-ia-ler-o-pdf-de-tributos-dos-combustiveis-por-mim-todo-mes-1f39</link>
      <guid>https://dev.to/fabiohcnobre/deixei-a-ia-ler-o-pdf-de-tributos-dos-combustiveis-por-mim-todo-mes-1f39</guid>
      <description>&lt;p&gt;&lt;em&gt;Esta é uma submissão para o &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge: Week 3, "Slow and Steady"&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que eu construí
&lt;/h2&gt;

&lt;p&gt;Todo mês a Fecombustíveis publica um PDF com a carga tributária estadual dos combustíveis: PMPF, alíquota de ICMS, PIS/COFINS, por produto e por estado. E todo mês alguém precisa abrir esse PDF, conferir número por número e transformar aquilo no XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; que o sistema de emissão fiscal consome.&lt;/p&gt;

&lt;p&gt;Esse "alguém" era eu. Então construí o &lt;strong&gt;tributacao&lt;/strong&gt;: um site estático que pega o PDF do mês, usa IA para extrair os valores por combustível e UF, compara com o XML do mês anterior e gera novos blocos de vigência só para os combustíveis cujos valores mudaram.&lt;/p&gt;

&lt;p&gt;Além do XML, ele oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exportação para Excel&lt;/strong&gt;, para quem prefere conferir em planilha;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uma página pública com os tributos por estado&lt;/strong&gt;, para consulta rápida;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checagens de consistência&lt;/strong&gt;: o site sinaliza valores que não fecham (PMPF × alíquota vs. ICMS, e PMPF × 9,25% vs. PIS/COFINS no caso do GNV), para a revisão humana focar onde importa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os produtos ANP mapeados são gasolina C, gasolina premium, etanol hidratado, diesel S-500, diesel S-10 e GNV. O que não está mapeado fica intocado no XML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gerador de XML: &lt;a href="https://imextecnologia.github.io/tributacao/" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Painel de tributos por estado: &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Código
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/imextecnologia" rel="noopener noreferrer"&gt;
        imextecnologia
      &lt;/a&gt; / &lt;a href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;
        tributacao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tributacao
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Transparência de Tributos – Combustíveis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Site estático (GitHub Pages) que gera todo mês o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; a partir do PDF
"Carga tributária estadual" da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="nofollow noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt; · &lt;strong&gt;Tributos por estado:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Como funciona&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Busca do PDF&lt;/strong&gt; – a cada 8 horas um workflow procura o PDF novo na página da Fecombustíveis, salva em &lt;code&gt;pdf/&lt;/code&gt;
e já gera o XML do mês em &lt;code&gt;xml/&lt;/code&gt; (veja &lt;a href="https://github.com/imextecnologia/tributacao#busca-autom%C3%A1tica-do-pdf" rel="noopener noreferrer"&gt;Busca automática do PDF&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura com IA&lt;/strong&gt; – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação&lt;/strong&gt; – os valores são comparados com o XML do mês anterior (em &lt;code&gt;xml/&lt;/code&gt;) e o que mudou fica destacado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração&lt;/strong&gt; – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado
um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão
Também é possível baixar uma planilha…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Como eu construí
&lt;/h2&gt;

&lt;p&gt;A arquitetura é propositalmente simples, para não ter servidor para manter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Front-end estático&lt;/strong&gt; (HTML, CSS e JavaScript) hospedado no &lt;strong&gt;GitHub Pages&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extração com IA&lt;/strong&gt;: o PDF é enviado ao &lt;strong&gt;Google Gemini&lt;/strong&gt;, que devolve os valores estruturados por combustível e estado. PDF tabular de órgão público é exatamente o tipo de documento em que regex quebra a cada mudança de layout, e um modelo multimodal lida bem com isso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diff inteligente&lt;/strong&gt;: em vez de regerar tudo, o script compara com o XML do mês anterior e cria vigências novas apenas onde houve alteração. Isso mantém o histórico limpo e facilita a auditoria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automação com GitHub Actions&lt;/strong&gt;: um workflow roda a cada 8 horas, verifica se saiu PDF novo, gera o XML, atualiza os dados do painel e manda alerta por e-mail e Discord quando algo muda. Os segredos de alerta são opcionais; sem eles o workflow roda do mesmo jeito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripts Node&lt;/strong&gt; em &lt;code&gt;scripts/&lt;/code&gt; para buscar o PDF, gerar o XML e montar os assets. PDFs e XMLs de cada mês ficam versionados em &lt;code&gt;pdf/&lt;/code&gt; e &lt;code&gt;xml/&lt;/code&gt;, e &lt;code&gt;exemplos/&lt;/code&gt; traz um par de referência.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para rodar localmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node scripts/gerar-arquivos.js
npx http-server &lt;span class="nt"&gt;-p&lt;/span&gt; 5500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Uma lição sobre chave de API em site estático
&lt;/h3&gt;

&lt;p&gt;Num site 100% estático, a chave do Gemini acaba visível no código-fonte da página. A mitigação que adotei e documentei no README é restringir a chave por &lt;strong&gt;HTTP referrer&lt;/strong&gt; e somente à &lt;strong&gt;Generative Language API&lt;/strong&gt;. Se você for copiar a ideia, faça isso antes de publicar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que a inovação aberta importa?
&lt;/h2&gt;

&lt;p&gt;Sendo transparente: o modelo que uso hoje (Gemini) é fechado. O que é aberto aqui é todo o resto, e é justamente isso que torna o projeto útil:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O código é público.&lt;/strong&gt; Qualquer posto, distribuidora ou software house que precise do mesmo XML pode usar, auditar ou adaptar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Os dados são públicos e versionados.&lt;/strong&gt; Cada PDF e cada XML gerado ficam no repositório, então dá para ver exatamente o que mudou de um mês para o outro e quando.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A camada de IA é substituível.&lt;/strong&gt; A extração é uma etapa isolada do pipeline. Trocar o Gemini por um modelo open-weight rodando localmente é o próximo passo natural, e eliminaria de vez o problema da chave exposta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tributação é assunto de interesse público. Uma ferramenta que traduz um PDF oficial em dados estruturados deveria ser aberta, verificável e fácil de reproduzir.&lt;/p&gt;

&lt;h2&gt;
  
  
  A recompensa da preguiça
&lt;/h2&gt;

&lt;p&gt;Antes: baixar o PDF, abrir lado a lado com o XML do mês passado, conferir estado por estado, editar vigências na mão e torcer para não ter errado uma casa decimal.&lt;/p&gt;

&lt;p&gt;Agora: o GitHub Actions percebe o PDF novo sozinho, gera o XML, e eu só recebo um aviso no Discord. Minha parte é revisar os valores que o próprio site destacou como inconsistentes. A IA faz o trabalho chato; eu fico com a decisão.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Transparência de Tributos dos Combustíveis: do PDF da Fecombustíveis ao XML do PDV, sem servidor</title>
      <dc:creator>Fabio Nobre</dc:creator>
      <pubDate>Fri, 16 Oct 2026 19:35:08 +0000</pubDate>
      <link>https://dev.to/fabiohcnobre/transparencia-de-tributos-dos-combustiveis-do-pdf-da-fecombustiveis-ao-xml-do-pdv-sem-servidor-159b</link>
      <guid>https://dev.to/fabiohcnobre/transparencia-de-tributos-dos-combustiveis-do-pdf-da-fecombustiveis-ao-xml-do-pdv-sem-servidor-159b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que eu construí
&lt;/h2&gt;

&lt;p&gt;Todo posto de combustível no Brasil precisa mostrar na nota/cupom quanto do preço é imposto (Lei 12.741/2012, a "Lei da Transparência"). Para combustíveis, os valores de ICMS, PMPF e PIS/COFINS mudam por estado e por mês, e a referência que todo mundo usa é o PDF &lt;strong&gt;"Carga tributária estadual"&lt;/strong&gt; publicado pela Fecombustíveis.&lt;/p&gt;

&lt;p&gt;O problema: alguém precisa abrir esse PDF todo mês, conferir 27 UFs × 6 combustíveis e redigitar tudo no arquivo &lt;code&gt;TransparenciaTributos.xml&lt;/code&gt; que o sistema de PDV lê. É trabalho chato, manual e fácil de errar.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Transparência de Tributos – Combustíveis&lt;/strong&gt; automatiza isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a cada 8 horas um workflow do GitHub Actions procura o PDF novo no site da Fecombustíveis;&lt;/li&gt;
&lt;li&gt;uma IA lê o PDF e devolve os valores por combustível e UF;&lt;/li&gt;
&lt;li&gt;o sistema compara com o XML do mês anterior, destaca o que mudou e confere as contas (PMPF × alíquota = ICMS; PMPF × 9,25% = PIS/COFINS no GNV);&lt;/li&gt;
&lt;li&gt;gera o XML novo — fechando o bloco antigo no dia anterior e abrindo um bloco novo de vigência só para os combustíveis que mudaram;&lt;/li&gt;
&lt;li&gt;publica tudo e avisa por e-mail e Discord.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quem pagaria por isso?&lt;/strong&gt; Software houses de automação comercial que atendem postos (como a Imex Tecnologia, onde isso nasceu) e redes de postos que hoje fazem essa atualização na mão. É um nicho pequeno, específico e com uma dor recorrente todo mês — exatamente o tipo de "side hustle" que vira serviço por assinatura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gerador do XML: &lt;a href="https://imextecnologia.github.io/tributacao/" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tributos por estado (atualiza sozinha a partir do XML mais recente): &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Código
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/imextecnologia" rel="noopener noreferrer"&gt;
        imextecnologia
      &lt;/a&gt; / &lt;a href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;
        tributacao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tributacao
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Transparência de Tributos – Combustíveis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Site estático (GitHub Pages) que gera todo mês o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; a partir do PDF
"Carga tributária estadual" da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="nofollow noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt; · &lt;strong&gt;Tributos por estado:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Como funciona&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Busca do PDF&lt;/strong&gt; – a cada 8 horas um workflow procura o PDF novo na página da Fecombustíveis, salva em &lt;code&gt;pdf/&lt;/code&gt;
e já gera o XML do mês em &lt;code&gt;xml/&lt;/code&gt; (veja &lt;a href="https://github.com/imextecnologia/tributacao#busca-autom%C3%A1tica-do-pdf" rel="noopener noreferrer"&gt;Busca automática do PDF&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura com IA&lt;/strong&gt; – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação&lt;/strong&gt; – os valores são comparados com o XML do mês anterior (em &lt;code&gt;xml/&lt;/code&gt;) e o que mudou fica destacado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração&lt;/strong&gt; – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado
um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão
Também é possível baixar uma planilha…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Como eu construí
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Site 100% estático no GitHub Pages&lt;/strong&gt; — HTML + JS puro, sem framework e sem servidor próprio. Tudo roda no navegador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; — &lt;code&gt;buscar-pdf.yml&lt;/code&gt; roda às 00:00, 08:00 e 16:00 UTC, baixa o PDF, gera o XML com &lt;code&gt;scripts/gerar-xml.js&lt;/code&gt; (mesmas regras do site) e faz commit; &lt;code&gt;pages.yml&lt;/code&gt; publica a cada push.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura do PDF com IA&lt;/strong&gt; — hoje o projeto usa o &lt;strong&gt;Google Gemini&lt;/strong&gt; (plano gratuito), com fallback entre &lt;code&gt;gemini-flash-latest&lt;/code&gt;, &lt;code&gt;gemini-flash-lite-latest&lt;/code&gt;, &lt;code&gt;gemini-2.5-flash&lt;/code&gt; e &lt;code&gt;gemini-2.5-flash-lite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação antes de confiar na IA&lt;/strong&gt; — se algum valor não fecha a conta, o XML &lt;strong&gt;não&lt;/strong&gt; é gravado automaticamente; ele fica para revisão humana no site (amarelo = mudou, borda vermelha = conta não fecha). O resultado da IA fica em cache no navegador e, se o XML do mês já existe, a IA nem é chamada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que fiz nesta semana (12 a 18 de outubro)
&lt;/h3&gt;

&lt;p&gt;A Fecombustíveis publicou uma &lt;strong&gt;atualização no meio do mês&lt;/strong&gt; (10/10), além do PDF de 01/10. Isso expôs um bug: a página inicial só procurava o XML com a data &lt;em&gt;exata&lt;/em&gt; do PDF (&lt;code&gt;20261001&lt;/code&gt;) e ignorava o &lt;code&gt;20261010&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;13/10&lt;/strong&gt; — corrigi &lt;code&gt;index.html&lt;/code&gt; para usar o XML &lt;strong&gt;mais recente a partir da data do PDF&lt;/strong&gt;, comparando-o com o XML anterior a ele, sem chamar a IA de novo. Em &lt;code&gt;tributos.html&lt;/code&gt;, o link do PDF passou a apontar para o PDF mais recente &lt;strong&gt;até&lt;/strong&gt; a data do XML (já que uma atualização no meio do mês pode não ter PDF próprio).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13/10&lt;/strong&gt; — subi os PDFs/XMLs novos e ajustei o &lt;code&gt;TransparenciaTributos_20261001.xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15/10&lt;/strong&gt; — revisei e atualizei o &lt;code&gt;TransparenciaTributos_20261010.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pequeno no diff (+11/−8 linhas), mas é o tipo de caso real que só aparece quando o sistema está rodando em produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que inovação aberta importa?
&lt;/h2&gt;

&lt;p&gt;Vou ser transparente (o projeto se chama assim, afinal): &lt;strong&gt;o modelo que uso hoje não é open-weight&lt;/strong&gt; — é o Gemini via API. O que é aberto aqui é todo o resto: o código, as regras de geração do XML, os workflows e o histórico de cada XML mensal, públicos no GitHub, para qualquer posto ou software house auditar ou reaproveitar.&lt;/p&gt;

&lt;p&gt;E justamente por estar tudo aberto e desacoplado, a IA é uma peça trocável: a extração é uma única chamada que devolve JSON, e a validação das contas é feita fora do modelo. O próximo passo natural é testar um modelo open-weight (como o Gemma) nessa etapa, para não depender do plano gratuito de um provedor e poder rodar localmente. Como o PDF da Fecombustíveis é público, privacidade não é o problema — custo e independência de fornecedor são.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>githubactions</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Transparência de Tributos dos Combustíveis: do PDF da Fecombustíveis ao XML do PDV, sem servidor</title>
      <dc:creator>Fabio Nobre</dc:creator>
      <pubDate>Fri, 16 Oct 2026 19:35:05 +0000</pubDate>
      <link>https://dev.to/fabiohcnobre/transparencia-de-tributos-dos-combustiveis-do-pdf-da-fecombustiveis-ao-xml-do-pdv-sem-servidor-165p</link>
      <guid>https://dev.to/fabiohcnobre/transparencia-de-tributos-dos-combustiveis-do-pdf-da-fecombustiveis-ao-xml-do-pdv-sem-servidor-165p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que eu construí
&lt;/h2&gt;

&lt;p&gt;Todo posto de combustível no Brasil precisa mostrar na nota/cupom quanto do preço é imposto (Lei 12.741/2012, a "Lei da Transparência"). Para combustíveis, os valores de ICMS, PMPF e PIS/COFINS mudam por estado e por mês, e a referência que todo mundo usa é o PDF &lt;strong&gt;"Carga tributária estadual"&lt;/strong&gt; publicado pela Fecombustíveis.&lt;/p&gt;

&lt;p&gt;O problema: alguém precisa abrir esse PDF todo mês, conferir 27 UFs × 6 combustíveis e redigitar tudo no arquivo &lt;code&gt;TransparenciaTributos.xml&lt;/code&gt; que o sistema de PDV lê. É trabalho chato, manual e fácil de errar.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Transparência de Tributos – Combustíveis&lt;/strong&gt; automatiza isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a cada 8 horas um workflow do GitHub Actions procura o PDF novo no site da Fecombustíveis;&lt;/li&gt;
&lt;li&gt;uma IA lê o PDF e devolve os valores por combustível e UF;&lt;/li&gt;
&lt;li&gt;o sistema compara com o XML do mês anterior, destaca o que mudou e confere as contas (PMPF × alíquota = ICMS; PMPF × 9,25% = PIS/COFINS no GNV);&lt;/li&gt;
&lt;li&gt;gera o XML novo — fechando o bloco antigo no dia anterior e abrindo um bloco novo de vigência só para os combustíveis que mudaram;&lt;/li&gt;
&lt;li&gt;publica tudo e avisa por e-mail e Discord.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quem pagaria por isso?&lt;/strong&gt; Software houses de automação comercial que atendem postos (como a Imex Tecnologia, onde isso nasceu) e redes de postos que hoje fazem essa atualização na mão. É um nicho pequeno, específico e com uma dor recorrente todo mês — exatamente o tipo de "side hustle" que vira serviço por assinatura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gerador do XML: &lt;a href="https://imextecnologia.github.io/tributacao/" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tributos por estado (atualiza sozinha a partir do XML mais recente): &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Código
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/imextecnologia" rel="noopener noreferrer"&gt;
        imextecnologia
      &lt;/a&gt; / &lt;a href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;
        tributacao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tributacao
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Transparência de Tributos – Combustíveis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Site estático (GitHub Pages) que gera todo mês o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; a partir do PDF
"Carga tributária estadual" da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="nofollow noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt; · &lt;strong&gt;Tributos por estado:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Como funciona&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Busca do PDF&lt;/strong&gt; – a cada 8 horas um workflow procura o PDF novo na página da Fecombustíveis, salva em &lt;code&gt;pdf/&lt;/code&gt;
e já gera o XML do mês em &lt;code&gt;xml/&lt;/code&gt; (veja &lt;a href="https://github.com/imextecnologia/tributacao#busca-autom%C3%A1tica-do-pdf" rel="noopener noreferrer"&gt;Busca automática do PDF&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura com IA&lt;/strong&gt; – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação&lt;/strong&gt; – os valores são comparados com o XML do mês anterior (em &lt;code&gt;xml/&lt;/code&gt;) e o que mudou fica destacado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração&lt;/strong&gt; – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado
um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão
Também é possível baixar uma planilha…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Como eu construí
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Site 100% estático no GitHub Pages&lt;/strong&gt; — HTML + JS puro, sem framework e sem servidor próprio. Tudo roda no navegador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; — &lt;code&gt;buscar-pdf.yml&lt;/code&gt; roda às 00:00, 08:00 e 16:00 UTC, baixa o PDF, gera o XML com &lt;code&gt;scripts/gerar-xml.js&lt;/code&gt; (mesmas regras do site) e faz commit; &lt;code&gt;pages.yml&lt;/code&gt; publica a cada push.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura do PDF com IA&lt;/strong&gt; — hoje o projeto usa o &lt;strong&gt;Google Gemini&lt;/strong&gt; (plano gratuito), com fallback entre &lt;code&gt;gemini-flash-latest&lt;/code&gt;, &lt;code&gt;gemini-flash-lite-latest&lt;/code&gt;, &lt;code&gt;gemini-2.5-flash&lt;/code&gt; e &lt;code&gt;gemini-2.5-flash-lite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação antes de confiar na IA&lt;/strong&gt; — se algum valor não fecha a conta, o XML &lt;strong&gt;não&lt;/strong&gt; é gravado automaticamente; ele fica para revisão humana no site (amarelo = mudou, borda vermelha = conta não fecha). O resultado da IA fica em cache no navegador e, se o XML do mês já existe, a IA nem é chamada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que fiz nesta semana (12 a 18 de outubro)
&lt;/h3&gt;

&lt;p&gt;A Fecombustíveis publicou uma &lt;strong&gt;atualização no meio do mês&lt;/strong&gt; (10/10), além do PDF de 01/10. Isso expôs um bug: a página inicial só procurava o XML com a data &lt;em&gt;exata&lt;/em&gt; do PDF (&lt;code&gt;20261001&lt;/code&gt;) e ignorava o &lt;code&gt;20261010&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;13/10&lt;/strong&gt; — corrigi &lt;code&gt;index.html&lt;/code&gt; para usar o XML &lt;strong&gt;mais recente a partir da data do PDF&lt;/strong&gt;, comparando-o com o XML anterior a ele, sem chamar a IA de novo. Em &lt;code&gt;tributos.html&lt;/code&gt;, o link do PDF passou a apontar para o PDF mais recente &lt;strong&gt;até&lt;/strong&gt; a data do XML (já que uma atualização no meio do mês pode não ter PDF próprio).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13/10&lt;/strong&gt; — subi os PDFs/XMLs novos e ajustei o &lt;code&gt;TransparenciaTributos_20261001.xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15/10&lt;/strong&gt; — revisei e atualizei o &lt;code&gt;TransparenciaTributos_20261010.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pequeno no diff (+11/−8 linhas), mas é o tipo de caso real que só aparece quando o sistema está rodando em produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que inovação aberta importa?
&lt;/h2&gt;

&lt;p&gt;Vou ser transparente (o projeto se chama assim, afinal): &lt;strong&gt;o modelo que uso hoje não é open-weight&lt;/strong&gt; — é o Gemini via API. O que é aberto aqui é todo o resto: o código, as regras de geração do XML, os workflows e o histórico de cada XML mensal, públicos no GitHub, para qualquer posto ou software house auditar ou reaproveitar.&lt;/p&gt;

&lt;p&gt;E justamente por estar tudo aberto e desacoplado, a IA é uma peça trocável: a extração é uma única chamada que devolve JSON, e a validação das contas é feita fora do modelo. O próximo passo natural é testar um modelo open-weight (como o Gemma) nessa etapa, para não depender do plano gratuito de um provedor e poder rodar localmente. Como o PDF da Fecombustíveis é público, privacidade não é o problema — custo e independência de fornecedor são.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>githubactions</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Transparência de Tributos dos Combustíveis: do PDF da Fecombustíveis ao XML do PDV, sem servidor</title>
      <dc:creator>Fabio Nobre</dc:creator>
      <pubDate>Fri, 16 Oct 2026 19:35:04 +0000</pubDate>
      <link>https://dev.to/fabiohcnobre/transparencia-de-tributos-dos-combustiveis-do-pdf-da-fecombustiveis-ao-xml-do-pdv-sem-servidor-1k0</link>
      <guid>https://dev.to/fabiohcnobre/transparencia-de-tributos-dos-combustiveis-do-pdf-da-fecombustiveis-ao-xml-do-pdv-sem-servidor-1k0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que eu construí
&lt;/h2&gt;

&lt;p&gt;Todo posto de combustível no Brasil precisa mostrar na nota/cupom quanto do preço é imposto (Lei 12.741/2012, a "Lei da Transparência"). Para combustíveis, os valores de ICMS, PMPF e PIS/COFINS mudam por estado e por mês, e a referência que todo mundo usa é o PDF &lt;strong&gt;"Carga tributária estadual"&lt;/strong&gt; publicado pela Fecombustíveis.&lt;/p&gt;

&lt;p&gt;O problema: alguém precisa abrir esse PDF todo mês, conferir 27 UFs × 6 combustíveis e redigitar tudo no arquivo &lt;code&gt;TransparenciaTributos.xml&lt;/code&gt; que o sistema de PDV lê. É trabalho chato, manual e fácil de errar.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Transparência de Tributos – Combustíveis&lt;/strong&gt; automatiza isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a cada 8 horas um workflow do GitHub Actions procura o PDF novo no site da Fecombustíveis;&lt;/li&gt;
&lt;li&gt;uma IA lê o PDF e devolve os valores por combustível e UF;&lt;/li&gt;
&lt;li&gt;o sistema compara com o XML do mês anterior, destaca o que mudou e confere as contas (PMPF × alíquota = ICMS; PMPF × 9,25% = PIS/COFINS no GNV);&lt;/li&gt;
&lt;li&gt;gera o XML novo — fechando o bloco antigo no dia anterior e abrindo um bloco novo de vigência só para os combustíveis que mudaram;&lt;/li&gt;
&lt;li&gt;publica tudo e avisa por e-mail e Discord.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quem pagaria por isso?&lt;/strong&gt; Software houses de automação comercial que atendem postos (como a Imex Tecnologia, onde isso nasceu) e redes de postos que hoje fazem essa atualização na mão. É um nicho pequeno, específico e com uma dor recorrente todo mês — exatamente o tipo de "side hustle" que vira serviço por assinatura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gerador do XML: &lt;a href="https://imextecnologia.github.io/tributacao/" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tributos por estado (atualiza sozinha a partir do XML mais recente): &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Código
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/imextecnologia" rel="noopener noreferrer"&gt;
        imextecnologia
      &lt;/a&gt; / &lt;a href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;
        tributacao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tributacao
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Transparência de Tributos – Combustíveis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Site estático (GitHub Pages) que gera todo mês o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; a partir do PDF
"Carga tributária estadual" da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="nofollow noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt; · &lt;strong&gt;Tributos por estado:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Como funciona&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Busca do PDF&lt;/strong&gt; – a cada 8 horas um workflow procura o PDF novo na página da Fecombustíveis, salva em &lt;code&gt;pdf/&lt;/code&gt;
e já gera o XML do mês em &lt;code&gt;xml/&lt;/code&gt; (veja &lt;a href="https://github.com/imextecnologia/tributacao#busca-autom%C3%A1tica-do-pdf" rel="noopener noreferrer"&gt;Busca automática do PDF&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura com IA&lt;/strong&gt; – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação&lt;/strong&gt; – os valores são comparados com o XML do mês anterior (em &lt;code&gt;xml/&lt;/code&gt;) e o que mudou fica destacado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração&lt;/strong&gt; – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado
um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão
Também é possível baixar uma planilha…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Como eu construí
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Site 100% estático no GitHub Pages&lt;/strong&gt; — HTML + JS puro, sem framework e sem servidor próprio. Tudo roda no navegador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; — &lt;code&gt;buscar-pdf.yml&lt;/code&gt; roda às 00:00, 08:00 e 16:00 UTC, baixa o PDF, gera o XML com &lt;code&gt;scripts/gerar-xml.js&lt;/code&gt; (mesmas regras do site) e faz commit; &lt;code&gt;pages.yml&lt;/code&gt; publica a cada push.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura do PDF com IA&lt;/strong&gt; — hoje o projeto usa o &lt;strong&gt;Google Gemini&lt;/strong&gt; (plano gratuito), com fallback entre &lt;code&gt;gemini-flash-latest&lt;/code&gt;, &lt;code&gt;gemini-flash-lite-latest&lt;/code&gt;, &lt;code&gt;gemini-2.5-flash&lt;/code&gt; e &lt;code&gt;gemini-2.5-flash-lite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação antes de confiar na IA&lt;/strong&gt; — se algum valor não fecha a conta, o XML &lt;strong&gt;não&lt;/strong&gt; é gravado automaticamente; ele fica para revisão humana no site (amarelo = mudou, borda vermelha = conta não fecha). O resultado da IA fica em cache no navegador e, se o XML do mês já existe, a IA nem é chamada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que fiz nesta semana (12 a 18 de outubro)
&lt;/h3&gt;

&lt;p&gt;A Fecombustíveis publicou uma &lt;strong&gt;atualização no meio do mês&lt;/strong&gt; (10/10), além do PDF de 01/10. Isso expôs um bug: a página inicial só procurava o XML com a data &lt;em&gt;exata&lt;/em&gt; do PDF (&lt;code&gt;20261001&lt;/code&gt;) e ignorava o &lt;code&gt;20261010&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;13/10&lt;/strong&gt; — corrigi &lt;code&gt;index.html&lt;/code&gt; para usar o XML &lt;strong&gt;mais recente a partir da data do PDF&lt;/strong&gt;, comparando-o com o XML anterior a ele, sem chamar a IA de novo. Em &lt;code&gt;tributos.html&lt;/code&gt;, o link do PDF passou a apontar para o PDF mais recente &lt;strong&gt;até&lt;/strong&gt; a data do XML (já que uma atualização no meio do mês pode não ter PDF próprio).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13/10&lt;/strong&gt; — subi os PDFs/XMLs novos e ajustei o &lt;code&gt;TransparenciaTributos_20261001.xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15/10&lt;/strong&gt; — revisei e atualizei o &lt;code&gt;TransparenciaTributos_20261010.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pequeno no diff (+11/−8 linhas), mas é o tipo de caso real que só aparece quando o sistema está rodando em produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que inovação aberta importa?
&lt;/h2&gt;

&lt;p&gt;Vou ser transparente (o projeto se chama assim, afinal): &lt;strong&gt;o modelo que uso hoje não é open-weight&lt;/strong&gt; — é o Gemini via API. O que é aberto aqui é todo o resto: o código, as regras de geração do XML, os workflows e o histórico de cada XML mensal, públicos no GitHub, para qualquer posto ou software house auditar ou reaproveitar.&lt;/p&gt;

&lt;p&gt;E justamente por estar tudo aberto e desacoplado, a IA é uma peça trocável: a extração é uma única chamada que devolve JSON, e a validação das contas é feita fora do modelo. O próximo passo natural é testar um modelo open-weight (como o Gemma) nessa etapa, para não depender do plano gratuito de um provedor e poder rodar localmente. Como o PDF da Fecombustíveis é público, privacidade não é o problema — custo e independência de fornecedor são.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>githubactions</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Tributos de combustíveis no automático: do PDF da Fecombustíveis ao XML em minutos, com IA e GitHub Actions</title>
      <dc:creator>Fabio Nobre</dc:creator>
      <pubDate>Fri, 09 Oct 2026 14:52:17 +0000</pubDate>
      <link>https://dev.to/fabiohcnobre/tributos-de-combustiveis-no-automatico-do-pdf-da-fecombustiveis-ao-xml-em-minutos-com-ia-e-github-3e0g</link>
      <guid>https://dev.to/fabiohcnobre/tributos-de-combustiveis-no-automatico-do-pdf-da-fecombustiveis-ao-xml-em-minutos-com-ia-e-github-3e0g</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Todo mês, postos de combustível e sistemas de automação comercial no Brasil precisam atualizar a &lt;strong&gt;transparência de tributos&lt;/strong&gt; (Lei 12.741/2012): quanto de ICMS, PIS/COFINS e CIDE está embutido no litro de cada combustível, em cada estado. A fonte é o PDF "Carga tributária estadual" da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt; — e o trabalho era abrir o PDF, copiar valor por valor para 27 UFs e 6 combustíveis e montar o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; à mão.&lt;/p&gt;

&lt;p&gt;Construí um &lt;strong&gt;site estático (GitHub Pages)&lt;/strong&gt; que faz isso sozinho:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Busca do PDF&lt;/strong&gt; – um workflow do GitHub Actions procura o PDF novo a cada 12 horas e salva no repositório.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura com IA&lt;/strong&gt; – o PDF é enviado a um modelo de IA, que devolve os valores por combustível e por UF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação&lt;/strong&gt; – os valores são comparados com o XML do mês anterior; o que mudou fica em amarelo, e contas que não fecham (PMPF × alíquota ≠ ICMS) ficam com borda vermelha.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração&lt;/strong&gt; – para cada combustível que mudou, a vigência antiga é encerrada no dia anterior e um bloco novo é criado. Dá para baixar o XML e uma planilha Excel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Também há uma página pública, &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;tributos.html&lt;/a&gt;, com as tabelas por estado (Gasolina C, Gasolina Premium, Diesel S-500, Diesel S-10, Etanol hidratado e GNV) que se atualiza sozinha quando entra o XML do mês.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E o "Touch Grass"?&lt;/strong&gt; O objetivo aqui é tirar uma pessoa de uma tarefa repetitiva de tela: o que levava horas de digitação e conferência todo mês virou alguns minutos de revisão. A tela passa a ser a parte mais curta do processo — o resto do dia fica livre.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para quem é:&lt;/strong&gt; desenvolvedores de sistemas de PDV/NF-e para postos, contadores e donos de posto que precisam manter a carga tributária correta no cupom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gerador do XML: &lt;a href="https://imextecnologia.github.io/tributacao/" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tributos por estado: &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/imextecnologia" rel="noopener noreferrer"&gt;
        imextecnologia
      &lt;/a&gt; / &lt;a href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;
        tributacao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tributacao
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Transparência de Tributos – Combustíveis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Site estático (GitHub Pages) que gera todo mês o XML &lt;code&gt;TransparenciaTributos&lt;/code&gt; a partir do PDF
"Carga tributária estadual" da &lt;a href="https://www.fecombustiveis.org.br/tributacao" rel="nofollow noopener noreferrer"&gt;Fecombustíveis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/&lt;/a&gt; · &lt;strong&gt;Tributos por estado:&lt;/strong&gt; &lt;a href="https://imextecnologia.github.io/tributacao/tributos.html" rel="nofollow noopener noreferrer"&gt;https://imextecnologia.github.io/tributacao/tributos.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Como funciona&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Busca do PDF&lt;/strong&gt; – a cada 12 horas um workflow procura o PDF novo na página da Fecombustíveis e salva em &lt;code&gt;pdf/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura com IA&lt;/strong&gt; – o site envia o PDF ao Google Gemini, que devolve os valores por combustível e UF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparação&lt;/strong&gt; – os valores são comparados com o XML do mês anterior (em &lt;code&gt;xml/&lt;/code&gt;) e o que mudou fica destacado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração&lt;/strong&gt; – para cada combustível que mudou, o bloco antigo termina no dia anterior (ex.: 30/09/2026) e é criado
um bloco novo (ex.: 01/10/2026 até 01/01/2050). Combustíveis sem mudança ficam como estão
Também é possível baixar uma planilha Excel com os valores.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tudo roda no navegador; não há servidor próprio.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Uso&lt;/h2&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/imextecnologia/tributacao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% no navegador&lt;/strong&gt;, sem servidor próprio: HTML + JavaScript puro, publicado no GitHub Pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IA para ler o PDF:&lt;/strong&gt; o site envia o PDF e recebe JSON estruturado por UF/combustível. Hoje uso a API do Google com fallback entre modelos (&lt;code&gt;gemini-flash-latest&lt;/code&gt; → &lt;code&gt;gemini-flash-lite-latest&lt;/code&gt; → &lt;code&gt;gemini-2.5-flash&lt;/code&gt; → &lt;code&gt;gemini-2.5-flash-lite&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação determinística depois da IA:&lt;/strong&gt; a IA não tem a palavra final. O site recalcula PMPF × alíquota e PMPF × 9,25% (PIS/COFINS no GNV) e marca qualquer divergência para revisão humana. Os valores podem ser corrigidos direto na tabela.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Economia de chamadas:&lt;/strong&gt; se o XML do mês já existe em &lt;code&gt;xml/&lt;/code&gt;, ele é carregado direto; o resultado da IA fica salvo no navegador, então recarregar a página não chama a IA de novo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;buscar-pdf.yml&lt;/code&gt; roda às 00:00 e 12:00 UTC, lê a página da Fecombustíveis, baixa o PDF novo, atualiza o &lt;code&gt;painel.json&lt;/code&gt; com o quadro oficial de tributação (%) e publica o site;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pages.yml&lt;/code&gt; gera a lista de arquivos, embute CSS/tema/logo e publica a cada push na &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mapeamento por código ANP&lt;/strong&gt; (ex.: Gasolina C = 320102001/320102002; Diesel S-10 = 820101033/820101034). Produtos não mapeados são mantidos no XML sem alteração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plano B sem IA:&lt;/strong&gt; "Preencher a partir do XML (edição manual)" para quando a API estiver indisponível.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;O projeto inteiro é aberto e não depende de nenhum servidor meu: o código está no GitHub, o site é estático e roda no navegador, os dados de entrada são públicos (PDF da Fecombustíveis) e o histórico de PDFs e XMLs fica versionado no próprio repositório — qualquer posto ou software house pode fazer um fork e usar.&lt;/p&gt;

&lt;p&gt;Sendo transparente: a extração hoje usa um modelo fechado via API. Como toda a lógica de prompt, validação e geração do XML é independente do modelo (o site já troca de modelo automaticamente), o próximo passo é trocar por um &lt;strong&gt;modelo open-weight&lt;/strong&gt; (por exemplo Gemma) — o que permitiria rodar a extração localmente, sem enviar nada a terceiros e sem custo nem limite de cota. A validação determinística (as contas que precisam fechar) é justamente o que torna seguro trocar de modelo: se um modelo menor errar, o erro aparece em vermelho na tela.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot&lt;/strong&gt; — o projeto é automatizado com GitHub Actions (busca do PDF a cada 12h, atualização do quadro de tributação e publicação no Pages).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
