<?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: Marcus Paulo M Dias</title>
    <description>The latest articles on DEV Community by Marcus Paulo M Dias (@marcus_paulomdias_e2a09).</description>
    <link>https://dev.to/marcus_paulomdias_e2a09</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2744689%2F84e7dbd2-cf95-4f21-b8c1-b8146ef1b36e.png</url>
      <title>DEV Community: Marcus Paulo M Dias</title>
      <link>https://dev.to/marcus_paulomdias_e2a09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcus_paulomdias_e2a09"/>
    <language>en</language>
    <item>
      <title>O fim do vazamento de secrets: protegendo seus arquivos .env de forma definitiva</title>
      <dc:creator>Marcus Paulo M Dias</dc:creator>
      <pubDate>Sat, 30 May 2026 18:02:37 +0000</pubDate>
      <link>https://dev.to/marcus_paulomdias_e2a09/o-fim-do-vazamento-de-secrets-protegendo-seus-arquivos-env-de-forma-definitiva-5c19</link>
      <guid>https://dev.to/marcus_paulomdias_e2a09/o-fim-do-vazamento-de-secrets-protegendo-seus-arquivos-env-de-forma-definitiva-5c19</guid>
      <description>&lt;h2&gt;
  
  
  O pesadelo do compartilhamento de tela
&lt;/h2&gt;

&lt;p&gt;Você já viveu isso (ou tem medo de viver): chamada de vídeo com dezenas de pessoas, demonstrando uma feature nova ou depurando um hot-reload ao vivo. Num momento de distração, você troca para a aba errada — e por uma fração de segundo suas chaves da Stripe, credenciais do banco de produção e segredos da AWS aparecem em texto puro na frente de todo mundo.&lt;/p&gt;

&lt;p&gt;Esse "flash" momentâneo é o pesadelo de qualquer dev. E quem usa extensões de máscara tradicionais conhece bem a ansiedade que sobra: a maioria delas age de forma &lt;strong&gt;reativa&lt;/strong&gt;, aplicando "decorações" por cima do texto &lt;strong&gt;depois&lt;/strong&gt; que ele já foi renderizado.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Protect My Env&lt;/strong&gt; ataca o problema pela raiz — mudando a arquitetura, não o curativo.&lt;/p&gt;




&lt;h2&gt;
  
  
  O fim do "flash" antes da máscara carregar
&lt;/h2&gt;

&lt;p&gt;O diferencial crítico é a abordagem &lt;strong&gt;proativa&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ferramentas comuns tentam mascarar o texto dentro de um editor padrão. O resultado é o vazamento do primeiro frame — o famoso &lt;strong&gt;Zero-Frame Flash&lt;/strong&gt;. A Protect My Env implementa um &lt;code&gt;CustomTextEditorProvider&lt;/code&gt;: em vez de &lt;em&gt;decorar&lt;/em&gt; o editor de texto, ela o &lt;strong&gt;substitui&lt;/strong&gt; por um &lt;em&gt;Secure Editor&lt;/em&gt; baseado em Webview.&lt;/p&gt;

&lt;p&gt;Na prática, a máscara é aplicada à lógica de renderização &lt;strong&gt;antes&lt;/strong&gt; de a interface ser desenhada na tela.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The custom editor opens &lt;code&gt;.env&lt;/code&gt; files in a table view where secrets are masked before any rendering occurs — eliminating the "decoration flash" you get with text-editor overlays.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O conteúdo é interceptado e apresentado numa tabela segura. O texto puro nunca chega a tocar a camada de exibição do editor padrão. Durante um live coding ou a gravação de um tutorial, não existe frame residual exibindo segredo nenhum.&lt;/p&gt;




&lt;h2&gt;
  
  
  Seus segredos não saem da sua máquina (zero telemetria)
&lt;/h2&gt;

