<?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>Forem: Shivansh Soni</title>
    <description>The latest articles on Forem by Shivansh Soni (@shivanshsoni).</description>
    <link>https://forem.com/shivanshsoni</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%2F1755244%2Ffdb3229f-3d49-487c-992b-5ef12ebbdee0.webp</url>
      <title>Forem: Shivansh Soni</title>
      <link>https://forem.com/shivanshsoni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/shivanshsoni"/>
    <language>en</language>
    <item>
      <title>I Built CodeContext: An AI-Powered Tool That Analyzes Any Codebase in Seconds</title>
      <dc:creator>Shivansh Soni</dc:creator>
      <pubDate>Mon, 15 Dec 2025 17:35:10 +0000</pubDate>
      <link>https://forem.com/shivanshsoni/i-built-codecontext-an-ai-powered-tool-that-analyzes-any-codebase-in-seconds-1c1o</link>
      <guid>https://forem.com/shivanshsoni/i-built-codecontext-an-ai-powered-tool-that-analyzes-any-codebase-in-seconds-1c1o</guid>
      <description>&lt;p&gt;I built an open-source CLI tool that uses AI and graph algorithms to help developers understand unfamiliar codebases 10x faster. It generates interactive dependency maps, detects critical files, and creates personalized learning paths.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/sonii-shivansh/CodeContext" rel="noopener noreferrer"&gt;github.com/sonii-shivansh/CodeContext&lt;/a&gt;   &lt;br&gt;
⭐&lt;strong&gt;Give it a star if you find it useful!&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 The Problem I Was Solving
&lt;/h2&gt;

&lt;p&gt;We've all been there: You join a new team, clone a massive repository, and spend weeks trying to figure out where anything is. You ask senior developers the same questions everyone asks: "Where's the authentication logic?", "Which file should I start with?", "What depends on what?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The brutal reality:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New developers take &lt;strong&gt;1-3 months&lt;/strong&gt; to become productive&lt;/li&gt;
&lt;li&gt;Only &lt;strong&gt;12%&lt;/strong&gt; of companies do onboarding well&lt;/li&gt;
&lt;li&gt;Poor onboarding costs &lt;strong&gt;$240,000+&lt;/strong&gt; per senior developer annually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existing tools like Sourcegraph are expensive, and Backstage requires complex infrastructure. I wanted something &lt;strong&gt;simple, fast, and free&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 The Solution: CodeContext
&lt;/h2&gt;

&lt;p&gt;CodeContext is a Kotlin-based CLI tool that analyzes your codebase and generates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;🗺️ Interactive Dependency Graphs&lt;/strong&gt; - Visualize your entire codebase structure with D3.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔥 Knowledge Hotspots&lt;/strong&gt; - PageRank algorithm identifies the most critical files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎓 Learning Paths&lt;/strong&gt; - Topologically sorted "start here" reading order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤖 AI Insights&lt;/strong&gt; - Optional Claude integration for code explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Team Contribution Maps&lt;/strong&gt; - Identify knowledge silos and bus factor risks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⏳ Temporal Analysis&lt;/strong&gt; - Track codebase evolution over time&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Quick Demo
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install &lt;/span&gt;
git clone https://github.com/sonii-shivansh/CodeContext.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CodeContext
./gradlew installDist

&lt;span class="c"&gt;# Analyze any Java/Kotlin project&lt;/span&gt;
./build/install/codecontext/bin/codecontext analyze /path/to/project

&lt;span class="c"&gt;# View interactive reportopen &lt;/span&gt;
output/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚀 Starting CodeContext analysis...
📂 Scanning repository...
   Found 247 files
🧠 Parsing code...
🕸️ Building dependency graph...
🗺️ Your Codebase Map
├─ 🔥 Hot Zones (Top 5):
│ ├─ UserService.kt (0.0847)
│ ├─ DatabaseConfig.kt (0.0623)
│ └─ ApiController.kt (0.0498)
✅ Report: output/index.html
✨ Complete in 3.2s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🏗️ Technical Deep Dive
&lt;/h2&gt;

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

&lt;p&gt;CodeContext is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kotlin 2.1.0&lt;/strong&gt; - Modern, concise, type-safe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JGraphT&lt;/strong&gt; - Graph algorithms (PageRank, topological sort)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaParser&lt;/strong&gt; - AST parsing for Java&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JGit&lt;/strong&gt; - Git history analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D3.js&lt;/strong&gt; - Interactive visualizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ktor&lt;/strong&gt; - Optional REST API server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude AI&lt;/strong&gt; - Optional AI-powered insights&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Parallel File Scanning&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;parseFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;):&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ParsedFile&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;coroutineScope&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chunked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="nf"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dispatchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;cacheManager&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;getCachedParse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;awaitAll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We use Kotlin coroutines to parse files in parallel, with intelligent caching to avoid re-parsing unchanged files.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Dependency Graph Construction&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Build fully-qualified class names&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;classMap&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsedFiles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;associate&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;fqcn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"${parsed.packageName}.${parsed.file.nameWithoutExtension}"&lt;/span&gt;
    &lt;span class="n"&gt;fqcn&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;absolutePath&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Create edges from imports&lt;/span&gt;
