<?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: DNSZLSK</title>
    <description>The latest articles on DEV Community by DNSZLSK (@dnszlsk).</description>
    <link>https://dev.to/dnszlsk</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%2F3729119%2F7c3b1713-c1bd-49eb-b211-c2546bff514c.png</url>
      <title>DEV Community: DNSZLSK</title>
      <link>https://dev.to/dnszlsk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dnszlsk"/>
    <language>en</language>
    <item>
      <title>I’m in! 🥳🤙🏼 contratz to all!</title>
      <dc:creator>DNSZLSK</dc:creator>
      <pubDate>Tue, 10 Mar 2026 06:19:44 +0000</pubDate>
      <link>https://dev.to/dnszlsk/im-in-contratz-to-all-1757</link>
      <guid>https://dev.to/dnszlsk/im-in-contratz-to-all-1757</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240" class="crayons-story__hidden-navigation-link"&gt;Congrats to the GitHub Copilot CLI Challenge Winners!&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/devteam"&gt;
            &lt;img alt="The DEV Team logo" 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%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/jess" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" alt="jess profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jess" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jess Lee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jess Lee
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3331372" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jess" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jess Lee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/devteam" class="crayons-story__secondary fw-medium"&gt;The DEV Team&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 9&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240" id="article-link-3331372"&gt;
          Congrats to the GitHub Copilot CLI Challenge Winners!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cli"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cli&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;176&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              93&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>ai</category>
    </item>
    <item>
      <title>My npm monitoring flagged SANDWORM_MODE packages -&gt; looking for expert input</title>
      <dc:creator>DNSZLSK</dc:creator>
      <pubDate>Mon, 23 Feb 2026 20:20:18 +0000</pubDate>
      <link>https://dev.to/dnszlsk/my-npm-monitoring-flagged-sandwormmode-packages-looking-for-expert-input-681</link>
      <guid>https://dev.to/dnszlsk/my-npm-monitoring-flagged-sandwormmode-packages-looking-for-expert-input-681</guid>
      <description>&lt;p&gt;Socket just published their research on &lt;a href="https://socket.dev/blog/sandworm-mode-npm-worm-ai-toolchain-poisoning" rel="noopener noreferrer"&gt;SANDWORM_MODE&lt;/a&gt;, a supply chain campaign targeting AI coding tools.&lt;/p&gt;

&lt;p&gt;I checked my logs. My scanner MUAD'DIB flagged several of these packages via temporal analysis - it compares versions and detects when dangerous primitives like &lt;code&gt;child_process&lt;/code&gt; or &lt;code&gt;https.request&lt;/code&gt; are suddenly added.&lt;/p&gt;

&lt;h2&gt;
  
  
  What my monitoring caught
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="mailto:claud-code@0.2.0"&gt;claud-code@0.2.0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Feb 14&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;child_process added suddenly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="mailto:cloude-code@0.2.0"&gt;cloude-code@0.2.0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Feb 14&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;child_process added suddenly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="mailto:suport-color@1.0.2"&gt;suport-color@1.0.2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Feb 14&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;https_request + publish_burst&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="mailto:opencraw@2026.2.15"&gt;opencraw@2026.2.15&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Feb 17&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;AST findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="mailto:opencraw@2026.2.16"&gt;opencraw@2026.2.16&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Feb 17&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;AST findings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Socket published their report on February 22.&lt;/p&gt;

&lt;h2&gt;
  
  
  How temporal analysis works
&lt;/h2&gt;

&lt;p&gt;MUAD'DIB compares package versions. If a new version suddenly adds sensitive APIs that weren't there before, it flags it.&lt;/p&gt;

&lt;p&gt;A color utility package (&lt;code&gt;suport-color&lt;/code&gt;) has no reason to suddenly start making HTTPS requests. A typosquat of Claude Code (&lt;code&gt;claud-code&lt;/code&gt;) adding &lt;code&gt;child_process&lt;/code&gt; out of nowhere is suspicious.&lt;/p&gt;

&lt;p&gt;That's what triggered the alerts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question for the community
&lt;/h2&gt;

&lt;p&gt;Socket lists &lt;code&gt;claud-code@0.2.1&lt;/code&gt; as malicious. My logs show &lt;code&gt;claud-code@0.2.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Were the @0.2.0 versions already infected, or did the injection come in @0.2.1?&lt;/p&gt;

&lt;h2&gt;
  
  
  About MUAD'DIB
&lt;/h2&gt;