&lt;p&gt;Qualquer ferramenta que manipula variáveis de ambiente merece desconfiança — e isso é saudável. A Protect My Env foi desenhada sob privacidade absoluta: todo o processamento e exibição roda &lt;strong&gt;localmente&lt;/strong&gt;, na sua instância do VS Code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero data collection&lt;/strong&gt; — nenhuma variável, chave ou valor é registrado, armazenado ou transmitido.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No remote calls&lt;/strong&gt; — funciona 100% offline. Sem telemetria, sem analytics, sem chamadas a servidores externos.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Total privacy&lt;/strong&gt; — seus segredos ficam exclusivamente na sua máquina, no escopo local do editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E como é um projeto &lt;strong&gt;open source (MIT)&lt;/strong&gt;, você não precisa confiar na minha palavra: o código está aberto, com CI, análise estática via &lt;strong&gt;CodeQL&lt;/strong&gt;, &lt;strong&gt;OpenSSF Scorecard&lt;/strong&gt; e cobertura de testes no Codecov. Transparência é parte do produto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recursos principais
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recurso&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔒 &lt;strong&gt;Secure Editor&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Abre o &lt;code&gt;.env&lt;/code&gt; já mascarado por padrão — sem flash de texto puro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👁️ &lt;strong&gt;Per-key Reveal&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Revela ou oculta valores individuais com ícones de ação na linha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 &lt;strong&gt;Reveal All / Hide All&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Alterna todos os valores mascarados pelo cabeçalho do editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 &lt;strong&gt;Search &amp;amp; Sort&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Filtra por chave ou comentário e ordena sem mexer na ordem do arquivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎭 &lt;strong&gt;Dois modos de máscara&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;all&lt;/code&gt; mascara tudo; &lt;code&gt;pattern&lt;/code&gt; mascara só o que casa com glob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 &lt;strong&gt;Comment Protection&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Opcionalmente mascara comentários de linha inteira e inline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✏️ &lt;strong&gt;Edição inline&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Edita valores direto na visualização segura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📝 &lt;strong&gt;Open as Text&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Volta para o editor padrão do VS Code, sem overlays de máscara&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Máscaras inteligentes: ocultando só o que importa
&lt;/h2&gt;

&lt;p&gt;Segurança não precisa custar fluidez. O &lt;strong&gt;Obfuscation Mode&lt;/strong&gt; permite ocultar tudo ou usar &lt;strong&gt;padrões glob&lt;/strong&gt; para mascarar apenas o que é sensível — esconder chaves terminadas em &lt;code&gt;_SECRET&lt;/code&gt; ou &lt;code&gt;_KEY&lt;/code&gt;, por exemplo, e manter visíveis nomes de provedores ou chaves públicas.&lt;/p&gt;

&lt;p&gt;Bônus de produtividade: você consegue &lt;strong&gt;pesquisar e ordenar&lt;/strong&gt; as variáveis na tabela sem alterar a ordem original das linhas no arquivo &lt;code&gt;.env&lt;/code&gt; físico. DX puro.&lt;/p&gt;

&lt;p&gt;Os principais parâmetros de controle no seu &lt;code&gt;settings.json&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuração&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protectMyEnv.obfuscationMode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"all"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"all"&lt;/code&gt; mascara tudo; &lt;code&gt;"pattern"&lt;/code&gt; usa padrões glob.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protectMyEnv.patterns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;ver abaixo&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Padrões glob aplicados no modo &lt;code&gt;pattern&lt;/code&gt; (case-insensitive).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protectMyEnv.rules&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chaves exatas sempre mascaradas, independente do modo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protectMyEnv.maskCharacter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"•"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Caractere usado na máscara.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protectMyEnv.maskLength&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Comprimento da máscara; use &lt;code&gt;0&lt;/code&gt; para espelhar o tamanho real.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;protectMyEnv.protectComments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quando ativo, oculta também os comentários do arquivo.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Um exemplo de configuração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protectMyEnv.obfuscationMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pattern"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protectMyEnv.patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*_SECRET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*_PASSWORD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protectMyEnv.rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"DATABASE_URL"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protectMyEnv.maskCharacter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"•"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protectMyEnv.maskLength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protectMyEnv.protectComments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O detalhe do &lt;code&gt;maskLength: 0&lt;/code&gt; é especialmente útil: ele mascara os caracteres mas &lt;strong&gt;revela o comprimento&lt;/strong&gt; do segredo. Assim você valida visualmente se uma chave está completa sem nunca expor o conteúdo. (O padrão é &lt;code&gt;8&lt;/code&gt;, comprimento fixo.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacidade visual ≠ isolamento de contexto para IA
&lt;/h2&gt;

