<?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: Prajwal Priyadarshan</title>
    <description>The latest articles on DEV Community by Prajwal Priyadarshan (@prajwal_priyadarshan).</description>
    <link>https://dev.to/prajwal_priyadarshan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4170786%2F2e3197ee-9d6e-41c6-8a97-984f23d37db9.jpg</url>
      <title>DEV Community: Prajwal Priyadarshan</title>
      <link>https://dev.to/prajwal_priyadarshan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prajwal_priyadarshan"/>
    <language>en</language>
    <item>
      <title>GitHygiene: Does This Vulnerability Actually Matter in My Code?</title>
      <dc:creator>Prajwal Priyadarshan</dc:creator>
      <pubDate>Thu, 08 Oct 2026 09:53:52 +0000</pubDate>
      <link>https://dev.to/prajwal_priyadarshan/githygiene-does-this-vulnerability-actually-matter-in-my-code-e0b</link>
      <guid>https://dev.to/prajwal_priyadarshan/githygiene-does-this-vulnerability-actually-matter-in-my-code-e0b</guid>
      <description>&lt;h1&gt;
  
  
  GitHygiene
&lt;/h1&gt;

&lt;p&gt;Built by &lt;strong&gt;TetraFourge&lt;/strong&gt; for Hacktoberfest Hack Day — Coimbatore 2026&lt;br&gt;&lt;br&gt;
INIT CLUB × iDEA CLUB × MLH&lt;/p&gt;



&lt;p&gt;There’s a point in every project where you run a security scanner and get something like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;47 vulnerabilities found.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Great.&lt;/p&gt;

&lt;p&gt;Now what?&lt;/p&gt;

&lt;p&gt;Which ones actually affect your application?&lt;br&gt;&lt;br&gt;
Which ones are buried three dependencies deep?&lt;br&gt;&lt;br&gt;
Which ones are actually being used?&lt;br&gt;&lt;br&gt;
Which ones can you safely ignore?&lt;br&gt;&lt;br&gt;
And, most importantly, &lt;strong&gt;what should you fix first?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was the problem we wanted to tackle.&lt;/p&gt;
&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;Modern applications are built on top of hundreds of packages.&lt;/p&gt;

&lt;p&gt;Your code depends on a package.&lt;br&gt;&lt;br&gt;
That package depends on another package.&lt;br&gt;&lt;br&gt;
That package depends on another package.&lt;/p&gt;

&lt;p&gt;Before long, you're responsible for code you've never even seen.&lt;/p&gt;

&lt;p&gt;When something breaks somewhere down that chain, traditional scanners are good at telling you that it's broken. They're much less useful at telling you &lt;strong&gt;whether your application actually reaches the vulnerable part&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's where we started building &lt;strong&gt;GitHygiene&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  So what does it do?
&lt;/h2&gt;

&lt;p&gt;GitHygiene connects to your GitHub repositories and builds a map of your dependencies, vulnerabilities and the code that actually uses them.&lt;/p&gt;

&lt;p&gt;It scans &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;package-lock.json&lt;/code&gt; and &lt;code&gt;requirements.txt&lt;/code&gt;, builds the dependency tree, checks packages against OSV.dev, and looks for outdated or deprecated dependencies.&lt;/p&gt;

&lt;p&gt;But we didn't want to stop at:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You have a vulnerable package."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We wanted to get closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You have a vulnerable package, and here's why your code does — or doesn't — reach the vulnerable part."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the interesting bit.&lt;/p&gt;
&lt;h2&gt;
  
  
  The AI doesn't get to guess
&lt;/h2&gt;

&lt;p&gt;We split the AI workflow into separate stages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First:&lt;/strong&gt; Gemma 4 reads the advisory and identifies the vulnerable surface — functions, subpaths, trigger conditions and attack vectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then:&lt;/strong&gt; we put the model aside.&lt;/p&gt;

&lt;p&gt;Our gateway searches the actual repository for imports, symbols and call sites related to that vulnerable surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally:&lt;/strong&gt; another Gemma 4 model gets the advisory information together with the evidence found in the repository and makes the reachability assessment.&lt;/p&gt;

&lt;p&gt;The result is one of four outcomes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;reachable&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;likely_reachable&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;not_evidenced&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;unused&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;A vulnerable package sitting somewhere in your dependency tree isn't necessarily the same thing as vulnerable code being executed by your application.&lt;/p&gt;
&lt;h2&gt;
  
  
  And we added a rule for the AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If the AI can't prove where it got something from, we don't show it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every file cited by the model has to exist in the evidence collected during static analysis.&lt;/p&gt;

&lt;p&gt;If the model returns a schema we can't validate, or cites something that wasn't in the evidence, the result is rejected.&lt;/p&gt;

&lt;p&gt;No fabricated file paths.&lt;br&gt;&lt;br&gt;
No imaginary evidence.&lt;br&gt;&lt;br&gt;
No "trust me, bro" security analysis.&lt;/p&gt;

&lt;p&gt;The system would rather say &lt;strong&gt;AI analysis unavailable&lt;/strong&gt; than give you a confident answer that's wrong.&lt;/p&gt;
&lt;h2&gt;
  
  
  Then there's the dependency graph