&lt;p&gt;24/7 heuristic monitoring on a VPS. No manual investigation, no attribution - just automatic flagging based on behavioral changes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;14 detection engines + Docker sandbox&lt;/li&gt;
&lt;li&gt;96K+ packages scanned&lt;/li&gt;
&lt;li&gt;Temporal analysis, typosquatting detection, dataflow tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/DNSZLSK/muad-dib" rel="noopener noreferrer"&gt;https://github.com/DNSZLSK/muad-dib&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx muaddib-scanner scan &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F3eteixn4o7l5tpjwtpc3.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%2F3eteixn4o7l5tpjwtpc3.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;br&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%2Fgh7n7xwvtc23nfw0n5ov.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%2Fgh7n7xwvtc23nfw0n5ov.png" alt=" " width="757" height="323"&gt;&lt;/a&gt;&lt;br&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%2F3malbmaufomdiefe049w.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%2F3malbmaufomdiefe049w.png" alt=" " width="786" height="644"&gt;&lt;/a&gt;&lt;br&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%2F3zohei273eh8chys4xst.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%2F3zohei273eh8chys4xst.png" alt=" " width="719" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>security</category>
      <category>sandworm</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>I built a free npm/PyPI supply chain scanner - looking for testers</title>
      <dc:creator>DNSZLSK</dc:creator>
      <pubDate>Mon, 09 Feb 2026 23:42:11 +0000</pubDate>
      <link>https://dev.to/dnszlsk/i-built-a-free-npm-supply-chain-scanner-looking-for-testers-35im</link>
      <guid>https://dev.to/dnszlsk/i-built-a-free-npm-supply-chain-scanner-looking-for-testers-35im</guid>
      <description>&lt;p&gt;I built &lt;a href="https://github.com/DNSZLSK/muad-dib" rel="noopener noreferrer"&gt;MUAD'DIB&lt;/a&gt; to catch supply chain attacks before they hit your project. It runs 24/7 on a 4€/month VPS, scanning every new npm and PyPI package published worldwide. It's free, open source, and I'm looking for feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;MUAD'DIB scans npm and PyPI packages for signs of malicious code. Not just known bad packages - it actually reads the code, runs it in an isolated sandbox, and looks for suspicious behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14 detection engines + dynamic sandbox:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AST analysis&lt;/strong&gt; - parses JavaScript with Acorn and flags dangerous patterns (eval with dynamic args, child_process spawning, credential access)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataflow tracking&lt;/strong&gt; - connects the dots between reading a sensitive file and sending it over HTTP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell pattern detection&lt;/strong&gt; - catches &lt;code&gt;curl | sh&lt;/code&gt;, reverse shells, and destructive commands in npm scripts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typosquatting&lt;/strong&gt; - flags dependencies that look like popular packages (Levenshtein distance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obfuscation detection&lt;/strong&gt; - spots hex encoding, single-char variables, _0x patterns, base64+eval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entropy analysis&lt;/strong&gt; - detects encoded/encrypted payloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IOC matching&lt;/strong&gt; - compares against 225,000+ npm and 14,000+ PyPI known malicious packages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hash verification&lt;/strong&gt; - SHA-256 matching against known malware files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Package metadata&lt;/strong&gt; - analyzes package.json for suspicious lifecycle scripts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt; - detects injection vulnerabilities in workflow files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI config injection&lt;/strong&gt; - detects prompt injection in .cursorrules, CLAUDE.md, copilot-instructions.md&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal analysis&lt;/strong&gt; - detects sudden dangerous API additions between versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainer analysis&lt;/strong&gt; - flags suspicious maintainer changes (account takeover)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish anomaly&lt;/strong&gt; - detects burst publishing, dormant package spikes (compromised accounts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Docker sandbox with behavioral analysis:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Executes packages in isolated container (cap-drop, read-only, memory/cpu limits)&lt;/li&gt;
&lt;li&gt;Captures network traffic (DNS, HTTP, TLS) via tcpdump&lt;/li&gt;
&lt;li&gt;Traces system calls via strace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canary tokens&lt;/strong&gt; - injects fake AWS keys, GitHub tokens, npm tokens as honeypots. If the malware tries to exfiltrate them → instant detection, no false positive possible&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-time monitoring
&lt;/h2&gt;

&lt;p&gt;I run MUAD'DIB 24/7 on a VPS. It polls npm and PyPI registries every 60 seconds and scans every new package published worldwide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;New package appears on npm/PyPI RSS feed&lt;/li&gt;
&lt;li&gt;Static analysis (14 scanners) → if HIGH/CRITICAL findings&lt;/li&gt;
&lt;li&gt;Automatic Docker sandbox with canary tokens&lt;/li&gt;
&lt;li&gt;If sandbox confirms malicious behavior → instant Discord alert&lt;/li&gt;
&lt;li&gt;If sandbox is clean → marked as false positive, no alert&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;96,000+ packages scanned since launch.&lt;/strong&gt; Daily reports at 08:00 Paris time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick demo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx muaddib-scanner scan &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No account, no API key, no quota.&lt;/p&gt;

&lt;p&gt;You get a risk score from 0 to 100, a threat breakdown, and response playbooks telling you what to do if something is flagged.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[SCORE] 78/100 [████████████████░░░░] CRITICAL

  1. [CRITICAL] suspicious_dataflow
     Credentials read (GITHUB_TOKEN) + network send (fetch)
     File: node_modules/evil-pkg/index.js
     → CRITICAL: Code reads credentials and sends them over network.
       Isolate machine, regenerate all secrets.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CLI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; muaddib-scanner
muaddib scan ./my-project
muaddib scan ./my-project &lt;span class="nt"&gt;--sandbox&lt;/span&gt;  &lt;span class="c"&gt;# run in Docker sandbox&lt;/span&gt;
muaddib scan ./my-project &lt;span class="nt"&gt;--json&lt;/span&gt;     &lt;span class="c"&gt;# machine-readable output&lt;/span&gt;
muaddib scan ./my-project &lt;span class="nt"&gt;--sarif&lt;/span&gt;    &lt;span class="c"&gt;# for GitHub Code Scanning&lt;/span&gt;
muaddib scan ./my-project &lt;span class="nt"&gt;--paranoid&lt;/span&gt; &lt;span class="c"&gt;# ultra-strict mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Safe install (scans before installing):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;muaddib &lt;span class="nb"&gt;install &lt;/span&gt;some-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Version diff (compare two versions):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;muaddib diff lodash 4.17.20 4.17.21
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Update IOC database:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;muaddib update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub Action:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DNSZLSK/muad-dib@master&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;scan_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.'&lt;/span&gt;
    &lt;span class="na"&gt;fail_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;high'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;VS Code extension:&lt;/strong&gt; search "MUAD'DIB" in the marketplace.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm looking for
&lt;/h2&gt;

&lt;p&gt;I've tested MUAD'DIB against 51 real-world malware samples (event-stream, ua-parser-js, coa, colors, Shai-Hulud, and more) with 91.8% detection rate. 100% on 78 adversarial test cases. But I need people to run it on real projects and tell me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;False positives&lt;/strong&gt; - did it flag something legitimate? What was it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missed threats&lt;/strong&gt; - did you find something suspicious that MUAD'DIB didn't catch?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evasion techniques&lt;/strong&gt; - can you write a malicious package that bypasses detection?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; - how long did it take on large projects? Any hangs?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you find something, open an issue on &lt;a href="https://github.com/DNSZLSK/muad-dib/issues" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or drop a comment here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Detection engines&lt;/td&gt;
&lt;td&gt;14 + Docker sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm IOCs&lt;/td&gt;
&lt;td&gt;225,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPI IOCs&lt;/td&gt;
&lt;td&gt;14,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection rules&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit tests&lt;/td&gt;
&lt;td&gt;862&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ground truth samples&lt;/td&gt;
&lt;td&gt;51 real-world malware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;True positive rate&lt;/td&gt;
&lt;td&gt;91.8% (45/49)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adversarial detection&lt;/td&gt;
&lt;td&gt;100% (78/78)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False positive rate&lt;/td&gt;
&lt;td&gt;~13% (working on it)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packages scanned (monitoring)&lt;/td&gt;
&lt;td&gt;96,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free forever&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Transparency
&lt;/h2&gt;

&lt;p&gt;The code was written with Claude (Anthropic). I directed the architecture, made design decisions, did testing and security audits, but the actual code was generated by AI. I prefer to be upfront about that.&lt;/p&gt;

&lt;p&gt;I'm in career transition (former plumber/chef), currently in software development training in France, looking for an internship May-July 2026 in cybersecurity or development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use Snyk/Socket?
&lt;/h2&gt;

&lt;p&gt;You should, they're professional tools with dedicated security teams. MUAD'DIB is a personal project, not comparable.&lt;/p&gt;

&lt;p&gt;What MUAD'DIB offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No account, no API key&lt;/li&gt;
&lt;li&gt;Open source and auditable&lt;/li&gt;
&lt;li&gt;Docker sandbox with canary tokens&lt;/li&gt;
&lt;li&gt;24/7 real-time monitoring capability&lt;/li&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>supplychain</category>
    </item>
    <item>
      <title>GitCoach : The Git Mentor That Teaches You While You Work (GitHub Copilot CLI Challenge)</title>
      <dc:creator>DNSZLSK</dc:creator>
      <pubDate>Thu, 05 Feb 2026 22:58:59 +0000</pubDate>
      <link>https://dev.to/dnszlsk/gitcoach-the-git-mentor-that-teaches-you-while-you-work-github-copilot-cli-challenge-1708</link>
      <guid>https://dev.to/dnszlsk/gitcoach-the-git-mentor-that-teaches-you-while-you-work-github-copilot-cli-challenge-1708</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitCoach&lt;/strong&gt; is an interactive CLI tool that replaces raw Git commands with guided, educational menus - and uses GitHub Copilot CLI as its AI backbone for 5 distinct features.&lt;/p&gt;

&lt;p&gt;The problem it solves is simple: Git is powerful but hostile to learners. Beginners memorize commands without understanding them. When something breaks - a merge conflict, a detached HEAD, a failed push - they're on their own with cryptic error messages.&lt;/p&gt;

&lt;p&gt;GitCoach wraps Git in a TUI that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shows what's happening&lt;/strong&gt; - a status bar with branch, sync status, and staged changes at all times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevents mistakes&lt;/strong&gt; - warns before destructive actions, detects detached HEAD state, catches uncommitted changes before branch switching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teaches as it goes&lt;/strong&gt; - every action shows the underlying Git command so you learn while you work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guides conflict resolution step by step&lt;/strong&gt; - instead of dumping conflict markers on the user, GitCoach walks through each conflicting file with clear options and explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speaks your language&lt;/strong&gt; - full i18n support for English, French, and Spanish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key idea: GitCoach should make itself obsolete. You use it to learn, and eventually you don't need it anymore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript, Node.js&lt;/li&gt;
&lt;li&gt;Published on npm: &lt;code&gt;npm install -g gitcoach-cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;522 tests passing&lt;/li&gt;
&lt;li&gt;GitHub Copilot CLI (5 integrations - more on that below)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitHub repo:&lt;/strong&gt; &lt;a href="https://github.com/DNSZLSK/gitcoach-cli" rel="noopener noreferrer"&gt;github.com/DNSZLSK/gitcoach-cli&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/gitcoach-cli" rel="noopener noreferrer"&gt;npmjs.com/package/gitcoach-cli&lt;/a&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Main Menu &amp;amp; Status Bar
&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%2Fyakff53v3uhfwrg1jglr.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%2Fyakff53v3uhfwrg1jglr.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitCoach launches with a real-time status bar showing branch, sync state, and pending changes. Every menu option maps to a Git workflow. The &lt;code&gt;~1 ?1&lt;/code&gt; indicators tell you at a glance: 1 modified file, 1 untracked file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Commit Flow
&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%2F3xvu0pg1uei6dxf6biov.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%2F3xvu0pg1uei6dxf6biov.png" alt=" " width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When committing, GitCoach lists staged files, shows educational tips about writing good commit messages, and integrates with Copilot CLI to generate or summarize changes before you commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copilot-Assisted Conflict Resolution
&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%2Ff4qf1fmi6rfrdc5cetk5.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%2Ff4qf1fmi6rfrdc5cetk5.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the flagship feature. When a merge conflict occurs, GitCoach detects it, shows both versions side by side (local vs remote), and offers 5 resolution options - including &lt;strong&gt;"Ask Copilot AI."&lt;/strong&gt; In this example, Copilot analyzed both versions and recommended a CUSTOM merge, explaining that neither version alone was correct and suggesting a merged version that maintains backward compatibility while accommodating the feature branch changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git Q&amp;amp;A - Ask Anything
&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%2Fnhzws7zmeu4i5did9e55.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%2Fnhzws7zmeu4i5did9e55.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't know what &lt;code&gt;rebase&lt;/code&gt; does? Ask directly from the Help menu. Copilot CLI answers in detail with examples and rules of thumb - all without leaving the terminal, and in your configured language.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;I integrated GitHub Copilot CLI into GitCoach in &lt;strong&gt;5 distinct ways&lt;/strong&gt;, each solving a different problem in the Git learning workflow:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Commit Message Generation
&lt;/h3&gt;

&lt;p&gt;When a user stages changes and chooses to commit, GitCoach runs &lt;code&gt;git diff --cached&lt;/code&gt; and sends it to Copilot CLI with a prompt asking for a concise conventional commit message. The user sees the suggestion, can accept it, edit it, or write their own. This teaches commit message best practices by example.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Git Q&amp;amp;A
&lt;/h3&gt;

&lt;p&gt;From the Help menu, users can type any Git-related question in natural language. Copilot CLI answers directly in the terminal, in the user's configured language. I found this particularly useful for concepts like "what's the difference between merge and rebase?" - questions that beginners need answered in context, not in a browser tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Staged Diff Summary
&lt;/h3&gt;

&lt;p&gt;Before committing, GitCoach can show a Copilot-generated summary of all staged changes. This gives the user a "second pair of eyes" moment before they commit. Copilot receives the full diff and returns a structured summary: files changed, what was added/modified/removed, and the overall intent of the changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Contextual Error Explanation
&lt;/h3&gt;

&lt;p&gt;When a Git operation fails (push rejected, merge conflict, authentication error), GitCoach catches the error and sends it to Copilot CLI for a plain-language explanation. The user sees both the static, pre-written explanation from GitCoach AND an AI-generated one specific to their exact error. This two-layer approach means the tool works without internet (static messages) but provides richer context when Copilot is available.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. AI-Assisted Conflict Resolution
&lt;/h3&gt;

&lt;p&gt;This is the flagship integration. When merge conflicts occur, GitCoach already provides a guided resolution menu with options like "Accept local changes," "Accept remote changes," or "Open in editor." The 5th option is &lt;strong&gt;"Ask Copilot AI."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When selected, GitCoach reads both the local and remote versions of the conflicting file and sends them to Copilot CLI with context about the conflict. Copilot responds with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;recommendation&lt;/strong&gt; (LOCAL, REMOTE, BOTH, or CUSTOM)&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;explanation&lt;/strong&gt; of why that strategy makes sense&lt;/li&gt;
&lt;li&gt;If CUSTOM, the actual &lt;strong&gt;merged content&lt;/strong&gt; ready to apply&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In testing, Copilot correctly identified that one branch had a version bump while the other had a name change, and recommended a custom merge keeping both modifications. That's not trivial - it understood the semantic intent of each change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Language-Aware Responses
&lt;/h3&gt;

&lt;p&gt;All 5 Copilot integrations respect the user's language configuration. A &lt;code&gt;getLanguageInstruction()&lt;/code&gt; function appends the appropriate instruction ("Respond in French", "Responde en español") to every prompt. Copilot's responses come back in the right language, which matters a lot for the educational mission of the tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Parsing Challenge
&lt;/h3&gt;

&lt;p&gt;One real challenge was parsing Copilot CLI's output reliably. Copilot sometimes returns error messages, version warnings, or unexpected formatting mixed in with actual responses. I built a &lt;code&gt;looksLikeError()&lt;/code&gt; detection function that filters out common Copilot error patterns so the UI never shows raw error text to the user. If Copilot fails silently, GitCoach falls back to its static educational content - the user experience is never broken.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copilot CLI Version Gotcha
&lt;/h3&gt;

&lt;p&gt;During development I hit a compatibility issue with the deprecated &lt;code&gt;gh copilot&lt;/code&gt; extension vs the newer standalone &lt;code&gt;copilot&lt;/code&gt; CLI. The migration required updating all command invocations and install instructions. It's worth noting for anyone building on top of Copilot CLI - make sure you're using the current &lt;code&gt;copilot&lt;/code&gt; command, not the deprecated &lt;code&gt;gh copilot&lt;/code&gt; extension.&lt;/p&gt;




&lt;p&gt;GitCoach started as my way of learning Git properly during a career transition into software development. I built it because the tools I wanted didn't exist - something between "read the docs" and "just use a GUI client." Adding Copilot CLI turned it from a useful learning tool into something that genuinely adapts to the user's situation. The AI doesn't replace the education - it enhances it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;code&gt;npm install -g gitcoach-cli&lt;/code&gt; then run &lt;code&gt;gitcoach&lt;/code&gt; in any Git repository.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