&lt;span class="n"&gt;parsedFiles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;classMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;targetPath&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;absolutePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targetPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. &lt;strong&gt;PageRank for Hotspot Detection&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;pageRank&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PageRank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// damping, iterations&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vertexSet&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;vertex&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;pageRankScores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pageRank&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVertexScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vertex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Files with high PageRank scores are central to the codebase - change them and many files are affected.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Topological Sort for Learning Paths&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;iterator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TopologicalOrderIterator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mutableListOf&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;span class="n"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEachRemaining&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Dependencies first&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read files in dependency order: understand foundations before complex modules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling Cycles
&lt;/h3&gt;

&lt;p&gt;Real codebases have circular dependencies. We detect cycles and gracefully fall back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;detector&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CycleDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detectCycles&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Fallback: sort by fewest dependencies&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vertexSet&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;sortedBy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;outDegreeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Git History Optimization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Naive approach:&lt;/strong&gt; Run &lt;code&gt;git log &amp;lt;file&amp;gt;&lt;/code&gt; for each file → &lt;strong&gt;Slow&lt;/strong&gt; (1000 files = 1000 git calls)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our approach:&lt;/strong&gt; Single-pass diff analysis across commits → &lt;strong&gt;Fast&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;commits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;commits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;diffs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setOldTree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prepareTreeParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setNewTree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;prepareTreeParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;// Process all changed files in one pass&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Testing Strategy
&lt;/h2&gt;

&lt;p&gt;We wrote &lt;strong&gt;19+ comprehensive tests&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Property-Based Tests&lt;/strong&gt; (Kotest)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="s"&gt;"LearningPathGenerator should handle random dependency trees"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;checkAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Arb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Arb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringPattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[a-z]{5}"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;graph&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildRandomGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// Verify: no crashes, all files included&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Stress Tests&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Analyze 1000 files with complex dependencies"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;files&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateComplexDependencies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;graph&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTopHotspots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;isNotEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Backend Verification&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We use CodeContext to &lt;strong&gt;analyze itself&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;files&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;graph&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Verify: ImprovedAnalyzeCommand → RobustDependencyGraph edge exists&lt;/span&gt;
&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;containsEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;analyzeCommand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dependencyGraph&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎨 The Report Output
&lt;/h2&gt;

&lt;p&gt;The HTML report includes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Interactive Dependency Graph
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Zoom, pan, and explore relationships&lt;/li&gt;
&lt;li&gt;Hover to see file details, authors, change frequency&lt;/li&gt;
&lt;li&gt;Click to highlight dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team Contribution Map
&lt;/h3&gt;

&lt;p&gt;Identifies knowledge silos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;👥 Team Contribution Map
Developer Files Modified
Alice 156
Bob 89
Charlie 12 ⚠️ Bus factor risk!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Personalized Learning Path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🎓 Learning Path for Backend Developers

Week 1: Foundation
├─ Models.kt [Fundamental]
├─ Utils.kt [Fundamental]
└─ Task: Add a new data model

Week 2: Core Services
├─ UserService.kt [Hotspot! 0.8542]
├─ DatabaseConfig.kt [Core Logic]
└─ Task: Trace the authentication flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Advanced Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AI-Powered Code Insights
&lt;/h3&gt;

&lt;p&gt;With Claude API integration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codecontext ask &lt;span class="s2"&gt;"Where is the authentication logic?"&lt;/span&gt;


💡 Based on the analysis, authentication is handled &lt;span class="k"&gt;in&lt;/span&gt;:
   - AuthMiddleware.kt &lt;span class="o"&gt;(&lt;/span&gt;intercepts requests&lt;span class="o"&gt;)&lt;/span&gt;
   - UserService.kt &lt;span class="o"&gt;(&lt;/span&gt;validates credentials&lt;span class="o"&gt;)&lt;/span&gt;
   - TokenManager.kt &lt;span class="o"&gt;(&lt;/span&gt;generates JWT tokens&lt;span class="o"&gt;)&lt;/span&gt;


📁 Check these files:
   - src/auth/AuthMiddleware.kt
   - src/services/UserService.kt

🎯 Confidence: 92%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  REST API Server Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codecontext serve &lt;span class="nt"&gt;--port&lt;/span&gt; 8080

&lt;span class="c"&gt;# POST /analyze&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080/analyze &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"repoPath": "/path/to/repo"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect for CI/CD integration!&lt;/p&gt;