&lt;p&gt;Aqui vale uma honestidade técnica que poucos têm: &lt;strong&gt;privacidade visual não é sandbox de sistema.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Protect My Env é uma barreira visual robusta, feita para proteger sua &lt;strong&gt;tela&lt;/strong&gt; contra olhos humanos (e câmeras). Mas o arquivo &lt;code&gt;.env&lt;/code&gt; no disco continua em repouso (&lt;em&gt;at rest&lt;/em&gt;) como texto puro — uma escolha de design para garantir compatibilidade com compiladores, runtimes e ferramentas de build.&lt;/p&gt;

&lt;p&gt;Consequência: agentes de IA como GitHub Copilot ou Cursor &lt;strong&gt;ainda têm acesso&lt;/strong&gt; ao conteúdo do arquivo. A ferramenta protege o que você &lt;strong&gt;mostra&lt;/strong&gt;, não o que o seu sistema &lt;strong&gt;lê&lt;/strong&gt;. Ela foi feita exatamente para um problema: evitar a exposição acidental em screen sharing, gravações, live coding e pair programming. Saber dessa fronteira é parte de usar a ferramenta com responsabilidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como instalar
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abra o VS Code e pressione &lt;code&gt;Ctrl+Shift+X&lt;/code&gt; (ou &lt;code&gt;Cmd+Shift+X&lt;/code&gt; no macOS).&lt;/li&gt;
&lt;li&gt;Busque por &lt;strong&gt;Protect My Env&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ou direto pelo &lt;a href="https://marketplace.visualstudio.com/items?itemName=marcuspmd.protect-my-env" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt;. O código está no &lt;a href="https://github.com/marcuspmd/protect-my-env" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; — requer Node.js ≥ 18 e VS Code ≥ 1.75 para builds locais.&lt;/p&gt;




&lt;h2&gt;
  
  
  Um novo padrão para o seu ambiente
&lt;/h2&gt;

&lt;p&gt;A Protect My Env transforma o &lt;code&gt;.env&lt;/code&gt; — de vulnerabilidade latente — em uma interface gerenciável, organizada e profissional. Ao eliminar o flash de renderização e oferecer controle granular via Secure Editor, ela tira o estresse das apresentações técnicas e deixa o foco onde ele deve estar: no código.&lt;/p&gt;

&lt;p&gt;Pequenos ajustes no workflow de segurança são exatamente o que separam um ambiente profissional de um desastre iminente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na sua próxima reunião com tela compartilhada, você teria certeza de que seus segredos estão realmente ocultos desde o primeiro segundo?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Se este artigo te poupou de um susto futuro, deixa um 💜, dá uma ⭐ no &lt;a href="https://github.com/marcuspmd/protect-my-env" rel="noopener noreferrer"&gt;repositório&lt;/a&gt; e compartilha com aquele colega que vive fazendo live coding.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fill All: Generating E2E Tests and Automating Forms with Gemini Nano &amp; TF.js</title>
      <dc:creator>Marcus Paulo M Dias</dc:creator>
      <pubDate>Mon, 02 Mar 2026 00:08:52 +0000</pubDate>
      <link>https://dev.to/marcus_paulomdias_e2a09/fill-all-generating-e2e-tests-and-automating-forms-with-gemini-nano-tfjs-57a8</link>
      <guid>https://dev.to/marcus_paulomdias_e2a09/fill-all-generating-e2e-tests-and-automating-forms-with-gemini-nano-tfjs-57a8</guid>
      <description>&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fill All&lt;/strong&gt; was built for developers and QA engineers who spend their days filling out forms with &lt;strong&gt;locally valid data&lt;/strong&gt; during testing and development. Every timezone, every locale, every country has its own data formats — CPF, CNPJ, RG, ID numbers, postal codes, phone numbers with regional codes — and most form-fillers don't understand them.&lt;/p&gt;

