<?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: Musa Elkholy</title>
    <description>The latest articles on DEV Community by Musa Elkholy (@zintrivious).</description>
    <link>https://dev.to/zintrivious</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%2F4228941%2Fe849584f-ad49-48e4-8e9f-7a11618401d7.png</url>
      <title>DEV Community: Musa Elkholy</title>
      <link>https://dev.to/zintrivious</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zintrivious"/>
    <language>en</language>
    <item>
      <title>I scanned 163 Terraform repos to find out what a shared module change could affect</title>
      <dc:creator>Musa Elkholy</dc:creator>
      <pubDate>Thu, 05 Nov 2026 16:09:04 +0000</pubDate>
      <link>https://dev.to/zintrivious/i-scanned-163-terraform-repos-to-find-out-what-a-shared-module-change-could-affect-2aa4</link>
      <guid>https://dev.to/zintrivious/i-scanned-163-terraform-repos-to-find-out-what-a-shared-module-change-could-affect-2aa4</guid>
      <description>&lt;p&gt;When you have a few repositories, keeping track of dependencies between them is pretty straightforward.&lt;/p&gt;

&lt;p&gt;But what happens when you have 50, 100, or even 200 repositories?&lt;/p&gt;

&lt;p&gt;Imagine you're about to update a shared Terraform module. Before merging, you want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which repositories are using it?&lt;/li&gt;
&lt;li&gt;Which versions are they using?&lt;/li&gt;
&lt;li&gt;Are there other repositories that depend on those repositories?&lt;/li&gt;
&lt;li&gt;Who might be affected by the change?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub search can help, but manually piecing together all those relationships gets tedious pretty quickly.&lt;/p&gt;

&lt;p&gt;I wanted a way to answer those questions without setting up a service or maintaining a separate dependency catalog.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://github.com/Zintrivious/ripplemap" rel="noopener noreferrer"&gt;RippleMap&lt;/a&gt;&lt;/strong&gt;, an open-source CLI that automatically maps dependencies across repositories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing it on 163 real Terraform repositories
&lt;/h2&gt;

&lt;p&gt;Instead of just testing it on a few example projects, I ran RippleMap against &lt;a href="https://github.com/cloudposse" rel="noopener noreferrer"&gt;Cloud Posse's&lt;/a&gt; public Terraform module repositories.&lt;/p&gt;

&lt;p&gt;The scan covered &lt;strong&gt;163 repositories&lt;/strong&gt; and identified &lt;strong&gt;467 dependency links&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two findings stood out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Changing one module could affect 13 repositories.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, the &lt;code&gt;terraform-aws-security-group&lt;/code&gt; module had 12 directly dependent repositories and one additional indirect dependent in the scan.&lt;/p&gt;

&lt;p&gt;Instead of searching through all 163 repositories manually, I could select that module and see the dependency relationships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. There were 16 internal modules referenced at different versions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some repositories referenced newer module versions, while others were still on older releases.&lt;/p&gt;

&lt;p&gt;That's not automatically a problem. Different versions might be intentional. But it's useful information to have when planning upgrades or investigating unexpected behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  How RippleMap works
&lt;/h2&gt;

&lt;p&gt;RippleMap scans repositories and reads the configuration files already present in them.&lt;/p&gt;

&lt;p&gt;For Terraform, it examines module sources, including registry modules and Git-based references.&lt;/p&gt;

&lt;p&gt;It then builds a graph connecting repositories to the components they depend on.&lt;/p&gt;

&lt;p&gt;The same approach works with other ecosystems, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker and Docker Compose&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;Kubernetes and Helm&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;Go and Python dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can also scan Azure DevOps organizations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying it yourself
&lt;/h2&gt;

&lt;p&gt;You don't need to clone every repository or install a separate server.&lt;/p&gt;

&lt;p&gt;With Node.js 22 or newer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ripplemap scan &lt;span class="nt"&gt;--org&lt;/span&gt; cloudposse &lt;span class="nt"&gt;--match&lt;/span&gt; &lt;span class="s1"&gt;'terraform-*'&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt; examples &lt;span class="nt"&gt;--exclude&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates a dependency graph in &lt;code&gt;ripplemap.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To see which repositories depend on a particular module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ripplemap impact terraform-aws-security-group
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To find shared components referenced at different versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ripplemap drift &lt;span class="nt"&gt;--internal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to open the interactive visualization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ripplemap report &lt;span class="nt"&gt;--open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For larger scans, authenticating with &lt;code&gt;gh auth login&lt;/code&gt; helps avoid GitHub's anonymous API rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about pull requests?
&lt;/h2&gt;

&lt;p&gt;I also added a GitHub Action that can analyze the files changed in a pull request and comment with the repositories that may be affected.&lt;/p&gt;

&lt;p&gt;For example, changing a Terraform module's implementation might affect its consumers, while editing its README shouldn't trigger the same warning.&lt;/p&gt;

&lt;p&gt;The goal is to give developers this information before merging instead of making them run manual searches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;RippleMap uses static analysis. It reads configuration files, not runtime network traffic.&lt;/p&gt;

&lt;p&gt;That means it won't discover every possible service-to-service dependency, and a dependency relationship doesn't necessarily mean a change will break something.&lt;/p&gt;

&lt;p&gt;It also can't resolve every dynamically generated reference.&lt;/p&gt;

&lt;p&gt;I think being transparent about these limitations is important, particularly for a tool intended to help engineers make decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the live demo
&lt;/h2&gt;

&lt;p&gt;If you don't want to install anything, I've published interactive reports using real repository data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://zintrivious.github.io/ripplemap/demo/cloudposse/#repo=cloudposse%2Fterraform-aws-security-group" rel="noopener noreferrer"&gt;Explore the Cloud Posse dependency graph&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can select modules, inspect dependencies, and explore version drift directly in your browser.&lt;/p&gt;

&lt;p&gt;The project is free, open source, and MIT licensed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Zintrivious/ripplemap" rel="noopener noreferrer"&gt;https://github.com/Zintrivious/ripplemap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/ripplemap" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/ripplemap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd especially appreciate feedback from developers managing multiple repositories. If you try RippleMap on your own projects, I'd love to know where its dependency detection gets things wrong or misses relationships.&lt;/p&gt;

&lt;p&gt;Those real-world cases are the most useful feedback I could get.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>devops</category>
      <category>terraform</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