&lt;h3&gt;
  
  
  Temporal Analysis
&lt;/h3&gt;

&lt;p&gt;Track codebase evolution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codecontext evolution &lt;span class="nt"&gt;--months&lt;/span&gt; 6 &lt;span class="nt"&gt;--interval&lt;/span&gt; 30


📈 Evolution Report:
2024-06-15 | Files: 120 | Lines: 6,000
2024-07-15 | Files: 145 | Lines: 7,250
2024-08-15 | Files: 180 | Lines: 9,000
...
📊 Net Growth: 50%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📊 Performance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Benchmarks on Spring PetClinic (247 files):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scanning: 0.3s&lt;/li&gt;
&lt;li&gt;Parsing: 1.2s&lt;/li&gt;
&lt;li&gt;Graph building: 0.8s&lt;/li&gt;
&lt;li&gt;Git analysis: 0.9s&lt;/li&gt;
&lt;li&gt;Report generation: 0.2s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total: 3.4s&lt;/strong&gt; ⚡&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With caching, subsequent runs: &lt;strong&gt;&amp;lt; 1s&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 What's Next
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Short-term (v0.2.0)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] TypeScript/JavaScript support&lt;/li&gt;
&lt;li&gt;[ ] Python support&lt;/li&gt;
&lt;li&gt;[ ] IntelliJ IDEA plugin&lt;/li&gt;
&lt;li&gt;[ ] VS Code extension&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Medium-term (v1.0.0)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Multi-language support (Go, Rust, C#)&lt;/li&gt;
&lt;li&gt;[ ] Code complexity metrics&lt;/li&gt;
&lt;li&gt;[ ] Security vulnerability detection&lt;/li&gt;
&lt;li&gt;[ ] Custom report templates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Long-term
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Hosted SaaS version (no installation required)&lt;/li&gt;
&lt;li&gt;[ ] GitHub App integration&lt;/li&gt;
&lt;li&gt;[ ] Real-time collaboration features&lt;/li&gt;
&lt;li&gt;[ ] IDE-native experience&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Contribute!
&lt;/h2&gt;

&lt;p&gt;CodeContext is &lt;strong&gt;open-source (MIT License)&lt;/strong&gt;. We welcome contributions!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good first issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add support for TypeScript&lt;/li&gt;
&lt;li&gt;Improve error messages&lt;/li&gt;
&lt;li&gt;Create video tutorials&lt;/li&gt;
&lt;li&gt;Write integration tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to contribute:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fork the repo&lt;/li&gt;
&lt;li&gt;Create a feature branch&lt;/li&gt;
&lt;li&gt;Add tests&lt;/li&gt;
&lt;li&gt;Submit a PR&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💭 Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Start with the Problem, Not the Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I spent 2 weeks validating the problem before writing code. Talked to 20+ developers about their onboarding pain points.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Ship Fast, Iterate Faster&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The first version took 4 weeks. I could've spent 6 months adding features, but shipping early got real user feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Testing is Non-Negotiable&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Property-based tests caught 3 critical bugs in graph cycle handling that I would've never found manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Documentation Sells&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A great README with screenshots and examples gets more stars than perfect code without docs.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Open Source is a Marathon&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Building the tool is 20% of the work. Marketing, docs, support, and community building is 80%.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 Try It Today!
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/sonii-shivansh/CodeContext.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CodeContext
./gradlew installDist
./build/install/codecontext/bin/codecontext analyze &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⭐ Star the repo if you find it useful!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🐛 Report issues:&lt;/strong&gt; &lt;a href="https://github.com/sonii-shivansh/CodeContext/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;💬 Join the discussion:&lt;/strong&gt; &lt;a href="https://github.com/sonii-shivansh/CodeContext/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/sonii-shivansh/CodeContext" rel="noopener noreferrer"&gt;github.com/sonii-shivansh/CodeContext&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://github.com/sonii-shivansh/CodeContext/blob/main/docs/API.md" rel="noopener noreferrer"&gt;API Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo Video:&lt;/strong&gt; YouTube &lt;em&gt;(coming soon)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Landing Page:&lt;/strong&gt; codecontext.dev &lt;em&gt;(coming soon)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙏 Acknowledgments
&lt;/h2&gt;

&lt;p&gt;Built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kotlin ❤️&lt;/li&gt;
&lt;li&gt;JGraphT for graph algorithms&lt;/li&gt;
&lt;li&gt;JavaParser for AST parsing&lt;/li&gt;
&lt;li&gt;D3.js for visualizations&lt;/li&gt;
&lt;li&gt;Claude AI for code insights&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;What do you think? Would this solve your codebase onboarding problems?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop a comment below! I'd love to hear your feedback and answer any questions. 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you enjoyed this post, follow me for more deep dives into developer tools and productivity hacks!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