&lt;p&gt;Standard auto-fill tools generate random strings or default to a single region's formats. Developers and QA engineers end up manually calculating valid check digits, hunting for correct postal code ranges, or switching between multiple generator websites. This happens dozens of times per sprint, across different environments and locales.&lt;/p&gt;

&lt;p&gt;Fill All gives you a &lt;strong&gt;single, privacy-first tool&lt;/strong&gt; that understands data validation natively — whatever your region — and goes further by using &lt;strong&gt;on-device AI&lt;/strong&gt; to intelligently classify form fields without ever sending data to external servers.&lt;/p&gt;

&lt;p&gt;The project is fully &lt;strong&gt;open source (MIT)&lt;/strong&gt; and welcomes contributions from the dev and QA community.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Fill All&lt;/strong&gt; is a Chrome Extension (Manifest V3) that automatically fills web forms using a combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;Chrome Built-in AI (Gemini Nano)&lt;/strong&gt; — local LLM that classifies fields contextually&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;TensorFlow.js&lt;/strong&gt; — a custom-trained MLP classifier that runs entirely in the browser&lt;/li&gt;
&lt;li&gt;� &lt;strong&gt;Locale-aware data generators&lt;/strong&gt; — CPF, CNPJ, RG, CNH, PIS, CEP, phone numbers, PIX keys, credit cards, and more — all with valid check digits and regional formatting&lt;/li&gt;
&lt;li&gt;📏 &lt;strong&gt;Configurable rules engine&lt;/strong&gt; — set fixed values or specific generators per URL pattern + CSS selector&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Saved form templates&lt;/strong&gt; — fill once, reuse across sessions&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Smart field detection pipeline&lt;/strong&gt; — HTML type → Keyword → TensorFlow → Chrome AI, composable and immutable&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;E2E script export&lt;/strong&gt; — generates ready-to-use Playwright, Cypress, or Pest/Dusk test scripts from filled forms&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features Built This Weekend
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;i18n&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full internationalization — PT-BR, English, Spanish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fill Emptys Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only fills blank fields, preserving user-entered data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Improved Rule UX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Live preview, auto-suggested generators, keyboard shortcuts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enhanced DOM Watcher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configurable debounce, Shadow DOM support, smart refill for SPAs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced Logging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Timestamped, filterable, exportable logs with audit trail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Feedback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual badges on AI-filled fields, configurable timeout, graceful fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;E2E Script Export&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Record interactions → export as Playwright/Cypress/Pest test code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comprehensive Tests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;70+ test files with Vitest + Playwright, merged coverage reports&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  How It Works (Priority Pipeline)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User triggers fill → Background routes → Content Script detects fields
                                              │
                                    For each field:
                                    1. Ignored?      → Skip
                                    2. Fixed value?  → Use rule value
                                    3. Saved form?   → Use template
                                    4. Chrome AI?    → Gemini Nano (local)
                                    5. TensorFlow?   → Classify + Generate
                                    6. Fallback      → Default generator
                                              │
                                    Fill + dispatch events
                                    (input/change/blur)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Privacy First
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Zero data leaves the device.&lt;/strong&gt; No external APIs, no telemetry, no analytics. Both AI models (Gemini Nano and TensorFlow.js) run 100% locally. All user data is stored in &lt;code&gt;chrome.storage.local&lt;/code&gt; only.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Quick Start Video
&lt;/h3&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/wdaN6umPc5w"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;
&lt;h3&gt;
  
  
  Real-World Usage Example
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/3b725143febc4bbc803f7959b76222f4" rel="noopener noreferrer"&gt;Watch real-world usage example on Loom →&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Popup — Quick Actions &amp;amp; Generators
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq87wd53cz4dbetkf7ceu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq87wd53cz4dbetkf7ceu.png" alt="Popup"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Floating Panel — In-Page Controls
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4t1wd2m5y4k66wlc9wzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4t1wd2m5y4k66wlc9wzw.png" alt="Floating Panel"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  DevTools Panel — Real-Time Field Inspection
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6483idmczokibq87cot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6483idmczokibq87cot.png" alt="DevTools"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Options Page — Full Configuration
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Settings&lt;/th&gt;
&lt;th&gt;Saved Forms&lt;/th&gt;
&lt;th&gt;Training Dataset&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff46842q0el03ivp5o9jx.png" alt="Settings"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4sa4iqigjewgjuc47rx.png" alt="Forms"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6qk6qia252zvpivkfm3z.png" alt="Dataset"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Add Rules Directly From Fields
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0injz4osbtqsdckrpig1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0injz4osbtqsdckrpig1.png" alt="Add Rule"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&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/marcuspmd" rel="noopener noreferrer"&gt;
        marcuspmd
      &lt;/a&gt; / &lt;a href="https://github.com/marcuspmd/fill-all" rel="noopener noreferrer"&gt;
        fill-all
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fill All é uma extensão Chrome de código aberto que preenche formulários automaticamente usando inteligência artificial e geradores de dados brasileiros válidos. Combina Chrome Built-in AI (Gemini Nano), TensorFlow.js e um motor de regras configurável para classificar campos e gerar dados realistas — CPF, CNPJ, RG, CEP, telefone e muito mais.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Fill All&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;AI-powered Chrome extension for smart form filling, recording, and demo generation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deepwiki.com/marcuspmd/fill-all" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0f5ae213ac378635adeb5d7f13cef055ad2f7d9a47b36de7b1c67dbe09f609ca/68747470733a2f2f6465657077696b692e636f6d2f62616467652e737667" alt="Ask DeepWiki"&gt;&lt;/a&gt;
&lt;a href="https://developer.chrome.com/docs/extensions/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/564c4a20d7a0f08fa44e22cf42fddb6072c9aa93ae566728ed7cbd3d9e36decb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4368726f6d652d457874656e73696f6e2d3432383546343f6c6f676f3d676f6f676c656368726f6d65266c6f676f436f6c6f723d7768697465" alt="Chrome Extension"&gt;&lt;/a&gt;
&lt;a href="https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/13e768f02469f23fdf752b493b033e4b06f40197fd24c0131dbb1a195a06750c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4368726f6d6525323057656225323053746f72652d496e7374616c6c253230457874656e73696f6e2d3161373365383f6c6f676f3d676f6f676c656368726f6d65266c6f676f436f6c6f723d7768697465" alt="Chrome Web Store"&gt;&lt;/a&gt;
&lt;a href="https://developer.chrome.com/docs/extensions/develop/migrate/what-is-mv3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cc0d2c971a21906c9fd22d65e2fb3545f51333962d250edfdf24fdbed7fbb356/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d616e69666573742d56332d333441383533" alt="Manifest V3"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7808986a538e157183a5d8b501604fe63aa055e60b1d0ba22fd0cf67b83b2e5e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d5374726963742d3331373843363f6c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://www.tensorflow.org/js" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/67d3b48f814e33a5b7ece17ad5fe8dce0d7fef78104ef7d24503cd508120c0da/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54656e736f72466c6f772e6a732d342e32322d4646364630303f6c6f676f3d74656e736f72666c6f77266c6f676f436f6c6f723d7768697465" alt="TensorFlow.js"&gt;&lt;/a&gt;
&lt;a href="https://github.com/marcuspmd/fill-all/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh" rel="nofollow noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all#getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all#documentation" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all/SECURITY.md" rel="noopener noreferrer"&gt;Security&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all/docs-md/contributing.md" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Fill All is an open-source Chrome extension that fills web forms using a layered pipeline of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rules and saved templates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;built-in generators for valid Brazilian data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TensorFlow.js field classification&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome Built-in AI / Gemini Nano for contextual filling&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is built for developers, QA engineers, automation teams, and anyone tired of filling the same form repeatedly.&lt;/p&gt;
&lt;p&gt;Everything runs &lt;strong&gt;locally in the browser&lt;/strong&gt;. No external AI API is required for the built-in AI and machine-learning flows.&lt;/p&gt;
&lt;p&gt;Install from the Chrome Web Store:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh" rel="nofollow noopener noreferrer"&gt;https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Popup&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/popup.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fpopup.png" alt="Popup"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Field Icons and Rule Configuration&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/form_icons.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fform_icons.png" alt="Field Icons"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/form_icons_configure_rules.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fform_icons_configure_rules.png" alt="Configure Rules from Field Icon"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Options Page&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;General Settings&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Rules&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_general.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_general.png" alt="General Settings"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_general_language.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_general_language.png" alt="Language"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_rules.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_rules.png" alt="Rules"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Saved Forms&lt;/th&gt;
&lt;th&gt;Form Creation&lt;/th&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_forms.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_forms.png" alt="Saved Forms"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_form_creation.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_form_creation.png" alt="Form Creation"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_dataset.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_dataset.png" alt="Dataset"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detection Strategy&lt;/th&gt;
&lt;th&gt;Field Icons&lt;/th&gt;
&lt;th&gt;Learning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_detection_strategy.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_detection_strategy.png" alt="Detection Strategy"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_field_icons.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_field_icons.png" alt="Field Icons Settings"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_learning.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_learning.png" alt="Learning"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Training&lt;/th&gt;
&lt;th&gt;Log&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_training.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_training.png" alt="Training"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_log.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_log.png" alt="Log"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;DevTools Panel&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actions&lt;/th&gt;
&lt;th&gt;Fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_actions.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_actions.png" alt="DevTools Actions"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_fields.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_fields.png" alt="DevTools Fields"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actions (Light Theme)&lt;/th&gt;
&lt;th&gt;Fields (Light Theme)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_actions_ligth.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_actions_ligth.png" alt="DevTools Actions Light"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_field_ligth.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_field_ligth.png" alt="DevTools Fields Light"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Recording and Export&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recording&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;/table&gt;&lt;/div&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/marcuspmd/fill-all" 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;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vite 7.3 + @crxjs/vite-plugin&lt;/td&gt;
&lt;td&gt;Modern bundling with HMR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript ES2022 (strict)&lt;/td&gt;
&lt;td&gt;Full type safety&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Native AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chrome Prompt API (Gemini Nano)&lt;/td&gt;
&lt;td&gt;Local LLM classification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TensorFlow.js 4.22&lt;/td&gt;
&lt;td&gt;Client-side field classifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zod v4&lt;/td&gt;
&lt;td&gt;Schema validation (two-layer: full Zod + light typeof)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;@faker-js/faker&lt;/td&gt;
&lt;td&gt;Realistic data generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chrome Storage API (local)&lt;/td&gt;
&lt;td&gt;Local-only persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vitest + Playwright&lt;/td&gt;
&lt;td&gt;Unit + E2E with merged coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extension&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manifest V3&lt;/td&gt;
&lt;td&gt;Modern Chrome extension standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐     ┌──────────────────┐     ┌──────────────────┐
│  Popup UI   │────▶│    Background     │◀────│  Content Script  │
│             │     │  (Service Worker) │     │  (DOM + Forms)   │
└─────────────┘     └────────┬─────────┘     └────────┬─────────┘
                             │                        │