&lt;/h2&gt;

&lt;p&gt;One vulnerable package doesn't necessarily affect one repository.&lt;/p&gt;

&lt;p&gt;You might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo-a
   \
    package-x
   /
repo-b
   \
    package-y
       \
        package-x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we used Neo4j to model the dependency relationships.&lt;/p&gt;

&lt;p&gt;Now, when a package is affected by an advisory, we can trace the dependency graph and see the repositories that inherit that problem.&lt;/p&gt;

&lt;p&gt;That's our &lt;strong&gt;blast radius&lt;/strong&gt; view.&lt;/p&gt;

&lt;p&gt;Instead of investigating repositories one by one, you can see where the same dependency problem travels across your projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a vulnerability isn't the finish line
&lt;/h2&gt;

&lt;p&gt;Once GitHygiene identifies a finding, it can also work out how to deal with it.&lt;/p&gt;

&lt;p&gt;It generates remediation recommendations based on whether the dependency is direct or transitive, suggests direct upgrades or overrides, flags potential breaking changes, and can turn the finding into a draft GitHub issue with evidence from the scan.&lt;/p&gt;

&lt;p&gt;So the workflow becomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find it → understand it → decide → fix it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find 47 things → stare at dashboard → give up.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;The final system is split into a few pieces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React 19 + TypeScript
        |
        v
Node.js / Express API Gateway
        |
        +------ Supabase
        |
        +------ Neo4j
        |
        +------ OSV / npm / PyPI
        |
        v
FastAPI AI Service
        |
        v
Gemma 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gateway owns the application context and database access.&lt;/p&gt;

&lt;p&gt;The AI service only receives the information it needs for a particular analysis and holds no database credentials.&lt;/p&gt;

&lt;p&gt;That separation means the AI layer can be replaced, mocked or taken offline without taking the scanner itself down.&lt;/p&gt;

&lt;p&gt;If the AI service is unavailable, you can still scan.&lt;/p&gt;

&lt;p&gt;If Neo4j is unavailable, you can still scan.&lt;/p&gt;

&lt;p&gt;The core functionality shouldn't collapse just because one intelligent-looking box decided to have a bad day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes GitHygiene different?
&lt;/h2&gt;

&lt;p&gt;Most dependency scanners answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What is vulnerable?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHygiene tries to answer three more useful questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Does my code actually reach it?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Which of my repositories are affected?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What should I do about it?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the direction we wanted to explore.&lt;/p&gt;

&lt;p&gt;Not replacing security scanners.&lt;/p&gt;

&lt;p&gt;Making their output more useful to the people who actually have to fix the issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't getting an LLM to produce a security verdict.&lt;/p&gt;

&lt;p&gt;It was making sure the verdict deserved to be trusted.&lt;/p&gt;

&lt;p&gt;We learned that grounding matters more than clever prompting, static analysis is useful but isn't proof of safety, and &lt;code&gt;not_evidenced&lt;/code&gt; should never quietly become &lt;code&gt;safe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We also spent a fair amount of time dealing with the realities of building during a hackathon: structured model responses, parsing edge cases, Python compatibility, testing individual AI stages and making sure all the pieces could fail independently without bringing the entire application down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built during Hacktoberfest Hack Day
&lt;/h2&gt;

&lt;p&gt;Everything here was built as part of the Hacktoberfest Hack Day — Coimbatore 2026.&lt;/p&gt;

&lt;p&gt;GitHub authentication and repository import.&lt;br&gt;&lt;br&gt;
Dependency extraction.&lt;br&gt;&lt;br&gt;
OSV vulnerability scanning.&lt;br&gt;&lt;br&gt;
Security scoring.&lt;br&gt;&lt;br&gt;
Static analysis.&lt;br&gt;&lt;br&gt;
Gemma-powered reachability analysis.&lt;br&gt;&lt;br&gt;
Neo4j dependency graphs.&lt;br&gt;&lt;br&gt;
Cross-repository blast radius.&lt;br&gt;&lt;br&gt;
Remediation planning.&lt;br&gt;&lt;br&gt;
GitHub issue generation.&lt;br&gt;&lt;br&gt;
And the dashboard tying it all together.&lt;/p&gt;

&lt;p&gt;A lot of moving parts.&lt;/p&gt;

&lt;p&gt;One slightly obsessive goal:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make dependency security easier to understand.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Tetra4ge/GitHygiene" rel="noopener noreferrer"&gt;https://github.com/Tetra4ge/GitHygiene&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live App:&lt;a href="https://git-hygiene.vercel.app/" rel="noopener noreferrer"&gt;https://git-hygiene.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Devpost: &lt;a href="https://devpost.com/software/githygiene" rel="noopener noreferrer"&gt;https://devpost.com/software/githygiene&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Team TetraFourge
&lt;/h2&gt;

&lt;p&gt;G Prajwal Priyadarshan&lt;br&gt;
Rahul LS&lt;br&gt;
Kishore B&lt;br&gt;
Kabilan &lt;/p&gt;

&lt;p&gt;Built during Hacktoberfest Hack Day — Coimbatore 2026.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>security</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
