<?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: Jorge Cedillo</title>
    <description>The latest articles on DEV Community by Jorge Cedillo (@jorge_cedillo_2602bf089ca).</description>
    <link>https://dev.to/jorge_cedillo_2602bf089ca</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%2F3957025%2Ff9a946c4-b3f2-4cb4-bd3e-0178d94aaad7.png</url>
      <title>DEV Community: Jorge Cedillo</title>
      <link>https://dev.to/jorge_cedillo_2602bf089ca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jorge_cedillo_2602bf089ca"/>
    <language>en</language>
    <item>
      <title>I scanned 8 popular open-source repos for outdated dependencies and CVEs. Here's what I found.</title>
      <dc:creator>Jorge Cedillo</dc:creator>
      <pubDate>Sun, 31 May 2026 17:15:02 +0000</pubDate>
      <link>https://dev.to/jorge_cedillo_2602bf089ca/i-scanned-8-popular-open-source-repos-for-outdated-dependencies-and-cves-heres-what-i-found-9ii</link>
      <guid>https://dev.to/jorge_cedillo_2602bf089ca/i-scanned-8-popular-open-source-repos-for-outdated-dependencies-and-cves-heres-what-i-found-9ii</guid>
      <description>&lt;p&gt;Most developers know their dependencies are probably outdated. Few know by how much.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://scanreq.com" rel="noopener noreferrer"&gt;ScanReq&lt;/a&gt;, a VS Code extension that scans dependency files, checks versions against public registries in real time, and queries &lt;a href="https://osv.dev" rel="noopener noreferrer"&gt;OSV.dev&lt;/a&gt; for known CVEs. It supports 8 ecosystems: Python, Node.js, Rust, Go, PHP, Ruby, and Java (both Maven and Gradle).&lt;/p&gt;

&lt;p&gt;To stress-test it, I pointed it at repos that most developers have heard of. Not toy projects — real, actively maintained codebases with real users.&lt;/p&gt;

&lt;p&gt;Here's what came out.&lt;/p&gt;




&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repo&lt;/th&gt;
&lt;th&gt;Ecosystem&lt;/th&gt;
&lt;th&gt;Outdated&lt;/th&gt;
&lt;th&gt;CVEs&lt;/th&gt;
&lt;th&gt;Notable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/rails/rails" rel="noopener noreferrer"&gt;rails/rails&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;7 (5 HIGH)&lt;/td&gt;
&lt;td&gt;5 HIGH-severity CVEs in &lt;code&gt;rack&lt;/code&gt; alone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/cli/cli" rel="noopener noreferrer"&gt;cli/cli&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;177 modules parsed from &lt;code&gt;go.mod&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/veloren/veloren" rel="noopener noreferrer"&gt;veloren/veloren&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Cargo.lock resolved from workspace root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/spring-projects/spring-petclinic" rel="noopener noreferrer"&gt;spring-petclinic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Java (Maven)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;5 HIGH&lt;/td&gt;
&lt;td&gt;Some CVEs have no patch available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/spring-projects/spring-petclinic" rel="noopener noreferrer"&gt;spring-petclinic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Java (Gradle)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;3 HIGH&lt;/td&gt;
&lt;td&gt;Same project, different build tool, different results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/apt-mirror/apt-mirror2" rel="noopener noreferrer"&gt;apt-mirror2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;pip-compile format with hashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/laravel/laravel" rel="noopener noreferrer"&gt;laravel/laravel&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;phpunit sitting on a major version behind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/nicklockwood/libphonenumber-js" rel="noopener noreferrer"&gt;libphonenumber-js&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;1 HIGH&lt;/td&gt;
&lt;td&gt;CVE in &lt;code&gt;rollup&lt;/code&gt;, a dev dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few things stood out.&lt;/p&gt;




&lt;h2&gt;
  
  
  "Outdated" doesn't mean "broken"
&lt;/h2&gt;

&lt;p&gt;rails/rails shows 89 outdated packages. That sounds alarming until you realize many of those are intentionally pinned by the Rails core team. They know what they're doing.&lt;/p&gt;

&lt;p&gt;The real value isn't in the number — it's in knowing &lt;em&gt;which&lt;/em&gt; ones are outdated and &lt;em&gt;why it matters&lt;/em&gt;. A minor patch bump on a logging library is not the same as a HIGH-severity CVE on &lt;code&gt;rack&lt;/code&gt;, which handles every HTTP request your Rails app processes.&lt;/p&gt;

&lt;p&gt;This is where the raw count is misleading and why I spent time making the results panel show context: severity, version gap, whether a fix exists, and whether it's a major version jump that might include breaking changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frameworks vs. real projects
&lt;/h2&gt;

&lt;p&gt;This is something I learned the hard way while testing. The tool works best on &lt;strong&gt;real-world projects&lt;/strong&gt; — apps, services, CLIs — where dependencies accumulate organically over months or years. Nobody audits their &lt;code&gt;package.json&lt;/code&gt; after every sprint.&lt;/p&gt;

&lt;p&gt;Frameworks and starter templates (like &lt;code&gt;laravel/laravel&lt;/code&gt; or &lt;code&gt;spring-petclinic&lt;/code&gt;) are useful for testing, but they don't reflect reality. They have few dependencies, tightly pinned, maintained by core teams who watch every version bump. The interesting results come from repos where a team shipped features for a year without running a dependency audit.&lt;/p&gt;

&lt;p&gt;If you want to see what ScanReq actually does for you, try it on &lt;em&gt;your&lt;/em&gt; project, not on a template.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual verification test
&lt;/h2&gt;