┌─────────────┐    ┌─────────┼─────────┐    ┌─────────┼─────────┐
│  Options    │    │         │         │    │         │         │
│   Page      │    ▼         ▼         ▼    ▼         ▼         │
└─────────────┘  Storage   Rules    AI    Form     DOM        │
                   │       Engine  Modules Detector Watcher     │
┌─────────────┐    │                │                           │
│  DevTools   │    │       ┌────────┴────────┐                  │
│   Panel     │    │       ▼                 ▼                  │
└─────────────┘    │   Chrome AI      TensorFlow.js             │
                   │  (Gemini Nano)    (Classifier)             │
                   │       │                 │                  │
                   │       └──► Learning ◄───┘                  │
                   │            Store                           │
                   └────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Design Decisions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Immutable detection pipeline&lt;/strong&gt; — classifiers are chained via &lt;code&gt;DetectionPipeline&lt;/code&gt; that returns new instances on every transformation (&lt;code&gt;.with()&lt;/code&gt;, &lt;code&gt;.without()&lt;/code&gt;, &lt;code&gt;.withOrder()&lt;/code&gt;). This makes the pipeline composable, testable, and free from side effects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Two-layer validation&lt;/strong&gt; — Full Zod schemas for background/options (correctness first), lightweight &lt;code&gt;typeof&lt;/code&gt; checks in the content script (performance first on the hot path).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atomic storage updates&lt;/strong&gt; — &lt;code&gt;updateStorageAtomically()&lt;/code&gt; uses a per-key write queue with pure updater functions &lt;code&gt;(current: T) =&amp;gt; T&lt;/code&gt; to prevent race conditions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuous learning loop&lt;/strong&gt; — Chrome AI predictions feed into a learning store (max 500 entries, FIFO). TensorFlow.js can retrain in-browser using these entries, creating a self-improving cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adapters pattern&lt;/strong&gt; — UI component libraries (Ant Design, Select2) have dedicated adapters so the form filler handles custom selects, datepickers, and cascaders correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;E2E export via Strategy pattern&lt;/strong&gt; — each framework (Playwright, Cypress, Pest) has its own code generator, registered in a strategy registry. Adding a new framework means adding one file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What I Learned