&lt;p&gt;I wanted to make sure the results weren't just noise, so I did something tedious: I manually verified every single result on &lt;strong&gt;veloren/veloren&lt;/strong&gt; — a Rust game with roughly 60 dependencies.&lt;/p&gt;

&lt;p&gt;For each package, I went to crates.io, checked the latest published version, and compared it with what ScanReq reported. Then for each CVE, I went to osv.dev, looked up the advisory, and confirmed the severity and affected version ranges matched.&lt;/p&gt;

&lt;p&gt;It took me roughly &lt;strong&gt;4 hours&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ScanReq does the same thing in about &lt;strong&gt;8 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you don't trust automated tools (and you shouldn't, blindly), pick any CVE ID from a ScanReq scan and paste it into &lt;a href="https://osv.dev" rel="noopener noreferrer"&gt;osv.dev&lt;/a&gt;. The data is all public. That's the whole point — the tool doesn't have a proprietary database. It queries the same public sources you would, just faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things that were harder than expected
&lt;/h2&gt;

&lt;p&gt;Building a version checker sounds simple until you actually try to parse real-world dependency files. A few things that surprised me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cargo.lock isn't always next to Cargo.toml.&lt;/strong&gt; In Rust workspaces, the lockfile lives at the workspace root, which can be 3, 4, or 5 directories above the crate you're looking at. ScanReq walks up the directory tree to find it. Same story with &lt;code&gt;composer.lock&lt;/code&gt; in PHP monorepos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pip-compile output is hostile.&lt;/strong&gt; It adds trailing backslashes for line continuation and SHA256 hashes after every version. A naive regex that looks for &lt;code&gt;==1.2.3&lt;/code&gt; will grab &lt;code&gt;==1.2.3 \&lt;/code&gt; instead. I had to handle this specifically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ruby Gemfiles can include other Gemfiles.&lt;/strong&gt; The &lt;code&gt;eval_gemfile&lt;/code&gt; directive loads another file recursively. And platform-specific gems (&lt;code&gt;:windows&lt;/code&gt;, &lt;code&gt;:jruby&lt;/code&gt;, &lt;code&gt;%i[mswin mingw]&lt;/code&gt;) need to be filtered out on non-matching platforms, not flagged as unverified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maven BOMs are a version indirection layer.&lt;/strong&gt; Spring Boot projects declare dependencies without versions — those come from a BOM (Bill of Materials) defined elsewhere. You have to download and parse the BOM's &lt;code&gt;&amp;lt;properties&amp;gt;&lt;/code&gt; block before you can even tell if a package is outdated.&lt;/p&gt;

&lt;p&gt;None of this is rocket science, but it's the kind of thing you only discover by testing against real repos, not by reading the spec.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works, briefly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You open a project in VS Code with a supported dependency file (&lt;code&gt;requirements.txt&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;Cargo.toml&lt;/code&gt;, &lt;code&gt;go.mod&lt;/code&gt;, &lt;code&gt;composer.json&lt;/code&gt;, &lt;code&gt;Gemfile&lt;/code&gt;, &lt;code&gt;pom.xml&lt;/code&gt;, or &lt;code&gt;build.gradle&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;ScanReq: Scan dependencies&lt;/code&gt; from the Command Palette.&lt;/li&gt;
&lt;li&gt;ScanReq parses the file, queries the public registry for each package (PyPI, npm, crates.io, proxy.golang.org, Packagist, RubyGems, or Maven Central), and checks OSV.dev for known CVEs.&lt;/li&gt;
&lt;li&gt;Results show in a visual panel inside VS Code: outdated packages, version gaps, CVE details with severity and GHSA links, and smart insights.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything happens locally — the queries go directly from your machine to the public registries. Nothing passes through my servers (except license validation if you're on Pro).&lt;/p&gt;




&lt;h2&gt;
  
  
  Free vs. Pro
&lt;/h2&gt;

&lt;p&gt;The free tier covers all 8 ecosystems, version checking, and CVE detection for exact versions. That's the core of the tool and it's not going away.&lt;/p&gt;

&lt;p&gt;Pro ($19, one-time payment, no subscription) adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE detection for non-exact versions&lt;/strong&gt; — if your &lt;code&gt;requirements.txt&lt;/code&gt; says &lt;code&gt;&amp;gt;=1.2&lt;/code&gt; instead of &lt;code&gt;==1.2.3&lt;/code&gt;, Pro resolves the installed version and checks it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-version compatibility analysis&lt;/strong&gt; — flags conflicts before they break your build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3-phase update plan&lt;/strong&gt; — groups updates by risk level (safe patches → minor bumps → major/breaking) so you don't update everything at once and wonder what broke&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI prompt export&lt;/strong&gt; — one click to copy a structured prompt with your scan results for Claude, Copilot, or Cursor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I went with a one-time payment because I personally hate SaaS subscriptions for developer tools. You pay once, you own it. No tracking, no analytics, no "upgrade to keep your features."&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Install from the VS Code Marketplace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ext install trustdev.scanreq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or visit &lt;a href="https://scanreq.com" rel="noopener noreferrer"&gt;scanreq.com&lt;/a&gt; to see screenshots and demo videos of real scans.&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/JorgeCedilloAbarca/scanreq" rel="noopener noreferrer"&gt;github.com/JorgeCedilloAbarca/scanreq&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run it on your project and find something interesting, I'd genuinely like to hear about it. The best bug reports I've gotten have come from repos with dependency setups I never anticipated.&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
      <category>vscode</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