&lt;/h3&gt;

&lt;p&gt;Building a Chrome extension that bridges &lt;strong&gt;on-device AI with practical developer tools&lt;/strong&gt; taught me that the real power of Gemini Nano isn't in replacing server-side AI — it's in enabling &lt;strong&gt;privacy-respecting intelligence&lt;/strong&gt; for tools that handle sensitive data (like form fillers). The continuous learning loop between Chrome AI and TensorFlow.js creates a system that gets smarter over time without ever leaving the user's machine.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Fill All&lt;/strong&gt; is open source and welcomes contributions. If you're tired of manually generating valid test data or filling the same form for the hundredth time — this one's for you.&lt;/p&gt;

&lt;p&gt;

&lt;/p&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/marcuspmd" rel="noopener noreferrer"&gt;
        marcuspmd
      &lt;/a&gt; / &lt;a href="https://github.com/marcuspmd/fill-all" rel="noopener noreferrer"&gt;
        fill-all
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fill All é uma extensão Chrome de código aberto que preenche formulários automaticamente usando inteligência artificial e geradores de dados brasileiros válidos. Combina Chrome Built-in AI (Gemini Nano), TensorFlow.js e um motor de regras configurável para classificar campos e gerar dados realistas — CPF, CNPJ, RG, CEP, telefone e muito mais.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Fill All&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;AI-powered Chrome extension for smart form filling, recording, and demo generation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deepwiki.com/marcuspmd/fill-all" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0f5ae213ac378635adeb5d7f13cef055ad2f7d9a47b36de7b1c67dbe09f609ca/68747470733a2f2f6465657077696b692e636f6d2f62616467652e737667" alt="Ask DeepWiki"&gt;&lt;/a&gt;
&lt;a href="https://developer.chrome.com/docs/extensions/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/564c4a20d7a0f08fa44e22cf42fddb6072c9aa93ae566728ed7cbd3d9e36decb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4368726f6d652d457874656e73696f6e2d3432383546343f6c6f676f3d676f6f676c656368726f6d65266c6f676f436f6c6f723d7768697465" alt="Chrome Extension"&gt;&lt;/a&gt;
&lt;a href="https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/13e768f02469f23fdf752b493b033e4b06f40197fd24c0131dbb1a195a06750c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4368726f6d6525323057656225323053746f72652d496e7374616c6c253230457874656e73696f6e2d3161373365383f6c6f676f3d676f6f676c656368726f6d65266c6f676f436f6c6f723d7768697465" alt="Chrome Web Store"&gt;&lt;/a&gt;
&lt;a href="https://developer.chrome.com/docs/extensions/develop/migrate/what-is-mv3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cc0d2c971a21906c9fd22d65e2fb3545f51333962d250edfdf24fdbed7fbb356/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d616e69666573742d56332d333441383533" alt="Manifest V3"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7808986a538e157183a5d8b501604fe63aa055e60b1d0ba22fd0cf67b83b2e5e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d5374726963742d3331373843363f6c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://www.tensorflow.org/js" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/67d3b48f814e33a5b7ece17ad5fe8dce0d7fef78104ef7d24503cd508120c0da/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54656e736f72466c6f772e6a732d342e32322d4646364630303f6c6f676f3d74656e736f72666c6f77266c6f676f436f6c6f723d7768697465" alt="TensorFlow.js"&gt;&lt;/a&gt;
&lt;a href="https://github.com/marcuspmd/fill-all/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh" rel="nofollow noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all#getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all#documentation" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all/SECURITY.md" rel="noopener noreferrer"&gt;Security&lt;/a&gt; · &lt;a href="https://github.com/marcuspmd/fill-all/docs-md/contributing.md" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Fill All is an open-source Chrome extension that fills web forms using a layered pipeline of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rules and saved templates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;built-in generators for valid Brazilian data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TensorFlow.js field classification&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome Built-in AI / Gemini Nano for contextual filling&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is built for developers, QA engineers, automation teams, and anyone tired of filling the same form repeatedly.&lt;/p&gt;
&lt;p&gt;Everything runs &lt;strong&gt;locally in the browser&lt;/strong&gt;. No external AI API is required for the built-in AI and machine-learning flows.&lt;/p&gt;
&lt;p&gt;Install from the Chrome Web Store:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh" rel="nofollow noopener noreferrer"&gt;https://chromewebstore.google.com/detail/fill-all/djnkgmelgfdjpeacmolelikhgioendjh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Popup&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/popup.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fpopup.png" alt="Popup"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Field Icons and Rule Configuration&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/form_icons.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fform_icons.png" alt="Field Icons"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/form_icons_configure_rules.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fform_icons_configure_rules.png" alt="Configure Rules from Field Icon"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Options Page&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;General Settings&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Rules&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_general.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_general.png" alt="General Settings"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_general_language.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_general_language.png" alt="Language"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_rules.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_rules.png" alt="Rules"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Saved Forms&lt;/th&gt;
&lt;th&gt;Form Creation&lt;/th&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_forms.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_forms.png" alt="Saved Forms"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_form_creation.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_form_creation.png" alt="Form Creation"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_dataset.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_dataset.png" alt="Dataset"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detection Strategy&lt;/th&gt;
&lt;th&gt;Field Icons&lt;/th&gt;
&lt;th&gt;Learning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_detection_strategy.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_detection_strategy.png" alt="Detection Strategy"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_field_icons.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_field_icons.png" alt="Field Icons Settings"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_learning.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_learning.png" alt="Learning"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Training&lt;/th&gt;
&lt;th&gt;Log&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_training.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_training.png" alt="Training"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/settings_log.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fsettings_log.png" alt="Log"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;DevTools Panel&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actions&lt;/th&gt;
&lt;th&gt;Fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_actions.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_actions.png" alt="DevTools Actions"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_fields.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_fields.png" alt="DevTools Fields"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actions (Light Theme)&lt;/th&gt;
&lt;th&gt;Fields (Light Theme)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_actions_ligth.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_actions_ligth.png" alt="DevTools Actions Light"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/marcuspmd/fill-all/docs-md/images/devtools_field_ligth.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmarcuspmd%2Ffill-all%2Fdocs-md%2Fimages%2Fdevtools_field_ligth.png" alt="DevTools Fields Light"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Recording and Export&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recording&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;/table&gt;&lt;/div&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/marcuspmd/fill-all" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
